Свойства объекта lateinit не были инициализированы через Dagger - PullRequest
1 голос
/ 02 июля 2019

Я столкнулся со следующей проблемой при добавлении Dagger в свой проект.Я прочитал несколько статей, где было написано, что все строки, подобные этой:

private val presenter = FavoritesPresenter()

должны быть заменены на DI.Пожалуйста, поправьте меня, если я ошибаюсь, и это неправильно.Я создал для него специальный компонент:

AppComponent:

@Component(
        modules = [FavoritesModule::class]
)
interface AppComponent: AndroidInjector<TraktTvApp>{

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: TraktTvApp): Builder

        fun build(): AppComponent

    }

}

и Модуль:

FavoritesModule

@Module
abstract class FavoritesModule {

    @Binds
    abstract fun favoritesPresenter(favoritesPresenter: FavoritesPresenter): FavoritesContract.FavoritesPresenter

}

. Таким образом я пытаюсь создать новый экземпляр Presenter. Возможно, я не понимаюнеобходимость таких параметров, но когда я пытался изменить подпись следующим образом:

abstract fun favoritesPresenter(): FavoritesPresenter

мое приложение зависало во время компиляции.

А теперь мой фрагмент, где у меня была строка

private val presenter = FavoritesPresenter()

выглядит так:


class FavoritesFragment : Fragment(), FavoritesContract.FavoritesView, MoviesAdapter.OnItemClickListener {

    @Inject
    lateinit var presenter:FavoritesPresenter

*other code*
}

Но когда я запускаю свое приложение, у меня возникает следующее исключение:

kotlin.UninitializedPropertyAccessException: средство представления свойства lateinit не имеетбыл инициализирован в com.mikhailovskii.trakttv.ui.flected.FovingFragment.onViewCreated (FavoritesFragment.kt: 41) в androidx.fragment.app.FragmentManagerImpl.moveToState (FragmentManager.java:1471) в androidx.fragment.app.FragmentMoveFanItateFan(FragmentManager.java:1784) в androidx.fragment.app.FragmentManagerImpl.moveToState (FragmentManager.java:1852) в androidx.fragment.app.BackStackRecord.executeOps (BackStackRecord.java:802) по адресу.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManager.java:2366) в androidx.fragment.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:2273) в androidx.fragment.app.FragmentManager.jp (FragManagerImpl $).Handler.handleCallback (Handler.java:873) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:193) на android.app.ActivityThread.main (ActivityThread.java:6669) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

Итак, что я сделал не так и как правильно решить эту проблему?

UPD

А вот код моего докладчика:

class FavoritesPresenter @Inject constructor() : BasePresenter<FavoritesContract.FavoritesView>(), FavoritesContract.FavoritesPresenter, HasSupportFragmentInjector {

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return fragmentDispatchingAndroidInjector
    }

    @Inject
    lateinit var fragmentDispatchingAndroidInjector:DispatchingAndroidInjector<Fragment>
}

UPD 2

Я добавилследующие методы для AppComponent:

override fun inject(application: TraktTvApp)

fun inject(fragment: Fragment)

Но это также не помогло

1 Ответ

0 голосов
/ 03 июля 2019
override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return fragmentDispatchingAndroidInjector
    }

    @Inject
    lateinit var fragmentDispatchingAndroidInjector:DispatchingAndroidInjector<Fragment>
}

Этот код должен находиться в вашем фрагменте, а не в Presenter, поскольку Presenter является зависимостью для фрагмента.

...