Android Dagger将父片段变成子片段

时间:2018-08-27 01:47:31

标签: android android-fragments dagger-2 dagger

我一直试图将父片段插入其子片段中以进行导航,但未成功。我关注了多个不同的帖子,但似乎无法理解实现中缺少的内容。

我有一个NotificationCompat.Builder,其中包含一个Notification.Builder.setChannelId(),其中一个页面包含MainActivity。该片段又有两个子片段ViewPagerEventsFragment。我想将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)
    }
}

我可能正在使用反模式,但是这正是我现在要努力的原因。我愿意接受可能会帮助我实现这一目标的更改

1 个答案:

答案 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中,而不要使用字段注入。