我有一个Activity和4个片段。起初我想为ViewModel的每个片段做一些事情。但情况是这样的,我还需要ViewModel for Activity。我想知道为View创建ViewModel并使用getActivity从片段调用必要的方法是错误的吗?例如,在片段中调用getActivity()。myViewModel.callMethod()?这种方法不会错吗?
分析解答
是的,您可以在片段中使用Activity的ViewModel,但不能像getActivity().myViewModel.callMethod()
那样。它应该是这样的
YourViewModel viewModel = ViewModelProviders.of(getActivity()).get(YourViewModel.class);
在片段之间共享数据是一种很好的做法。
这样,当每个片段都获得ViewModelProvider时,它们就会出现 接收相同的SharedViewModel实例,该实例的范围是这个 活动。
这种方法具有以下优点:
- 活动不需要做任何事情,或者对此有所了解 通讯。
- 碎片除此之外不需要彼此了解 SharedViewModel合约。如果其中一个片段消失了,那么 另一个像往常一样继续工作。
- 每个片段都有自己的生命周期, 并且不受另一个生命周期的影响。如果一个片段 替换另一个,UI继续工作没有任何问题。