Dagger 2 Injector并使用IntKey绑定到IntoMap

问题描述 投票:1回答:1

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

我有一个通用的RecyclerView适配器,并在ViewHolderFactories保持BindersMap

这是我的适配器:

@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,相同的地图键被绑定不止一次

什么是避免这种情况的最佳解决方案,除了将所有qazxsw poi放在一个有序且递增的常量类中?

谢谢。

android dagger-2 androidinjector
1个回答
2
投票

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

对于ViewHolderFactory,相同的映射键被绑定多次

我在Medium中找到了MapKey有用的文章。我意识到为this创建了我的模块。所以我的演示模块的Application Scope没有生成,SubComponents只为工厂类创建一个Map。我为我的演示模块重新设计了我的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
© www.soinside.com 2019 - 2024. All rights reserved.