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

如何在Jetpack Compose中使用Dagger Hilt注入带参数的依赖?

在Jetpack Compose中使用Dagger Hilt注入带参数的ViewModel(AssistedInject)

针对你遇到的在Composable内无法通过AssistedInject注入带参数ViewModel的问题,以下是可行的解决方案:

前提确认

确保你的项目已正确配置Dagger Hilt依赖,且承载Compose的Activity已添加@AndroidEntryPoint注解(Hilt的入口点要求)。

正确实现步骤

1. 保持原有ViewModel与AssistedFactory定义

你的ViewModel和AssistedFactory代码无需修改:

class MyViewModel @AssistedInject constructor(@Assisted myValue: Int) : ViewModel() {
    // ViewModel业务逻辑
}

@AssistedFactory
interface MyViewModelAssistedFactory {
    fun create(myValue: Int): MyViewModel
}

2. 在入口Activity中注入工厂并传递给Composable

由于Composable无法直接使用@Inject注入依赖,需要从Hilt管理的入口点(如Activity)获取工厂实例,再传递给Composable:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    @Inject
    lateinit var viewModelFactory: MyViewModelAssistedFactory

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            YourAppTheme {
                MyScreen(initValue = 4, viewModelFactory = viewModelFactory)
            }
        }
    }
}

3. 在Composable中创建ViewModel实例

通过viewModel()函数传入自定义Factory,利用AssistedFactory创建带参数的ViewModel:

@Composable
fun MyScreen(initValue: Int, viewModelFactory: MyViewModelAssistedFactory) {
    // 创建带参数的ViewModel实例
    val viewModel: MyViewModel = viewModel(
        factory = object : ViewModelProvider.Factory {
            override fun <T : ViewModel> create(modelClass: Class<T>): T {
                return viewModelFactory.create(initValue) as T
            }
        }
    )

    // 后续使用viewModel处理业务逻辑
    // 示例:Text(text = "初始化值: $initValue")
}

为什么原有方案在Composable中无效?

Composable函数不能直接使用@Inject注解注入依赖,原因在于:

  • Hilt的依赖注入生命周期与Composable的重组生命周期不兼容,无法自动注入Composable内的字段
  • Composable不属于Hilt依赖注入图中的常规组件(如Activity、Fragment、ViewModel),无法直接获取注入实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:36:21