hilt:错误:[Dagger/MissingBinding] 如果没有 @Provides 注释的方法,则无法提供存储库

问题描述 投票:0回答:1

我正在创建一个多模块 Android 应用程序,其中包含干净的架构层作为模块:

root >
       app (main module)
       presentation (android lib module) //it has dependency on domain in build.gradle
       domain (android lib module)
       data (android lib module) //it has dependency on domain in build.gradle

Domain 模块具有 UseCase 和 Repository 接口,例如:

package com.cleanarchitecturesample.domain.usecase.user


class SaveUserUseCase @Inject constructor(
     private val repository: UserCredentialsRepository,
     @IO private val dispatcher: CoroutineDispatcher
) {

     ...
}

package com.cleanarchitecturesample.domain.respository

interface UserCredentialsRepository {

...

}

Repository及其di的实现被放置在Data模块中,数据源如下:

package com.cleanarchitecturesample.data.repoimpl

import com.cleanarchitecturesample.data.source.local.UserCredentialsLDS
import com.cleanarchitecturesample.domain.respository.UserCredentialsRepository

class UserCredentialsRepositoryImpl(
     private val userCredentialsLDS: UserCredentialsLDS
) : UserCredentialsRepository {

    ...
}

package com.cleanarchitecturesample.data.di

import com.cleanarchitecturesample.data.repoimpl.UserCredentialsRepositoryImpl
import com.cleanarchitecturesample.data.source.local.UserCredentialsLDS
import com.cleanarchitecturesample.domain.respository.UserCredentialsRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {


    @Singleton
    @Provides
    fun provideUserCredentialsRepository(
        userCredentialsLDS: UserCredentialsLDS
    ): UserCredentialsRepository = UserCredentialsRepositoryImpl(userCredentialsLDS)

}

一切似乎都很好,但我仍然收到以下错误:

/AndroidStudioProjects/CleanArchitectureSample/app/build/ generated/hilt/component_sources/debug/com/cleanarchitecturesample/app/CleanArchitectureApp_HiltComponents.java:137: 错误:[匕首/缺少绑定] com.cleanarchitecturesample.domain.respository.UserCredentialsRepository 如果没有 @Provides 注释的方法,则无法提供。 民众 抽象静态类 SingletonC 实现 CleanArchitectureApp_GenerateInjector, ^ com.cleanarchitecturesample.domain.respository.UserCredentialsRepository 注射于 com.cleanarchitecturesample.domain.usecase.user.IsValidUserCredentialsUseCase(存储库, ……) com.cleanarchitecturesample.domain.usecase.user.IsValidUserCredentialsUseCase 注射于 com.cleanarchitecturesample.presentation.vm.UserAuthenticationVM(..., isValidUserCredentialsUseCase,...) com.cleanarchitecturesample.presentation.vm.UserAuthenticationVM 被注入 com.cleanarchitecturesample.presentation.vm.UserAuthenticationVM_HiltModules.BindsModule.binds(arg0) @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map> 请求于 dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.cleanarchitecturesample.app.CleanArchitectureApp_HiltComponents.SingletonC → com.cleanarchitecturesample.app.CleanArchitectureApp_HiltComponents.ActivityRetainedC → com.cleanarchitecturesample.app.CleanArchitectureApp_HiltComponents.ViewModelC] 还要求: com.cleanarchitecturesample.domain.usecase.user.SaveUserUseCase(存储库, …)

Note: I have also tried di for Repository using the abstract class and binds syntax with even that was showing the same error.

如有任何帮助,我们将不胜感激。提前致谢!! :)

android dependency-injection dagger-hilt clean-architecture multi-module
1个回答
5
投票

添加

data
模块作为
app
模块的依赖项。

Dagger 生成的代码保留在

app
模块中,因此如果您不将
data
模块设置为依赖项,Dagger 将无法访问您的
RepositoryModule

© www.soinside.com 2019 - 2024. All rights reserved.