【问题标题】:How will the interaction between Android Navigation component and Viewmodel be?Android Navigation 组件与 Viewmodel 的交互会如何?
【发布时间】: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


【解决方案1】:

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

CustomerViewModel model = ViewModelProviders.of(getParentFragment()).get(CustomerViewModel.class);

【讨论】:

  • 我又遇到了同样的问题,你又帮了我!
  • 优秀。这回答了我上面的评论。
  • 这个策略现在正在分崩离析。导航主机片段的范围太不灵活。我希望流中的视图模型的多个实例仅在某些片段之间共享,但这是不可能的
【解决方案2】:

ViewModel 很好地支持您的方案。

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

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

【讨论】:

  • 这个策略应该如何处理视图模型的生命周期?当我们离开应用程序的客户部分时,CustomerViewModel 将保留在内存中,直到用户退出应用程序,除非我们以某种方式明确清除它
  • VM 应保持在 Activity 范围内(将与其生命周期相关联)
  • 由于使用 Android Navigation 只有一个 Activity,这意味着整个应用范围。我认为这不是一个好主意,因为共享视图模型永远无法释放内存
  • 在这种情况下,您应该有父片段和子片段 - 您应该将 VM 绑定到父片段范围(而不是整个 Activity)
  • 是的,我就是这么做的
猜你喜欢
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2012-05-21
  • 1970-01-01
相关资源
最近更新 更多