Dagger2不注入

我是Android的新手,并尝试使用Dagger2。 我花了整夜,仍然不知道为什么我的匕首不提供主持人。 这里是我的代码(我使用Kotlin)

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属性演示程序尚未初始化,这意味着“注入”不起作用

既然你没有在这里使用构造器注入(你不能这样做,因为你没有“拥有”这个活动的构造函数)Dagger并不知道它必须向你的Activity注入某些东西。 你必须像这样手动注入:

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

在您的SplashActivityonCreate()方法中(当然,在使用演示者之前)。

其次,您的演示者需要一个构造函数来告诉Dagger如何构建/“构建”演示者,这意味着使用@Inject注释进行注释的构造函数,所以:

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

你忘了注入SplashActivity:

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