Android Dagger将父片段转换为子片段
我一直试图将父片段注入其子片段以用于导航,但没有成功。我关注了几个不同的帖子,但我似乎不明白我在实现中遗漏了什么 我有一个MainActivity,它包含一个ViewPager,其中一个这样的页面包含EventsFragment。这个片段又有两个子片段EventsListFragment和EventsDetailFragment。我想将EventsFragment片段注入EventsListFragment,这样我就可以告诉它导航到EventsDetailFragment 我知道这可能是下面帖子的重复,我真的为此道歉,但我真的看不出我遗漏了什么。以下是我找到的帖子: 我的执行情况如下: 应用组件 主活动提供程序 EventsFragmentProvider EventsFragmentModule 事件提供程序 事件碎片 事件合同 事件片段 错误Android Dagger将父片段转换为子片段,android,android-fragments,dagger-2,dagger,Android,Android Fragments,Dagger 2,Dagger,我一直试图将父片段注入其子片段以用于导航,但没有成功。我关注了几个不同的帖子,但我似乎不明白我在实现中遗漏了什么 我有一个MainActivity,它包含一个ViewPager,其中一个这样的页面包含EventsFragment。这个片段又有两个子片段EventsListFragment和EventsDetailFragment。我想将EventsFragment片段注入EventsListFragment,这样我就可以告诉它导航到EventsDetailFragment 我知道这可能是下面帖子
我可能在使用反模式,但这正是我工作到这一点的原因。我愿意接受可能有助于我实现此目标的更改错误是由以下模块引起的:
@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
}