Внедрение реализаций из другого модуля Gradle в Hilt
Я пытаюсь использовать рукоять, чтобы внедрить реализацию класса репозитория (интерфейс живет в domain
модуль, реализация в data
модуль с data
модуль в зависимости от domain
one), но при создании приложения появляется ошибка. Вот моя установка
В domain
модуль
interface RatesRepository {
fun getRates(): Single<Rates>
}
в data
модуль
class RatesRepositoryImpl @Inject constructor(
private val rateDataSource: CurrencyExchangeDataSource,
private val mapper: ExchangeResponseToRates
) : RatesRepository {
//..
}
@Module
@InstallIn(FragmentComponent::class)
interface DataModule {
@Binds
fun bindsRatesRepository(ratesRepositoryImpl: RatesRepositoryImpl): RatesRepository
}
и data объявляет домен как зависимость
EDIT: ошибка, которую я получаю:
error: [Dagger/MissingBinding] com.basil.domain_converter.repository.RatesRepository cannot be provided without an @Provides-annotated method.
public abstract static class ApplicationC implements CurrenciesApp_GeneratedInjector,
^
com.basil.domain_converter.repository.RatesRepository is injected at
com.basil.domain_converter.usecase.GetRatesUseCase(ratesRepository)
javax.inject.Provider<com.basil.domain_converter.usecase.GetRatesUseCase> is injected at
com.basil.ui_converter.ui.RatesViewModel_AssistedFactory(getRatesUseCase)
com.basil.ui_converter.ui.RatesViewModel_AssistedFactory is injected at
com.basil.ui_converter.ui.RatesViewModel_HiltModule.bind(arg0)
java.util.Map<java.lang.String,javax.inject.Provider<androidx.hilt.lifecycle.ViewModelAssistedFactory<? extends androidx.lifecycle.ViewModel>>> is injected at
androidx.hilt.lifecycle.ViewModelFactoryModules.ActivityModule.provideFactory(…, viewModelFactories)
@dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory java.util.Set<androidx.lifecycle.ViewModelProvider.Factory> is requested at
dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.ActivityEntryPoint.getActivityViewModelFactory() [com.basil.example.CurrenciesApp_HiltComponents.ApplicationC → com.basil.example.CurrenciesApp_HiltComponents.ActivityRetainedC → com.basil.example.CurrenciesApp_HiltComponents.ActivityC]
The following other entry points also depend on it:
dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.FragmentEntryPoint.getFragmentViewModelFactory() [com.basil.example.CurrenciesApp_HiltComponents.ApplicationC → com.basil.example.CurrenciesApp_HiltComponents.ActivityRetainedC → com.basil.example.CurrenciesApp_HiltComponents.ActivityC → com.basil.example.CurrenciesApp_HiltComponents.FragmentC]
1 ответ
Правдоподобное объяснение
Похоже, у вас проблема с Scopes
.
Вы Installing
твой RatesRepository
в FragmentComponent
, но вы пытаетесь использовать его в зависимостях более высокого уровня. Я вижу, ты пытаешься ввестиRatesRepository
в ViewModels
, а также ViewModels
не относятся к FragmentComponent
но ActivityRetainedComponent
.
Смотрите этот график:
Решение
Я ожидал Repository
следует сохранить в App
области, поэтому я бы изменил вашу настройку на:
@Module
@InstallIn(ApplicationComponent::class)
interface DataModule {
@Binds
fun bindsRatesRepository(ratesRepositoryImpl: RatesRepositoryImpl): RatesRepository
}
Если зависимости RatesRepositoryImpl
иметь более узкую область применения, вы можете попробовать ActivityRetainedComponent
вместо того ApplicationComponent
.