我一直试图将父片段插入其子片段中以进行导航,但未成功。我关注了多个不同的帖子,但似乎无法理解实现中缺少的内容。
我有一个NotificationCompat.Builder
,其中包含一个Notification.Builder.setChannelId()
,其中一个页面包含MainActivity
。该片段又有两个子片段ViewPager
和EventsFragment
。我想将EventsListFragment
片段注入到EventsDetailFragment
中,以便可以告诉它导航到EventsFragment
。
我知道这可能是以下帖子的重复,对此我真的表示歉意,但老实说,我看不到我缺少什么。这些是我发现的帖子:
我的实现如下:
ApplicationComponent
EventsListFragment
ActivityModule
EventsDetailFragment
MainActivityProvider
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
ActivityModule::class,
BaseApplicationModule::class,
ApplicationModule::class])
interface ApplicationComponent : AndroidInjector<AndroidApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<AndroidApplication>()
}
EventsFragmentProvider
@Module(includes = [MainActivityProvider::class])
abstract class ActivityModule{
}
EventsFragmentModule
@Module(includes = [EventsFragmentProvider::class])
abstract class MainActivityProvider {
@PerActivity
@ContributesAndroidInjector(modules = [MainActivityModule::class])
abstract fun provideMainActivityFactory(): MainActivity
}
EventsListProvider
@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
}
EventContract
@Module
abstract class EventsListProvider {
@PerFragment
@ContributesAndroidInjector(modules = [EventsListModule::class])
abstract fun provideEventsListFragmentFactory(): EventsListFragment
}
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)
}
}
我可能正在使用反模式,但是这正是我现在要努力的原因。我愿意接受可能会帮助我实现这一目标的更改
答案 0 :(得分:1)
该错误是由以下模块引起的:
@Module
class EventsFragmentModule {
@Binds
abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}
Dagger不会为您提供Fragment
,因此您不应该这样做。
此外,我认为您误解了@ContributesAndroidInjector
的含义。这意味着为您创建一个AndroidInjector
但要证明一个实例。
@Module
abstract class EventsListProvider {
@PerFragment
@ContributesAndroidInjector(modules = [EventsListModule::class])
abstract fun provideEventsListFragmentFactory(): EventsListFragment
}
因此,您应将EventsFragment
实例传递到像这样的模块post中,而不要使用字段注入。