Android Navigation 组件和 Viewmodel 之间会如何交互?

use*_*848 5 android-viewmodel android-architecture-navigation

Android Viewmodel 可以具有活动或片段的范围/生命周期,但这在导航组件中如何工作?

考虑我是否有以下情况:

主要活动 
 - 包含 NavHostFragment

客户列表片段 
 - 导航的起点
 - 单击列表中的任何客户,将导航 CustomerDetailsFragment

客户详细信息片段
 - 包含一个带有 3 个片段的选项卡:CustomerDetailFragment、CustomerContactFragment 和 CustomerOrderHistoryFragment

客户详细信息片段
 - 显示客户的一般信息,如姓名、年龄、性别等...
 - 从 CustomerViewModel 获取数据

客户联系片段
 - 显示客户地址、电话、传真等
 - 从 CustomerViewModel 获取数据

客户订单历史片段
 - 显示客户的订单历史
 - 从 OrderHistoryViewModel 获取数据

在上面的场景中,是否可以为 CustomerDetailFragment 和 CustomerContactFragment 共享相同的 CustomerViewModel 实例?

如果我没有使用导航组件,我可以让 CustomerDetailsFragment 成为一个活动并将我的视图模型初始化为该活动,但由于在导航中我们只有片段,我怎样才能最好地实现这一点?

我想:

公共类 CustomerDetailsFragment 扩展 Fragment {
...
CustomerViewModel 模型 = ViewModelProviders.of(this).get(CustomerViewModel .class);
...

但是如何将这个 viewmodel 实例传递给 CustomerDetailFragment 和 CustomerContactFragment?

或者有没有更好的方法来构造上面的代码以达到相同的结果?

小智 5

parentFragment您可以作为店主使用。Detail在你的和片段中调用它Contact。

CustomerViewModel model = ViewModelProviders.of(getParentFragment()).get(CustomerViewModel.class);
Run Code Online (Sandbox Code Playgroud)


kzo*_*tin 1

您的方案得到了很好的支持ViewModel。

您只需要获取具有活动范围的 ViewModel:ViewModelProviders.of(getActivity).get(...

更多信息在这里: https ://developer.android.com/topic/libraries/architecture/viewmodel#sharing