我正在使用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
避免这种执行将所有IntKeys
放在有序和递增的常量类中的最佳解决方案是什么?
谢谢。
答案 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}}