android - 在不同的片段上使用相同的视图模型
问题描述
我在片段 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()
解决方案
如果这两个片段在同一个活动中,您应该替换它:
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
推荐阅读
- c++ - 有希望在不久的将来将 std::bitset<128> 转换为单个 128 位整数吗?
- reactjs - 从一个表中获取另一个表中没有对应外键的项目
- bash - 在函数中导出的 bash 脚本中的变量
- react-native - 胜利图 - 值未正确对齐
- r - 如何使用不同的颜色来表示 R 中的几列分类二进制数据?
- angular - 插入自定义值作为 ngselect 角度包中的第一项
- r - R - 如何创建序列
- r - 如何创建直接链接到 URL 的 Rmarkdown 提取文章
- c - 如何通过管道()从子进程(exec)与父进程通信?
- sql-server - 将 nvarchar 转换为数字时出错。将逗号内的 nvarchar 转换为十进制时