如何在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
相关产品推荐
相关产品推荐

