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)
在您的SplashActivity
的onCreate()
方法中(当然,在使用演示者之前)。
其次,您的演示者需要一个构造函数来告诉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) ...