Я столкнулся со следующей проблемой при добавлении 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)
Но это также не помогло