android runtime_error ai_generated true

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

其他格式: JSON · Markdown 中文 · English
88%修复率
90%置信度
1证据数
2023-04-10首次发现

版本兼容性

版本状态引入弃用备注
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.

generic

官方文档

https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-factories

解决方案

  1. 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) }'
  2. Use AndroidViewModel if the ViewModel needs Application context: 'class MyViewModel(application: Application) : AndroidViewModel(application)' and use by viewModels() without factory.

无效尝试

常见但无效的做法:

  1. 50% 失败

    The ViewModel may have null fields, causing NullPointerExceptions when accessed; it's a workaround but not a proper fix.

  2. 50% 失败

    The delegate uses NewInstanceFactory by default, which requires a no-arg constructor.