当前位置: 首页 > 知识库问答 >
问题:

在Hilt中注入来自另一个Gradle模块的实现

帅彦
2023-03-14
interface RatesRepository {
    fun getRates(): Single<Rates>
}
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]

共有1个答案

印季
2023-03-14

看来您的作用域有问题。

您正在FragmentComponent安装RatesRepository,但您试图在更高级别的依赖项中使用它。我可以看到您正在尝试在ViewModels中注入RatesRepository,而ViewModelsFragmentComponent无关,而是与ActivityRetainedComponent有关。

我希望存储库应该在app作用域中维护,因此我将修改您的设置以:

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

 类似资料:
  • 我的主要模块与设置。格拉德尔: 背景格拉德尔 我的听众: 当我运行我的bootApplication主类时,它会在根构建目录中创建一个eventlistener-. jar文件。但是eventlistener模块没有检查资源文件夹,我猜它没有看到引导应用上下文。也许它应该被收集到一个jar文件?看起来我在gradle构建文件中遗漏了一些东西。

  • 问题内容: 我有一个和一个。 我想用的。 当我通过注射添加时: 我得到这个嵌套错误: [嵌套] 11592-2018-8-13 11:42:17 [ExceptionHandler] Nest无法解析PlayersService(+,?)的依赖项。请确保索引[1]的参数在当前上下文中可用。 这两个模块均导入。两种服务都在其模块中单独工作。 问题答案: 你要 导出 的是它提供的模块: 然后将导出 模

  • 我使用架构和堆栈。 对于服务之间的通信,我决定使用。 我有一个名为的服务,今天我实现了一个项目,并将其添加到存储库中。 我添加了到服务使用使用以下命令: 现在我想在中创建一个服务类,

  • 我有以下3个模块在我的Spring启动应用程序: web(入口点/主应用程序类,用 坚持 服务 我现在正试图在模块中注入一个来自的服务。在这个服务中,我注入了来自模块的存储库。启动应用程序时,会出现以下错误: ImageService类: class: 这就是我在模块中将服务注入到我的类中的方式: 所以我在网上搜索,看到一些人有类似的问题。然后我得到了一个提示,我应该在我的应用程序类中将scanB

  • 问题内容: 我试图使用Dagger在正在构建的应用程序上进行依赖注入,当我拥有一个程序包的模块(取决于注入器(可能是另一个模块)提供的值)时,在构造适当的DAG时遇到了麻烦。 如果我有一个用于配置变量的简单模块(例如,我可能想换成测试环境) 而另一个模块依赖于它,例如 我尝试在构造函数中引导注入的行失败,并且它抱怨我没有在适当的模块中指定显式行。 通过反复试验,我发现如果在行中添加,这种情况就消失

  • 所以我有一个多项目设置,看起来像这样