Dagger 2 注入器并使用 IntKey 绑定 IntoMap
Dagger 2 Injector and Binds IntoMap with IntKey
我正在使用 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
)
}
}
}
我为我的片段创建了一个演示模块,如下所示:
@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 时出现编译错误
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
}
我正在使用 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
)
}
}
}
我为我的片段创建了一个演示模块,如下所示:
@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 时出现编译错误
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
}