如何解决Dagger-Hilt引发的Dagger/MissingBinding依赖注入报错
问题场景
采用 Kotlin Clean Architecture + Hilt 技术栈开发Android项目时,构建阶段抛出Dagger依赖绑定缺失错误。
完整报错日志
C:\Users\ayoub\AndroidStudioProjects\cleanArchitecture_project\app\build\generated\source\kapt\debug\com\example\cleanarchitecture_project\presentation\App_HiltComponents.java:122: error: [Dagger/MissingBinding] com.example.cleanarchitecture_project.domain.repository.UserRepository cannot be provided without an @Provides-annotated method. public abstract static class SingletonC implements App_GeneratedInjector, ^ com.example.cleanarchitecture_project.domain.repository.UserRepository is injected at com.example.cleanarchitecture_project.domain.UseCase(repository) com.example.cleanarchitecture_project.domain.UseCase is injected at com.example.cleanarchitecture_project.presentation.UserViewModel(useCase) com.example.cleanarchitecture_project.presentation.UserViewModel is injected at com.example.cleanarchitecture_project.presentation.UserViewModel_HiltModules.BindsModule.binds(vm) @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.example.cleanarchitecture_project.presentation.App_HiltComponents.SingletonC ? com.example.cleanarchitecture_project.presentation.App_HiltComponents.ActivityRetainedC ? com.example.cleanarchitecture_project.presentation.App_HiltComponents.ViewModelC]
问题根因
Hilt依赖图中没有注册UserRepository类型的实例提供规则,无法满足UseCase构造函数的入参依赖,最终导致ViewModel注入链路整体构建失败。
修复步骤
- 确认分层结构符合Clean Architecture规范:
UserRepository是domain层定义的抽象接口,具体实现类UserRepositoryImpl放在data层 - 给Repository实现类添加
@Inject构造注解,允许Hilt创建实例:
// data层的实现类 class UserRepositoryImpl @Inject constructor( // 按需注入远程数据源、本地Dao等依赖 ) : UserRepository { // 实现UserRepository接口定义的所有方法 }
- 新建Hilt模块,完成抽象接口到实现类的绑定:
@Module @InstallIn(SingletonComponent::class) // 全局单例生命周期,匹配Repository常规使用场景 abstract class RepositoryBindModule { @Binds abstract fun bindUserRepository(impl: UserRepositoryImpl): UserRepository }
- 执行Gradle Sync后重新构建项目即可。
常见踩坑排查
- 模块类必须同时加
@Module和@InstallIn注解,缺任何一个Hilt都不会识别该模块 - 不要给domain层的
UserRepository接口直接加@Inject注解,接口无法直接实例化 - 绑定方法的返回值必须是抽象的
UserRepository类型,入参必须是具体实现类,不要写反 - 如果用
@Provides写法手动提供实例,要确保方法返回值类型为UserRepository,且不要把模块安装在ViewModel、Activity这类短生命周期组件中,否则上层依赖无法找到实例
内容的提问来源于stack exchange,提问作者ayoub belmaati
相关产品推荐
相关产品推荐

