свойство lateinit androidInjector не было инициализировано Dagger 2 - PullRequest
0 голосов
/ 11 марта 2020

У меня есть приложение, подобное этому

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
    }
}

LoginModule это

@Module
abstract class LoginModule {

    @ContributesAndroidInjector(modules = [LoginDependencies::class])
    abstract fun bindLoginFragment(): LoginFragment
}

И в onViewCreated из Fragment Я использую

AndroidSupportInjection.inject(this)

Я также пытался добавить его на onAttach(), но он не работает. Он начал ломать sh, как только я добавил

@Inject
lateinit var loginPresenter: LoginContract.Presenter

Если я удаляю его, он говорит так же, как вопрос, если я оставляю докладчика, он говорит, что preseter не инициализируется.

Что-то мне не хватает?

Редактировать

Откуда я получаю эту ошибку

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property androidInjector has not been initialized

override fun androidInjector(): AndroidInjector<Any> = androidInjector

Тогда я получаю это также

на com.testing.login.login.presentation.LoginFragment.onRequestInjection (LoginFragment.kt: 31)

AndroidSupportInjection.inject(this)

Это onRequestInjection в AbstractFragment в onViewCreated, также я пытался поставить его на 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

Ответы [ 2 ]

1 голос
/ 11 марта 2020

В своем классе приложения вы определяете свойство @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 Кинжал и введите DispatchingAndroidInjector экземпляр:

override fun onCreate() {
  super.onCreate()
  this.application = this

  DaggerAppComponent.factory().create(this).inject(this)
}
1 голос
/ 11 марта 2020

Имеется ли свойство, которое не было инициализировано, в классе App? Если это так, это, вероятно, означает, что вам не хватает следующего в методе onCreate класса App.

DaggerAppComponent
            .factory()
            .create(this)
            .inject(this)
...