Dagger 2注入器并使用IntKey绑定IntoMap

时间:2019-02-26 14:40:11

标签: android dagger-2 androidinjector

我正在使用Dagger 2 Android注入器注入我的ActivitiesFragments

我有一个通用的RecyclerView适配器,并将ViewHolderFactoriesBinders保留在Map中。

这是我的适配器:

@Module
class CorePresentationModule {

    @Provides
    fun provideDisplayItemComperator(): DisplayItemComperator = DefaultDisplayItemComperator()

    @Module
    companion object {
        @JvmStatic
        @Provides
        fun provideRecyclerAdapter(
            itemComparator: DisplayItemComperator,
            factoryMap: Map<Int, @JvmSuppressWildcards ViewHolderFactory>,
            binderMap: Map<Int, @JvmSuppressWildcards ViewHolderBinder>,
            androidPreconditions: AndroidPreconditions
        ): RecyclerViewAdapter {
            return RecyclerViewAdapter(
                itemComperator = itemComparator,
                viewHolderFactoryMap = factoryMap,
                viewBinderFactoryMap = binderMap,
                androidPreconditions = androidPreconditions
            )
        }
    }
}

我为Fragment创建一个演示模块,如下所示:

@Module
abstract class MessagesPresentationModule {

    @Binds
    @IntoMap
    @IntKey(MESSAGE)
    internal abstract fun provideMessagesViewModelFactory(factory: MessagesViewHolder.MessageViewHolderFactory): ViewHolderFactory

    @Binds
    @IntoMap
    @IntKey(MESSAGE)
    internal abstract fun provideMessagesViewHolderBinder(binder: MessagesViewHolder.MessagesViewHolderBinder): ViewHolderBinder

} 

在另一个片段中,我再次注入适配器并为屏幕创建另一个模块:

@Module
abstract class LinksPresentationModule {

    @Binds
    @IntoMap
    @IntKey(LINK)
    internal abstract fun provideLinksViewModelFactory(factory: LinksViewHolder.LinksViewHolderFactory): ViewHolderFactory

    @Binds
    @IntoMap
    @IntKey(LINK)
    internal abstract fun provideLinksViewHolderBinder(binder: LinksViewHolder.LinksViewHolderBinder): ViewHolderBinder

}

MESSAGELINK为0时,出现编译错误

  

ViewHolderFactory

多次绑定同一映射键

避免这种执行将所有IntKeys放在有序和递增的常量类中的最佳解决方案是什么?

谢谢。

1 个答案:

答案 0 :(得分:2)

在对代码进行长时间研究之后,我发现了缺失的地方。我在Application component中提供了MapKey,因此它为每种类型仅生成一个Map,并得到此重复的Application Scope错误。

  

为ViewHolderFactory多次绑定同一个地图键

我在“中”发现了this有用的文章。我意识到这为SubComponents创建了我的模块。因此,不会为我的演示文稿模块生成Dagger,并且Dagger仅为工厂类创建一个Map。我为演示模块重新设计了FragmentScoped实现,以使其保持@Module abstract class MessagesFragmentModule { @FragmentScope @ContributesAndroidInjector(modules = [MessagesPresentationModule::class] abstract fun contributeMessagesFragment(): MessagesFragment } @Module abstract class LinksFragmentModule { @FragmentScope @ContributesAndroidInjector(modules = [LinksPresentationModule::class] abstract fun provideLinksFragment(): LinksFragment } 的位置,就像下面的代码一样。

ActivityModule

这是@Module internal abstract class ActivityModule { @ContributesAndroidInjector( modules = [MessagesFragmentModule::class, LinksFragmentModule::class] ) @ActivityScope abstract fun provideMainActivityContributor(): MainActivity }

{{1}}