Инжектор Dagger 2 и связывает IntoMap с IntKey - PullRequest
0 голосов
/ 26 февраля 2019

Я использую 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, я получаю ошибку компиляции

Один и тот же ключ карты связан более одного раза для ViewHolderFactory

Как лучше всего избежать этого выполнения?положить все IntKeys в класс констант с упорядоченными и увеличенными?

Спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

После долгих исследований в моем коде я обнаружил пропущенную точку.Я предоставляю свой presentation modules в Application component, чтобы он генерировал только одну карту для каждого типа и получал эту повторяющуюся ошибку MapKey.

Один и тот же ключ карты связан более одного раза для ViewHolderFactory

Я нашел эту полезную статью на Medium.Я понял, что создал мои модули для 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
}
...