java.lang.RuntimeException: 无法创建类 com.example.MyViewModel 的实例。位于 androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221) ... 原因:java.lang.InstantiationException: java.lang.Class<com.example.MyViewModel> 没有零参数构造函数
java.lang.RuntimeException: Cannot create an instance of class com.example.MyViewModel. at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221) ... Caused by: java.lang.InstantiationException: java.lang.Class<com.example.MyViewModel> has no zero argument constructor
ID: android/viewmodel-factory-required
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| Lifecycle 2.5 - 2.7 | active | — | — | — |
| AndroidX Activity 1.7 - 1.8 | active | — | — | — |
根因分析
使用了 ViewModelProvider.NewInstanceFactory,但 ViewModel 类具有参数化构造函数,需要自定义 ViewModelProvider.Factory 或 Hilt/AndroidViewModel。
English
ViewModelProvider.NewInstanceFactory is used but the ViewModel class has a parameterized constructor, requiring a custom ViewModelProvider.Factory or Hilt/AndroidViewModel.
官方文档
https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-factories解决方案
-
Create a custom ViewModelProvider.Factory: 'class MyViewModelFactory(private val repository: Repository) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return MyViewModel(repository) as T } }' and pass it to viewModels(): 'val viewModel: MyViewModel by viewModels { MyViewModelFactory(repository) }' -
Use AndroidViewModel if the ViewModel needs Application context: 'class MyViewModel(application: Application) : AndroidViewModel(application)' and use by viewModels() without factory.
无效尝试
常见但无效的做法:
-
50% 失败
The ViewModel may have null fields, causing NullPointerExceptions when accessed; it's a workaround but not a proper fix.
-
50% 失败
The delegate uses NewInstanceFactory by default, which requires a no-arg constructor.