首页 > 解决方案 > 在不同的片段上使用相同的视图模型

问题描述

我在片段 A 上有 viewModel,我以这种方式加载它:

viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)

然后从片段A,我去片段B。这可以在片段B上使用相同的视图模型吗?在 Fragment BI 中尝试过(如在文档中):

private val viewModel: AFragmentVM by activityViewModels()

但是在尝试使用此 ViewModel 时出现异常:

java.lang.RuntimeException: Cannot create an instance of class ...AFragmentVM
...
BFragment.getViewModel(Unknown Source:2)
BFragment.onCreateView(ChartFragment.kt:40)
...
Caused by: java.lang.NoSuchMethodException: ...AFragmentVM.<init> [class android.app.Application]

编辑:

基于@SebastienRieu 和@IntelliJ Amiya 的回答,我所要做的就是以这种方式在片段A 上创建ViewModel:

viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(AFragmentVM::class.java)

或者:

viewModel  = ViewModelProvider(let {activity}!!,viewModelFactory).get(AFragmentVM::class.java)

然后在 Fragment BI 上可以使用:

private val viewModel: AFragmentVM by activityViewModels()

标签: androidkotlinmvvmviewmodel

解决方案


如果这两个片段在同一个活动中,您应该替换它:

viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)

这样

viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(AFragmentVM::class.java)

并在活动中添加一个 viewModel 并在此活动中初始化它,如下所示:

viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)

使用requireActivity()在片段中设置 VM 时,您可以告诉片段使用活动共享 ViewModel


推荐阅读