使用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
相关产品推荐
相关产品推荐

