Как в Dagger создать объекты с разным Component при помощи @Binds?

У меня стоит задача при помощи даггера создать объекты с разным ЖЦ.

Один модуль провайдит синглтоны:

@Module
@InstallIn(SingletonComponent::class)
object RepoModule {

 @Provides
    fun provideMyRepository(/* Зависимости */): MyRepository = MyRepositoryImpl( /* Зависимости */ )
}

Другой модуль провайдит объекты для вьюмодели, и поэтому у них ViewModelComponent. И кроме того я делаю Binds для того, чтобы забиндить репозиторий в юзкейс (сделал как в разделе Satisfying Dependencies документации даггера):

@InstallIn(ViewModelComponent::class)
@Module
abstract class BindRepoModule {

    @Binds
    abstract fun bindMyRepository(myRepositoryImpl: MyRepositoryImpl): MyRepository
}


@InstallIn(ViewModelComponent::class)
@Module
object ViewModelModule {

// Все юзкейсы, используемые во вьюмодели и вызывающие MyRepository, провайдятся тут
    @Provides
    fun provideMyUseCase(myRepository: MyRepository): MyUseCase = MyUseCase(myRepository = myRepository)

}

И в итоге при попытке сбилдить я натыкаюсь на такую ошибку:

/Users/user/StudioProjects/bank-mobile-android/app/build/generated/hilt/component_sources/gmsDebug/ru/bank/mobile/app/App_HiltComponents.java:986: error: [Dagger/DuplicateBindings] ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository is bound multiple times:
  public abstract static class SingletonC implements FragmentGetContextFix.FragmentGetContextFixEntryPoint,
                         ^
          @Binds ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository ru.bank.mobile.cards.reissue.common.di.CardReissueRepositoryModule.bindCardReissueRepository(ru.bank.mobile.cards.reissue.common.data.repository.CardReissueRepositoryImpl)
          @Provides ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository ru.bank.mobile.cards.reissue.common.di.DeeplinkModule.provideCardReissueRepository(ru.bank.mobile.cards.reissue.common.data.api.CardReissueApiService, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueReasonMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueClientIncomeMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueWaitingDeliveryMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueErrorMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueBranchInfoMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueSigningMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueTariffChangeMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.AddressSuggestionMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.DateAndTimeDeliveryDataMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.ToOtpDataMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.ReissueAcceptedDataMapper, @Named("filesDir") java.io.File, ru.bank.mobile.legacyresources.domain.UserRepository)
      ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository is injected at
          ru.bank.mobile.cards.reissue.common.di.CardReissueModule.provideRequestOtpCodeUseCase(cardReissueRepository)
      ru.bank.mobile.cards.reissue.common.domain.usecase.RequestOtpCodeUseCase is injected at
          ru.bank.mobile.cards.reissue.mainProcess.presentation.signing.CardReissueSigningViewModel(…, requestOtpCodeUseCase, …)
      ru.bank.mobile.cards.reissue.mainProcess.presentation.signing.CardReissueSigningViewModel is injected at
          ru.bank.mobile.cards.reissue.mainProcess.presentation.signing.CardReissueSigningViewModel_HiltModules.BindsModule.binds(arg0)
      @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.Class<?>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
          dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [ru.bank.mobile.app.App_HiltComponents.SingletonC → ru.bank.mobile.app.App_HiltComponents.ActivityRetainedC → ru.bank.mobile.app.App_HiltComponents.ViewModelC]

Даггер ругается на то, что репозиторий биндится несколько раз, хотя это не так. В чем может быть проблема и как её пофиксить?


Ответы (0 шт):