android - 在 Fragment 中构造 ViewModelProvider 时,应该传入 Fragment 还是 Activity?
问题描述
我想知道,对于以下 2 个代码片段,推荐的方式是什么?
构造 ViewModelProvider 时使用 Fragment
public class MyFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ViewModelProvider viewModelProvider = new ViewModelProvider(this);
tabInfoViewModel = viewModelProvider.get(TabInfoViewModel.class);
}
构造ViewModelProvider时使用Activity
public class MyFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ViewModelProvider viewModelProvider = new ViewModelProvider(getActivity());
tabInfoViewModel = viewModelProvider.get(TabInfoViewModel.class);
}
两种代码都是可行的。但是,哪个是“更正确”的方式?
解决方案
一个活动中的两个或多个片段需要相互通信是很常见的。这绝不是微不足道的,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起。此外,两个片段都必须处理另一个片段尚未创建或不可见的情况。
这个常见的痛点可以通过使用 ViewModel 对象来解决。想象一个主从片段的常见情况,我们有一个片段,其中用户从列表中选择一个项目,另一个片段显示所选项目的内容。
这些片段可以使用它们的活动范围共享一个 ViewModel 来处理这种通信。
它将让您ViewModel
在同一活动的不同片段之间可用。在同一活动的片段之间传输数据将很有帮助。
tabInfoViewModel = ViewModelProviders.of(getActivity()).get(TabInfoViewModel.class);
推荐阅读
- html - 右键单击>编辑未显示在 HTML 文档上
- html - 制作引导 4 输入,如材质搜索字段、过渡动画问题
- flutter - ios/Flutter/Debug.xcconfig:3:在搜索路径中找不到包含的文件“Pods-Runner.debug.xcconfig”(在项目“Runner”的目标“Runner”中)
- r - Advanced R 中修改列表的示例
- javascript - 相当于 vue.js 中 jquery 的 $(this) 引用
- php - 我的网站无法发送带有 html 和 php 的邮件
- python - 如何在 Tensorflow 中正确打乱我的数据
- python - 以静默模式运行 adb 命令(无输出)
- mysql - MySQL - 无法创建 1:1 关系
- python - 用于将 CSV 文件插入 MySQL 表的 Python 代码未按预期工作