android - android重新创建Activity和Fragment时java.lang.RuntimeException : Cannot create an instance of class ViewModel,

标签 android android-fragments android-viewmodel recreate viewmodelproviders

案例是 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/

相关文章:

android - 如何在没有播放服务的情况下让 Android 定位工作?

java - 如何知道 Android 手机是否启用了流量节省功能

java - 多次添加后引用 fragment

android - 尝试在空对象引用上调用虚方法 'void android.arch.lifecycle.LiveData.observe

android - 从不同的 LiveData 源填充适配器

android - 将 viewModelScope 与 LiveData 一起使用时出现问题

android - Dagger2 继承的子组件多重绑定(bind)

java - 将游标与 AsyncTask 一起使用

android - 防止 ViewPager 破坏屏幕外 View

android - 如何观察PagedList数据?