【发布时间】:2018-09-09 01:13:46
【问题描述】:
Android Viewmodel 可以具有 Activity 或 Fragment 的范围/生命周期,但这在 Navigation 组件中如何工作?
考虑我是否有以下情况:
主要活动 - 包含 NavHostFragment 客户列表片段 - 导航的起点 - 单击列表中的任何客户,将导航 CustomerDetailsFragment 客户详情片段 - 包含一个带有 3 个片段的选项卡:CustomerDetailFragment、CustomerContactFragment 和 CustomerOrderHistoryFragment CustomerDetailFragment - 显示客户的一般信息,如姓名、年龄、性别等... - 从 CustomerViewModel 获取数据 客户联系片段 - 显示客户地址、电话、传真等 - 从 CustomerViewModel 获取数据 客户订单历史片段 - 显示客户的订单历史 - 从 OrderHistoryViewModel 获取数据在上述场景中,是否可以为 CustomerDetailFragment 和 CustomerContactFragment 共享同一个 CustomerViewModel 实例?
如果我不使用导航组件,我可以让 CustomerDetailsFragment 成为一个活动并将我的视图模型初始化为该活动,但由于在导航中我们只有片段,我怎样才能最好地实现这一点?
我认为:
公共类 CustomerDetailsFragment 扩展片段 { ... CustomerViewModel 模型 = ViewModelProviders.of(this).get(CustomerViewModel .class); ...但是如何将这个视图模型实例传递给 CustomerDetailFragment 和 CustomerContactFragment?
或者有没有更好的方法来构造上面的代码以获得相同的结果?
【问题讨论】:
-
如果您想在 CustomerDetailFragment 和 CustomerContactFragment 中使用相同的视图模型实例,您需要将其附加到您的活动中,我认为这是唯一的选择。 CustomerViewModel 模型 = ViewModelProviders.of(getActivity()).get(CustomerViewModel .class);这是一个很好的解决方案。
-
在这种情况下,如果我有更大的 navigation_graph。 CustomerViewModel 的生命周期不会贯穿整个导航吗?
-
它会,这完全取决于你想要在片段之间共享什么信息,你可以有一个 MainViewModel 附加到你的活动,这个视图模型将包含客户列表,当用户点击任何客户时您将客户的 id 传递给 CustomerDetailsFragment,然后从那里传递给 CustomerDetailFragment 和 CustomerContactFragment,他们每个人都可以从 MainViewModel 客户列表中检索正确的客户(它将是同一个客户实例)。
标签: android-viewmodel android-architecture-navigation