Dagger Hilt中如何结合使用Assisted Inject与普通Inject?
结论
Dagger Hilt 原生支持在 @AssistedInject 标注的构造函数中同时使用运行时传入的辅助参数、Hilt自动注入的全局依赖,不需要额外做特殊适配。你碰到的注入报错和Assisted Inject本身的能力无关,核心是CommunityFeedRepository没有在Hilt依赖图中完成正确绑定。
报错原因
你贴的错误日志指向的问题很明确:
Hilt 识别到
CommunityFeedViewModel构造函数需要注入CommunityFeedRepository,但当前依赖图中找不到该类型的可用绑定,导致Hilt无法为@AssistedFactory生成的工厂类补全这个依赖参数,最终注入失败。
修改步骤
- 第一步:放开构造函数中被注释的
communityFeedRepository参数,不要给这个参数加@Assisted注解。@AssistedInject会自动识别两类参数:加了@Assisted的是你运行时手动传入的参数,剩下未加注解的参数会自动从Hilt依赖图中获取实例,和普通@Inject构造的注入逻辑完全一致。
对应修改后的ViewModel核心代码:class CommunityFeedViewModel @AssistedInject constructor( @Assisted("preloadedTiles") private val preloadedTiles: List<Tile>, @Assisted("path") private val path: String, @Assisted("token") private val token: String?, private val communityFeedRepository: CommunityFeedRepository ) : ViewModel() { var tiles: List<Tile> = preloadedTiles private val vmPath = path var vmToken: String? = token private val tileState = MutableStateFlow(tiles) val til = tileState.asStateFlow() private suspend fun loadTiles() { communityFeedRepository.getCommunityFeedTiles(vmPath, vmToken).onSuccess { tileState.value = it.tiles vmToken = it.token } } init { viewModelScope.launch { if (tiles.isEmpty()) { loadTiles() } } } @AssistedFactory interface Factory { fun create( @Assisted("preloadedTiles") preloadedTiles: List<Tile>, @Assisted("path") path: String, @Assisted("token") token: String? ): CommunityFeedViewModel } @Suppress("UNCHECKED_CAST") companion object { fun provideFactory( assistedFactory: Factory, preloadedTiles: List<Tile>, path: String, token: String? ): ViewModelProvider.Factory = object : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return assistedFactory.create(preloadedTiles, path, token) as T } } } } - 第二步:给
CommunityFeedRepository配置正确的Hilt绑定,两种方式选一种即可:- 构造函数注入:直接给
CommunityFeedRepository的主构造函数加@Inject注解,Repository内部需要的其他依赖(比如网络服务、数据库Dao)Hilt会自动注入:class CommunityFeedRepository @Inject constructor( // 填入仓库自身需要的依赖 ) { // 仓库业务逻辑 } - Module绑定:如果不能直接修改Repository的构造函数,就在对应的Hilt Module里用
@Provides或者@Binds提供CommunityFeedRepository类型的实例。
- 构造函数注入:直接给
- 第三步:检查
ViewModelFactoryProvider入口点配置,确保返回类型和你定义的AssistedFactory完全匹配:
你Composable中通过EntryPoint获取工厂、手动创建ViewModel的逻辑不需要修改,配置完依赖绑定后就能正常运行。@EntryPoint @InstallIn(ActivityComponent::class) interface ViewModelFactoryProvider { fun communityFeedViewModelFactory(): CommunityFeedViewModel.Factory }
注意点
- 带命名标识的
@Assisted参数要保证构造函数声明和Factory接口的create方法中的注解完全匹配,你当前这部分写法没有问题。 - 不要给Hilt自动注入的依赖(比如这里的Repository)加
@Assisted注解,否则会要求你在调用create方法时手动传入该参数,反而破坏自动注入逻辑。
内容的提问来源于stack exchange,提问作者Jalson1982
相关产品推荐
相关产品推荐

