Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Hilt中的另一个Gradle模块注入实现_Android_Dagger Hilt - Fatal编程技术网

Android 从Hilt中的另一个Gradle模块注入实现

Android 从Hilt中的另一个Gradle模块注入实现,android,dagger-hilt,Android,Dagger Hilt,我试图使用hilt注入一个存储库类的实现(接口位于域模块中,数据模块中的实现与数据模块中的实现取决于域模块),但在构建应用程序时收到一个错误。这是我的设置 在域中模块 interface RatesRepository { fun getRates(): Single<Rates> } class RatesRepositoryImpl @Inject constructor( private val rateDataSource: CurrencyExchange

我试图使用hilt注入一个存储库类的实现(接口位于
模块中,
数据
模块中的实现与
数据
模块中的实现取决于
模块),但在构建应用程序时收到一个错误。这是我的设置

域中
模块

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]
错误:[Dagger/MissingBinding]com.basil.domain\u converter.repository.RatesRepository在没有@Provides注释方法的情况下无法提供。
公共抽象静态类应用程序实现currenceApp_生成的对象,
^
com.basil.domain\u converter.repository.RatesRepository在
com.basil.domain\u converter.usecase.GetRatesUseCase(ratesRepository)
javax.inject.Provider在
com.basil.ui\u converter.ui.RatesViewModel\u AssistedFactory(getRatesUseCase)
com.basil.ui_converter.ui.RatesViewModel_AssistedFactory在
com.basil.ui\u converter.ui.RatesViewModel\u HiltModule.bind(arg0)
java.util.Map合理的解释
您的
范围似乎有问题

您正在
FragmentComponent
中安装
您的
RatesRepository
,但您试图在更高级别的依赖项中使用它。我可以看到您正试图在
ViewModels
ViewModels
中注入
ratesrespository

见:


解决方案 我希望
应用程序
范围中应该维护
存储库
,因此我会将您的设置修改为:

@模块
@InstallIn(ApplicationComponent::class)
接口数据模块{
@束缚
fun bindsRatesRepository(ratesRepositoryImpl:ratesRepositoryImpl):RatesRepository
}
如果
RatesRepositoryImpl
的依赖项范围较窄,则可以尝试
ActivityRetainedComponent
而不是
ApplicationComponent