java.lang.RuntimeException:当Android重新创建Activity和Fragment时,无法创建ViewModel类的实例

时间:2019-09-09 10:50:10

标签: android android-fragments android-viewmodel recreate viewmodelproviders

案例是Activity-Fragment的重现:我正在从ViewModel级别的活动context创建activity,并尝试访问{{1 }}级,使用ViewModel。of()。

下面的代码在很高兴的情况下有效;但是当重新创建活动(更改系统语言或权限)时,相同的代码不起作用,并且片段无法访问创建活动的viewModel。

ViewModel已参数化,只有一个主构造函数,并使用ViewModelProvider.Factory

进行了初始化。

ViewModel结构

Fragment

Activity的ViewModel初始化

ViewModelProvider

在片段访问ViewModel

class MessageViewModel(var message: MutableLiveData<String>): ViewModel() { ... }

错误

  

java.lang.RuntimeException:无法启动活动ComponentInfo {com.krp.android.viewmodeldemo / com.krp.android.viewmodeldemo.MainActivity}:java.lang.RuntimeException:无法创建com.krp类的实例。 android.viewmodeldemo.utility.MessageViewModel

1 个答案:

答案 0 :(得分:3)

如果已通过Factory初始化ViewModel,则无论任何上下文,都必须通过Factory访问它。当系统重新创建活动或片段时,似乎出现ViewModel问题。

它在Fragment正常工作

val viewModel = ViewModelProviders.of(activity, MessageVMFactory())
                .get(MessageViewModel::class.java)