我正在使用Dagger 2
Android注射器来注射我的Activities
和Fragments
。
我有一个通用的RecyclerView
适配器,并在ViewHolderFactories
保持Binders
和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
}
当MESSAGE
和LINK
为0时,我得到编译错误
对于
ViewHolderFactory
,相同的地图键被绑定不止一次
什么是避免这种情况的最佳解决方案,除了将所有qazxsw poi放在一个有序且递增的常量类中?
谢谢。
经过长时间的研究,我找到了缺失点。我在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