【问题标题】:Injecting Implementations From Another Gradle Module in Hilt从 Hilt 中的另一个 Gradle 模块注入实现
【发布时间】:2020-08-27 23:18:06
【问题描述】:

我正在尝试使用 hilt 注入存储库类的实现(接口位于 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]

【问题讨论】:

    标签: android dagger-hilt


    【解决方案1】:

    合理的解释

    您的Scopes 似乎有问题。

    你在FragmentComponent 中是Installing 你的RatesRepository,但你正试图在更高级别的依赖项中使用它。我可以看到您正在尝试将RatesRepository 注入ViewModelsViewModels do not relate to FragmentComponent but ActivityRetainedComponent

    this graph:


    解决方案

    我希望 Repository 应在 App 范围内维护,因此我会将您的设置修改为:

    @Module
    @InstallIn(ApplicationComponent::class)
    interface DataModule {
        @Binds
        fun bindsRatesRepository(ratesRepositoryImpl: RatesRepositoryImpl): RatesRepository
    }
    

    如果RatesRepositoryImpl的依赖范围较窄,你可以试试ActivityRetainedComponent而不是ApplicationComponent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2021-11-20
      • 2019-01-20
      • 2018-12-23
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多