Kotlin中使用Room数据库创建ViewModel实例失败求助
解决ViewModel实例创建失败:Cannot create an instance of class CarViewModel
你的问题出在CarViewModel使用了带Application参数的构造函数,但默认的ViewModelProvider.Factory无法自动提供这个参数,导致实例创建失败。以下是两种可行的解决方法:
方法一:使用AndroidViewModelFactory(最简单的方案)
直接用系统提供的AndroidViewModelFactory,它会自动传入Application实例,修改Fragment中的ViewModel创建代码:
carViewModel = ViewModelProvider( this, ViewModelProvider.AndroidViewModelFactory.getInstance(requireActivity().application) )[CarViewModel::class.java]
方法二:自定义ViewModelFactory(适配更复杂的参数场景)
如果后续你的ViewModel需要更多自定义参数,推荐使用自定义Factory:
- 先创建Factory类:
class CarViewModelFactory(private val application: Application) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(CarViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return CarViewModel(application) as T } throw IllegalArgumentException("无法识别的ViewModel类") } }
- 在Fragment中使用该Factory创建ViewModel:
carViewModel = ViewModelProvider( this, CarViewModelFactory(requireActivity().application) )[CarViewModel::class.java]
补充说明
之前未接入数据库时,你的ViewModel可能是无参构造,默认Factory可以正常创建实例;接入数据库后ViewModel需要Application来初始化Room数据库,此时必须使用能处理参数的Factory才能完成实例创建。
内容的提问来源于stack exchange,提问作者Utis
相关产品推荐
相关产品推荐

