Android Dagger将父片段转换为子片段

Android Dagger将父片段转换为子片段,android,android-fragments,dagger-2,dagger,Android,Android Fragments,Dagger 2,Dagger,我一直试图将父片段注入其子片段以用于导航,但没有成功。我关注了几个不同的帖子,但我似乎不明白我在实现中遗漏了什么 我有一个MainActivity,它包含一个ViewPager,其中一个这样的页面包含EventsFragment。这个片段又有两个子片段EventsListFragment和EventsDetailFragment。我想将EventsFragment片段注入EventsListFragment,这样我就可以告诉它导航到EventsDetailFragment 我知道这可能是下面帖子

我一直试图将父片段注入其子片段以用于导航,但没有成功。我关注了几个不同的帖子,但我似乎不明白我在实现中遗漏了什么

我有一个MainActivity,它包含一个ViewPager,其中一个这样的页面包含EventsFragment。这个片段又有两个子片段EventsListFragment和EventsDetailFragment。我想将EventsFragment片段注入EventsListFragment,这样我就可以告诉它导航到EventsDetailFragment

我知道这可能是下面帖子的重复,我真的为此道歉,但我真的看不出我遗漏了什么。以下是我找到的帖子:

我的执行情况如下:

应用组件

主活动提供程序

EventsFragmentProvider

EventsFragmentModule

事件提供程序

事件碎片

事件合同

事件片段

错误
我可能在使用反模式,但这正是我工作到这一点的原因。我愿意接受可能有助于我实现此目标的更改

错误是由以下模块引起的:

@Module
class EventsFragmentModule {
     @Binds
     abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}
匕首不会为你们提供碎片,你们不应该这样做

此外,我认为您误解了@contributesandroid的含义。这意味着为您创建一个AndroidJector,但要证明一个实例

@Module
abstract class EventsListProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsListModule::class])
    abstract fun provideEventsListFragmentFactory(): EventsListFragment
}

因此,您应该像这样将EventsFragment实例传递到模块中,而不是使用字段注入。

错误是什么?抱歉,刚刚添加了错误您的EventsListFragment需要一个EventContract.Flow。因此,必须将能够提供EventContract.Flow EventsFragmentModule的模块添加到该片段的@ContributesAndroidInjector模块中。也就是说,我不确定它将如何工作
@Module(includes = [EventsFragmentProvider::class])
abstract class MainActivityProvider {
    @PerActivity
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    abstract fun provideMainActivityFactory(): MainActivity
}
@Module(includes = [EventsListProvider::class, 
EventsDetailProvider::class])
abstract class EventsFragmentProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsFragmentModule::class])
    abstract fun provideEventsFragmentFactory(): EventsFragment
}
@Module
class EventsFragmentModule {
     @Binds
     abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}
@Module
abstract class EventsListProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsListModule::class])
    abstract fun provideEventsListFragmentFactory(): EventsListFragment
}
class EventsFragment : DaggerFragment(), EventContract.Flow {
    override fun navigateToList() {
        addFragment(navigator.getEventsListFragment(context!!))
    }

    override fun navigateToDetail(id: String) {
        println("id = ${id}")
    }

    ...
}
interface EventContract {
    interface Flow {
        fun navigateToList()

        fun navigateToDetail(id: String)
    }
}
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
@Module
class EventsFragmentModule {
     @Binds
     abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}
@Module
abstract class EventsListProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsListModule::class])
    abstract fun provideEventsListFragmentFactory(): EventsListFragment
}