我是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属性演示器尚未初始化,这意味着“Inject”不起作用
答案 0 :(得分:2)
因为你没有在这里使用构造函数注入(你不能,因为你没有'拥有'活动的构造函数)Dagger不知道它必须向你的Activity
注入一些东西。
你必须像这样手动注入:
(applicationContext as App).appComponent.inject(this)
在SplashActivity
的{{1}}方法中(当然,在使用演示者之前)。
其次,您的演示者需要一个构造函数来告诉Dagger如何构建/“构建”演示者,这意味着使用onCreate()
注释注释的构造函数,所以:
@Inject
答案 1 :(得分:1)
你忘了注入SplashActivity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
App.appComponent.inject(this)
setContentView(R.layout.activity_splash)
...