从 Hilt 中的另一个 Gradle 模块注入实现
Injecting Implementations From Another Gradle Module in Hilt
我正在尝试使用 hilt 注入存储库的实现 class(接口位于 domain
模块中,实现位于 data
模块中 data
模块取决于 domain
一个)但是在构建应用程序时收到错误。这是我的设置
在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
}
并且数据将域声明为依赖项
编辑:
我收到的错误:
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]
合理的解释
您的 Scopes
似乎有问题。
您是 Installing
您在 FragmentComponent
中的 RatesRepository
,但您正试图在更高级别的依赖项中使用它。我可以看到您正在尝试在 ViewModels
和 ViewModels
do not relate to FragmentComponent
but ActivityRetainedComponent
.
中注入 RatesRepository
参见this graph:
解决方案
我希望 Repository
应该保留在 App
范围内,所以我会将您的设置修改为:
@Module
@InstallIn(ApplicationComponent::class)
interface DataModule {
@Binds
fun bindsRatesRepository(ratesRepositoryImpl: RatesRepositoryImpl): RatesRepository
}
如果 RatesRepositoryImpl
的依赖范围较窄,您可以尝试 ActivityRetainedComponent
而不是 ApplicationComponent
。
我正在尝试使用 hilt 注入存储库的实现 class(接口位于 domain
模块中,实现位于 data
模块中 data
模块取决于 domain
一个)但是在构建应用程序时收到错误。这是我的设置
在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
}
并且数据将域声明为依赖项
编辑: 我收到的错误:
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]
合理的解释
您的 Scopes
似乎有问题。
您是 Installing
您在 FragmentComponent
中的 RatesRepository
,但您正试图在更高级别的依赖项中使用它。我可以看到您正在尝试在 ViewModels
和 ViewModels
do not relate to FragmentComponent
but ActivityRetainedComponent
.
RatesRepository
参见this graph:
解决方案
我希望 Repository
应该保留在 App
范围内,所以我会将您的设置修改为:
@Module
@InstallIn(ApplicationComponent::class)
interface DataModule {
@Binds
fun bindsRatesRepository(ratesRepositoryImpl: RatesRepositoryImpl): RatesRepository
}
如果 RatesRepositoryImpl
的依赖范围较窄,您可以尝试 ActivityRetainedComponent
而不是 ApplicationComponent
。