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

2 Solutions collect form web for “Dagger2不注入”

既然你没有在这里使用构造器注入(你不能这样做,因为你没有“拥有”这个活动的构造函数)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) ... 
  • 如何设置文本,焦点,在与Kotlin Android的editText错误
  • 请参阅Kotlin中的Generic类型
  • 如何切换FAB与另一FAB的可见性
  • 有没有办法用Kotlin的Exposed库运行原始的sql
  • 如何将这个Java类重写为Kotlin数据类?
  • 我怎样才能禁用Kotlin的onTouch
  • 如何在运行时编译和使用Kotlin代码?
  • 如何从命令行(使用kotlinc)使用kapt?
  • Kotlin:内联lambda和重载解析模糊
  • Kotlin:跳过协程
  • 实现Java接口 - Kotlin
  • Kotlin language will be the best programming language for Android.