【问题标题】:Shared viewmodel between fragments, without scoping to the activity? [duplicate]片段之间共享视图模型,而不限定活动范围? [复制]
【发布时间】:2018-12-12 16:35:46
【问题描述】:

使用新的导航架构组件,我将单个活动作为导航主机,并为我的屏幕提供多个片段。现在我有一个 EditProfileFragment,用户可以在其中单击一个按钮并打开另一个片段,其中包含一个可供选择的国家/地区列表。假设我想将该国家/地区选择的结果分享回 EditProfileFragment。总体思路是,我将为所有“编辑配置文件”操作使用一个 EditProfileViewModel。

  1. 如何在这些片段之间共享所选国家/地区?我正在考虑使用共享视图模型,但我不愿将其限定为活动,因为我不希望它在用户完成“编辑配置文件”流程时持续存在。

  2. 还有其他我应该考虑的干净/推荐的方法吗?也许是一个暂时持有该值的单身人士?

【问题讨论】:

  • 完成后你能把它清除掉吗?或者在创建新片段时传递一个标志以重新开始并忽略任何陈旧/瞬态数据?
  • @Mateo 是的,我可以。我只是想知道是否有更清洁的解决方案
  • @papageorgiouk 你找到解决这个问题的好方法了吗?我面临着完全相同的情况,国家选择器片段:)
  • @DaTi 我采用了存储库模式并拥有一个用于临时保持共享状态的对象。 ViewModel 和 View(controller) 之间应该是一对一的关系,所以我认为这是最好的方法。

标签: android android-fragments android-architecture-components android-viewmodel android-architecture-navigation


【解决方案1】:

使用共享视图模型确实更容易,但正如您所说,它带来了其他问题,例如将视图模型范围限定为更高的上下文以进行简单的信息交换。

恕我直言,共享视图模型在某些情况下并不是一个坏方法。我正在开发一个有 5 个选项卡的应用程序,第一个选项卡就像第二个和第三个选项卡的摘要。使用共享视图模型是一个不错的选择,因为我只是重用了数据,只是改变了适配器在相应视图中显示的项目数,逻辑被重用了。

听起来您的个人资料和个人资料编辑页面中有共同的逻辑/项目。我不知道有多少,但是如果您觉得在这两者之间共享视图模型还不够,请记住,仅仅因为您正在使用视图模型并不意味着您必须使用它们来共享/存储/传递一些数据。例如:

  • 使用采集的数据导航到上一个片段。
  • 您可以将“配置文件”保存到持久性并更改存储的内容。当您的配置文件视图模型(重新)创建时,它会从持久性中获取最新值。
  • 您可以直接在服务器中更新您的个人资料,然后在个人资料上再次获取。
  • 您可以将以上两者混合使用。

【讨论】:

  • 不幸的是,持久性不是一种选择。
  • 你有任何类型的 DI 吗?您可以将配置文件模型范围限定为活动,以便片段将获得相同的实例。
  • 活动范围不是问题。但是我的应用是单活动的(带有新的导航组件),所以我宁愿不将其范围限定为该活动(这实际上意味着它将是应用范围的)
  • 对不起,我认为“模型”在这种情况下有点混乱,我的意思是配置文件实体,而不是视图模型。
【解决方案2】:

回答我自己关于如何解决此问题以供将来参考的问题:

因为我想保持 ViewModel-View(controller)/Fragment 之间的一对一关系,所以我选择了一个 UserRepository,它在这种情况下拥有一个“临时状态”对象。

【讨论】:

  • 感谢分享。你能提供更多关于你的UserRepository的信息吗?它有什么范围?您何时创建它以及如何设法清除临时状态?
  • @konata App-scoped 并让 Dagger 随时对其进行初始化。临时状态是实现构建器模式的内部类对象,并在我们完成后手动处理。
猜你喜欢
  • 2019-10-20
  • 2015-04-07
  • 1970-01-01
  • 2019-05-17
  • 2018-02-26
  • 2018-07-30
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多