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

Dagger 2 Injector and Binds IntoMap with IntKey

我正在使用 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
            )
        }
    }
}

我为我的片段创建了一个演示模块,如下所示:

@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 时出现编译错误

The same map key is bound more than once for ViewHolderFactory

避免将所有 IntKeys 放入常量 class 中的最佳解决方案是什么?

谢谢。

经过长时间研究我的代码,我发现了缺失的一点。我在 Application component 中提供了我的 presentation modules,因此它只为每种类型生成一个 Map 并得到这个重复的 MapKey 错误。

The same map key is bound more than once for ViewHolderFactory

我在 Medium 中找到了 this 有用的文章。我意识到为 Application Scope 创建了我的模块。所以 SubComponents 没有为我的演示模块生成并且 Dagger 只为工厂 类 创建了一个地图。我重新设计了我的演示模块的 Dagger 实现,以保留它们 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
}