lateinit 属性 androidInjector 尚未初始化 Dagger 2
lateinit property androidInjector has not been initialized Dagger 2
我有这样的应用程序
class App : Application() , HasAndroidInjector {
lateinit var application: Application
@Inject
lateinit var androidInjector : DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> = androidInjector
override fun onCreate() {
super.onCreate()
this.application = this
}
}
然后我有 AppComponent
@Singleton
@Component(
modules = [
AndroidSupportInjectionModule::class,
LoginModule::class
]
)
interface AppComponent : AndroidInjector<App> {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: App): AppComponent
}
}
登录模块是这个
@Module
abstract class LoginModule {
@ContributesAndroidInjector(modules = [LoginDependencies::class])
abstract fun bindLoginFragment(): LoginFragment
}
并且在 Fragment
的 onViewCreated
中我使用
AndroidSupportInjection.inject(this)
我也试过将它添加到 onAttach()
但它不起作用。添加
后它开始崩溃
@Inject
lateinit var loginPresenter: LoginContract.Presenter
如果我删除它,它说的和问题一样,如果我离开演示者,它说预置器没有被初始化。
我遗漏了什么吗?
编辑
我在哪里收到这个错误
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property androidInjector has not been initialized
override fun androidInjector(): AndroidInjector<Any> = androidInjector
那我也明白了
at com.testing.login.login.presentation.LoginFragment.onRequestInjection(LoginFragment.kt:31)
AndroidSupportInjection.inject(this)
这个 onRequestInjection
在 onViewCreated
中的 AbstractFragment
我也试过把它放在 onAttach()
但没有任何改变。
我的 build.gradle
包含:
这个在 :app
api(LibrariesDependencies.DAGGER)
api(LibrariesDependencies.DAGGER_ANDROID)
api(LibrariesDependencies.DAGGER_ANDROID_SUPPORT)
kapt LibrariesDependencies.DAGGER_ANDROID_KAPT
kapt LibrariesDependencies.DAGGER_KAPT
kapt LibrariesDependencies.DAGGER_ANNOTATION_PROCESSOR
以及:登录
api(LibrariesDependencies.DAGGER)
api(LibrariesDependencies.DAGGER_ANDROID)
api(LibrariesDependencies.DAGGER_ANDROID_SUPPORT)
kapt LibrariesDependencies.DAGGER_ANDROID_KAPT
kapt LibrariesDependencies.DAGGER_KAPT
kapt LibrariesDependencies.DAGGER_ANNOTATION_PROCESSOR
未初始化的属性是否发生在App
class中?
如果是这样,这可能意味着您在 App
class.
的 onCreate
方法中缺少以下内容
DaggerAppComponent
.factory()
.create(this)
.inject(this)
在您的应用程序 class 中,您定义了一个 @Inject
属性,但您没有在任何地方初始化它。您需要做的是:首先将 App
声明为 入口点 用于 Dagger-Android 用途:
interface AppComponent : AndroidInjector<App> {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: App): AppComponent
}
fun inject(app: App) // Let Dagger know your Application class with root dispatching injector
}
然后实际创建 AppComponent
实例并将其用于 bootstrap Dagger 并注入 DispatchingAndroidInjector
实例:
override fun onCreate() {
super.onCreate()
this.application = this
DaggerAppComponent.factory().create(this).inject(this)
}
我有这样的应用程序
class App : Application() , HasAndroidInjector {
lateinit var application: Application
@Inject
lateinit var androidInjector : DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> = androidInjector
override fun onCreate() {
super.onCreate()
this.application = this
}
}
然后我有 AppComponent
@Singleton
@Component(
modules = [
AndroidSupportInjectionModule::class,
LoginModule::class
]
)
interface AppComponent : AndroidInjector<App> {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: App): AppComponent
}
}
登录模块是这个
@Module
abstract class LoginModule {
@ContributesAndroidInjector(modules = [LoginDependencies::class])
abstract fun bindLoginFragment(): LoginFragment
}
并且在 Fragment
的 onViewCreated
中我使用
AndroidSupportInjection.inject(this)
我也试过将它添加到 onAttach()
但它不起作用。添加
@Inject
lateinit var loginPresenter: LoginContract.Presenter
如果我删除它,它说的和问题一样,如果我离开演示者,它说预置器没有被初始化。
我遗漏了什么吗?
编辑
我在哪里收到这个错误
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property androidInjector has not been initialized
override fun androidInjector(): AndroidInjector<Any> = androidInjector
那我也明白了
at com.testing.login.login.presentation.LoginFragment.onRequestInjection(LoginFragment.kt:31)
AndroidSupportInjection.inject(this)
这个 onRequestInjection
在 onViewCreated
中的 AbstractFragment
我也试过把它放在 onAttach()
但没有任何改变。
我的 build.gradle
包含:
这个在 :app
api(LibrariesDependencies.DAGGER)
api(LibrariesDependencies.DAGGER_ANDROID)
api(LibrariesDependencies.DAGGER_ANDROID_SUPPORT)
kapt LibrariesDependencies.DAGGER_ANDROID_KAPT
kapt LibrariesDependencies.DAGGER_KAPT
kapt LibrariesDependencies.DAGGER_ANNOTATION_PROCESSOR
以及:登录
api(LibrariesDependencies.DAGGER)
api(LibrariesDependencies.DAGGER_ANDROID)
api(LibrariesDependencies.DAGGER_ANDROID_SUPPORT)
kapt LibrariesDependencies.DAGGER_ANDROID_KAPT
kapt LibrariesDependencies.DAGGER_KAPT
kapt LibrariesDependencies.DAGGER_ANNOTATION_PROCESSOR
未初始化的属性是否发生在App
class中?
如果是这样,这可能意味着您在 App
class.
onCreate
方法中缺少以下内容
DaggerAppComponent
.factory()
.create(this)
.inject(this)
在您的应用程序 class 中,您定义了一个 @Inject
属性,但您没有在任何地方初始化它。您需要做的是:首先将 App
声明为 入口点 用于 Dagger-Android 用途:
interface AppComponent : AndroidInjector<App> {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: App): AppComponent
}
fun inject(app: App) // Let Dagger know your Application class with root dispatching injector
}
然后实际创建 AppComponent
实例并将其用于 bootstrap Dagger 并注入 DispatchingAndroidInjector
实例:
override fun onCreate() {
super.onCreate()
this.application = this
DaggerAppComponent.factory().create(this).inject(this)
}