如何在@HiltViewModel中通过@Inject注入接口类型依赖?
Hilt接口类型注入ViewModel配置方案
出现[Dagger/MissingBinding]报错的核心原因是Hilt无法匹配到接口对应的实现类,需按以下步骤完成配置:
1. 配置接口实现类的注入注解
接口实现类的构造函数必须添加@Inject注解,让Hilt可以自动实例化实现类对象:
class PreferenceRepImpl @Inject constructor( private val preferenceDao: PreferenceDao ) : PreferenceRep { // 此处实现PreferenceRep接口定义的所有方法 }
2. 编写Hilt绑定Module绑定接口与实现类
推荐使用@Binds注解完成绑定,性能开销更低:
@Module @InstallIn(ViewModelComponent::class) // 绑定到ViewModel生命周期,与持有该注入的ViewModel同生共死 abstract class PreferenceRepBindModule { // 抽象方法返回值为待注入的接口类型,参数为对应实现类 @Binds abstract fun bindPreferenceRep(impl: PreferenceRepImpl): PreferenceRep }
如果实现类初始化需要自定义逻辑,可以使用@Provides注解实现绑定:
@Module @InstallIn(ViewModelComponent::class) object PreferenceRepProvideModule { @Provides fun providePreferenceRep(preferenceDao: PreferenceDao): PreferenceRep { // 可添加自定义初始化逻辑 return PreferenceRepImpl(preferenceDao) } }
3. 确认ViewModel注入配置正确
ViewModel需添加@HiltViewModel注解,构造函数添加@Inject注解直接注入接口即可:
@HiltViewModel class CustomViewModel @Inject constructor( private val preferenceRep: PreferenceRep ) : ViewModel() { // ViewModel业务逻辑 }
4. 常见问题排查
- 确认
PreferenceDao的注入配置完整,若为Room DAO需单独在Hilt Module中提供Room实例后返回对应DAO,避免底层依赖本身存在绑定缺失 - 若需要
PreferenceRep全局单例,可将Module的@InstallIn参数改为SingletonComponent::class,同时给PreferenceRepImpl添加@Singleton注解即可 - 同一个接口绑定多个实现时需自定义
@Qualifier注解区分,否则会触发重复绑定报错 - 配置完成后清理项目构建缓存再重新编译,避免构建缓存导致的配置不生效问题
内容的提问来源于stack exchange,提问作者Mark Delphi
相关产品推荐
相关产品推荐

