Я безуспешно пытался вставить родительский фрагмент в его субфрагменты для целей навигации.Я проследил пару разных постов, но не могу понять, что мне не хватает в моей реализации.
У меня есть MainActivity
, который содержит ViewPager
с одной такой страницей, содержащей EventsFragment
,Этот фрагмент в свою очередь имеет два дочерних фрагмента EventsListFragment
и EventsDetailFragment
.Я хотел вставить фрагмент EventsFragment
в EventsListFragment
, чтобы я мог сказать ему перейти к EventsDetailFragment
.
Я знаю, что это, вероятно, повторение постов ниже, и я действительно извиняюсь за это, но я, честно говоря, не вижу, что мне не хватает.Вот те посты, которые я нашел:
Моя реализация выглядит следующим образом:
ApplicationComponent
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
ActivityModule::class,
BaseApplicationModule::class,
ApplicationModule::class])
interface ApplicationComponent : AndroidInjector<AndroidApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<AndroidApplication>()
}
ActivityModule
@Module(includes = [MainActivityProvider::class])
abstract class ActivityModule{
}
MainActivityProvider
@Module(includes = [EventsFragmentProvider::class])
abstract class MainActivityProvider {
@PerActivity
@ContributesAndroidInjector(modules = [MainActivityModule::class])
abstract fun provideMainActivityFactory(): MainActivity
}
EventsFragmentProvider
@Module(includes = [EventsListProvider::class,
EventsDetailProvider::class])
abstract class EventsFragmentProvider {
@PerFragment
@ContributesAndroidInjector(modules = [EventsFragmentModule::class])
abstract fun provideEventsFragmentFactory(): EventsFragment
}
EventsFragmentModule
@Module
class EventsFragmentModule {
@Binds
abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}
EventsListProvider
@Module
abstract class EventsListProvider {
@PerFragment
@ContributesAndroidInjector(modules = [EventsListModule::class])
abstract fun provideEventsListFragmentFactory(): EventsListFragment
}
EventsFragment
class EventsFragment : DaggerFragment(), EventContract.Flow {
override fun navigateToList() {
addFragment(navigator.getEventsListFragment(context!!))
}
override fun navigateToDetail(id: String) {
println("id = ${id}")
}
...
}
EventContract
interface EventContract {
interface Flow {
fun navigateToList()
fun navigateToDetail(id: String)
}
}
EventsListFragment
class EventsListFragment : DaggerFragment() {
@Inject
lateinit var eventsFlow: EventContract.Flow
...
}
Ошибка
[Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] EventContract.Flow cannot be provided without an @Provides-annotated method.
public abstract interface ApplicationComponent extends dagger.android.AndroidInjector<AndroidApplication> {
^
EventContract.Flow is injected at
EventsListFragment.eventsFlow
EventsListFragment is injected at
dagger.android.AndroidInjector.inject(T)
component path: ApplicationComponent →EventsListProvider_ProvideEventsListFragmentFactory.EventsListFragmentSubcomponent
Возможно, я использую анти-шаблон, но это то, что заставило меня работатьк этому моменту.Я открыт для изменений, которые могут помочь мне достичь этого