2017-09-24 89 views
1

我是一個Android的新手,並試圖使用Dagger2。我花了整晚,仍然不知道爲什麼我的匕首不提供主持人。這裏是我的代碼(我用的科特林)Dagger2沒有注入

AppComponent

@Singleton 
@Component(modules = arrayOf(PresenterModule::class)) 
interface AppComponent { 

    fun inject(target: SplashActivity) 

} 

PresenterModule

@Module 
class PresenterModule { 

    @Provides 
    @Singleton 
    fun provideSplashPresenter(): SplashPresenter { 
     return SplashPresenter() 
    } 
} 

應用

class App: Application() { 

    companion object { 
     lateinit var appComponent: AppComponent 
    } 

    override fun onCreate() { 
     super.onCreate() 
     appComponent = initDagger() 
    } 

    private fun initDagger(): AppComponent { 
     return DaggerAppComponent.create() 
    } 
} 

這是主持人

class SplashPresenter: BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter { 

    override fun performToast(mess: String) { 
     logi("abc", "performToast") 
     logi("abc", "mess: " + mess) 
     mView?.showLoading() 
     if (mess.isNullOrBlank()) { 
      mView?.showTosat("this is empty mess") ?: logi("abc", "null") 
     } else { 
      mView?.showTosat(mess) ?: logi("abc", "null") 
     } 
     mView?.hideLoading() 

    } 
} 

最後,這是我SplashActivity

class SplashActivity : BaseActivity(), SplashContract.View { 


    @Inject 
    lateinit var presenter: SplashPresenter 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_splash) 

     presenter.attachView(this) 

     //TODO: check log in 
     //TODO: If logged in => start main screen 
     //TODO: If not logged in => load login activity 

     button.setOnClickListener{ 
      presenter.performToast(editText.text.toString()) 
      logi("abc", "perform clicked") 
     } 
    } 
} 

當我運行這些代碼,我得到這個錯誤 Lateinit財產主持人尚未初始化,這意味着「注入」不起作用

回答

2

由於你在這裏沒有使用構造器注入(你不能,因爲你不'擁有'該活動的構造函數)Dagger並不知道它必須注入一些東西到你的Activity。 你有這樣的手動注入:

(applicationContext as App).appComponent.inject(this) 

SplashActivityonCreate()方法(當然使用的主持人,之前)。

其次,你的主持人需要一個構造函數,告訴匕首如何構建/「建設」的演講,這意味着與@Inject註解的構造,所以:

class SplashPresenter @Inject constructor(): BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter 
1

你忘了注入SplashActivity:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    App.appComponent.inject(this) 
    setContentView(R.layout.activity_splash) 
    ...