【问题标题】:java.lang.RuntimeException: Cannot create an instance of class ViewModel, when android recreates Activity and Fragmentjava.lang.RuntimeException:无法创建类 ViewModel 的实例,当 android 重新创建 Activity 和 Fragment
【发布时间】:2020-01-11 03:10:19
【问题描述】:

案例是Activity-Fragment 重新创建:我正在从activity 级别的活动context 创建ViewModel,并尝试使用Fragment 级别访问初始化的ViewModel,使用ViewModelProvider.of() .

下面的代码在快乐的情况下工作;但是当重新创建活动(更改系统语言或权限)时,相同的代码不起作用,并且片段无法访问活动创建的视图模型。

ViewModel 是参数化的,只有一个主构造函数,并使用 ViewModelProvider.Factory 进行初始化

ViewModel 结构

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:无法启动活动 ComponentInfo{com.krp.android.viewmodeldemo/com.krp.android.viewmodeldemo.MainActivity}:java.lang.RuntimeException:无法创建 com.krp 类的实例。 android.viewmodeldemo.utility.MessageViewModel

【问题讨论】:

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


    【解决方案1】:

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

    它在 Fragment 时可以正常工作

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

    【讨论】:

    • 感谢分享,我们经常卡这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多