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

使用androidx.lifecycle:lifecycle.viewmodel.compose注入Hilt ViewModel失败原因

问题解答:Compose中使用lifecycle.viewmodel.compose获取@HiltViewModel实例失败的原因及解决方法

错误原因

  • 来自androidx.lifecycle:lifecycle.viewmodel.compose的viewModel()方法,默认使用系统自带的ViewModelProvider.Factory,这个工厂无法识别Hilt的@HiltViewModel注解,也没有权限访问Hilt的依赖注入容器来获取ViewModel构造所需的依赖,因此会抛出无法创建实例的RuntimeException。
  • 被@HiltViewModel标记的ViewModel,其构造过程完全由Hilt的DI容器管理,必须使用Hilt提供的专属ViewModelFactory才能完成实例化,普通的viewModel()方法不会自动关联这个Factory。

正确用法

如果坚持使用lifecycle.viewmodel.compose库的viewModel()方法,需要手动传入Hilt的ViewModelFactory:

// 在你的Composable函数中
val loginViewModel: LoginViewModel = viewModel(
    factory = defaultViewModelProviderFactory
)

注意:必须确保宿主组件(Activity/Fragment)已经添加了@AndroidEntryPoint注解,此时组件的defaultViewModelProviderFactory就是Hilt提供的Factory,能够正确创建带@HiltViewModel注解的ViewModel实例。

补充说明

androidx.hilt:hilt-navigation-compose库的hiltViewModel()方法是Hilt官方为Compose+Navigation场景封装的工具,内部自动绑定了Hilt的ViewModelFactory,同时适配了Navigation的ViewModelStoreOwner,能更安全便捷地获取ViewModel,推荐在导航场景下优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:27:01