You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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绑定,两种方式选一种即可:
    1. 构造函数注入:直接给CommunityFeedRepository的主构造函数加@Inject注解,Repository内部需要的其他依赖(比如网络服务、数据库Dao)Hilt会自动注入:
      class CommunityFeedRepository @Inject constructor(
          // 填入仓库自身需要的依赖
      ) {
          // 仓库业务逻辑
      }
      
    2. Module绑定:如果不能直接修改Repository的构造函数,就在对应的Hilt Module里用@Provides或者@Binds提供CommunityFeedRepository类型的实例。
  • 第三步:检查ViewModelFactoryProvider入口点配置,确保返回类型和你定义的AssistedFactory完全匹配:
    @EntryPoint
    @InstallIn(ActivityComponent::class)
    interface ViewModelFactoryProvider {
        fun communityFeedViewModelFactory(): CommunityFeedViewModel.Factory
    }
    
    你Composable中通过EntryPoint获取工厂、手动创建ViewModel的逻辑不需要修改,配置完依赖绑定后就能正常运行。

注意点

  • 带命名标识的@Assisted参数要保证构造函数声明和Factory接口的create方法中的注解完全匹配,你当前这部分写法没有问题。
  • 不要给Hilt自动注入的依赖(比如这里的Repository)加@Assisted注解,否则会要求你在调用create方法时手动传入该参数,反而破坏自动注入逻辑。

内容的提问来源于stack exchange,提问作者Jalson1982

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:27:31