如何修复Hilt依赖注入中的[Dagger/MissingBinding]错误?
Hilt注入仓库到ViewModel时MissingBinding错误的解决
问题详情
使用Hilt将仓库注入ViewModel构造函数时,反复遇到以下错误:
error: [Dagger/MissingBinding] com.example.comfyluxxy.repositories.MainHouseRepository cannot be provided without an @Inject constructor or an @Provides-annotated method.
已在AppModule中通过@Provides声明仓库,代码如下:
AppModule.kt
@Module @InstallIn(SingletonComponent::class) object AppModule { @Singleton @Provides fun provideHouseRepository() = MainHouseRepository() as HouseRepository }
ViewModel依赖注入代码:
HouseViewModel.kt
@HiltViewModel class HouseViewModel @Inject constructor( private val houseRepository: MainHouseRepository ) : ViewModel() { // 业务逻辑代码 }
尝试将Module安装到ViewModelComponent后,错误依然存在:
@Module @InstallIn(ViewModelComponent::class) object ViewModelModule { @Provides @ViewModelScoped fun provideHouseRepository() = MainHouseRepository() as HouseRepository }
问题根源
你的@Provides方法返回的是父类型HouseRepository,但ViewModel中声明依赖的是子类型MainHouseRepository。Dagger/Hilt无法自动将父类型实例向上转型为子类型,因此找不到MainHouseRepository的绑定实现。
修复方案
方案1:统一依赖类型为父接口/类
将ViewModel中的依赖类型改为HouseRepository,与@Provides方法的返回类型保持一致:
@HiltViewModel class HouseViewModel @Inject constructor( private val houseRepository: HouseRepository // 修改为父类型 ) : ViewModel() { // 业务逻辑代码 }
方案2:调整@Provides方法返回子类型
如果业务必须依赖MainHouseRepository,则修改@Provides方法的返回类型,直接返回子类型实例:
@Module @InstallIn(SingletonComponent::class) object AppModule { @Singleton @Provides fun provideHouseRepository(): MainHouseRepository { return MainHouseRepository() } }
若需要同时提供父类型和子类型的绑定(比如其他地方需要依赖HouseRepository),可以添加额外的@Provides方法复用实例:
@Module @InstallIn(SingletonComponent::class) object AppModule { @Singleton @Provides fun provideMainHouseRepository(): MainHouseRepository { return MainHouseRepository() } @Singleton @Provides fun provideHouseRepository(mainHouseRepository: MainHouseRepository): HouseRepository { return mainHouseRepository } }
内容的提问来源于stack exchange,提问作者TR4C3S 0F 45H
相关产品推荐
相关产品推荐

