案例是 Activity-Fragment
重新创建:我正在从 activity
级别的 Activity context
创建 ViewModel
并且尝试使用 ViewModelProvider
.of() 在 Fragment
级别访问初始化的 ViewModel
。
下面的代码适用于快乐的情况;但是当重新创建 Activity 时(更改系统语言或权限),相同的代码不起作用,并且 fragment 无法访问创建的 Activity View 模型。
ViewModel 是参数化的,只有一个主构造函数,并使用 ViewModelProvider.Factory 进行初始化
View 模型结构
class MessageViewModel(var message: MutableLiveData<String>): ViewModel() { ... }
Activity 中的 ViewModel 初始化
val viewModel = ViewModelProviders.of(this, MessageVMFactory())
.get(MessageViewModel::class.java)
在 Fragment 中访问 ViewModel
val viewModel = ViewModelProviders.of(activity)
.get(MessageViewModel::class.java)
错误
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.krp.android.viewmodeldemo/com.krp.android.viewmodeldemo.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.krp.android.viewmodeldemo.utility.MessageViewModel
最佳答案
如果您已通过工厂初始化 ViewModel,则无论上下文如何,都必须通过工厂访问它。当系统重新创建 Activity 或 fragment 时,似乎是 ViewModel 问题。
它在 Fragment 中运行良好
val viewModel = ViewModelProviders.of(activity, MessageVMFactory())
.get(MessageViewModel::class.java)
关于android - android重新创建Activity和Fragment时java.lang.RuntimeException : Cannot create an instance of class ViewModel,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57852512/