最佳实践:MVVM 如何在两个 Activity 之间传递数据

10
当前最佳实践是如何从一个活动(主活动)传递数据到另一个活动(详细活动)。
  1. 可能的方法是使用单个共享于主活动和详细活动的视图模型类,当在主活动中点击一个项目时,所选条目将被设置为视图模型。因此详细活动可以读取所选条目,因为它正在使用相同的视图模型。

  2. 将所选对象的行ID作为bundle-extra从主活动传递到详细活动。详细活动通过使用 ViewModelProviders 加载其视图模型,然后将行ID传递给视图模型,该视图模型加载实际记录。

  3. 在启动详细活动之前初始化视图模型,并直接将所选对象设置为详细活动的已初始化视图模型。

非常感谢您的输入!
3个回答

2
我曾经有同样的问题,并且Lyla Fujiwara的文章ViewModels: Persistence, onSaveInstanceState(), Restoring UI State and Loaders完美地回答了我的问题。该文章讨论了您可以持久化数据的不同方法,以及哪种方法最适合特定场合。
引用如下:

ViewModels会保存我的数据吗?简而言之,不会。请像往常一样进行持久化!

ViewModels是否可以替代onSaveInstanceState?简而言之,不能,但它们是相关的,请继续阅读。

我如何使用ViewModels有效地保存和还原UI状态?简而言之,您需要使用ViewModels、onSaveInstanceState()和本地持久化的组合。

ViewModels是否可以替代Loaders?简而言之,是的,ViewModels与其他几个类结合使用可以替代Loaders。

这些都是与您所问的问题有关的简明答案。如果您阅读实际文章,她会为每个问题提供解释。

2

您的详细活动应该能够从保存的状态中重建自身。例如,当您的详细信息在前台而屏幕关闭时,您的整个应用程序可能会从内存中清除。当屏幕重新开启时,Android仅会启动您的详细活动,并期望它从已保存的状态中获取所需内容。

因此,任何依赖于主设置数据进入单例/全局位置的设计都不是很好。对我来说还不太清楚,但似乎这就是您在(1)和(3)中所建议的。

在传递到详细活动的额外内容中设置行ID。使用详细保存状态保存/恢复该行ID。让详细活动基于行ID构建自己的模型。这使得详细信息独立,因为它不会依赖于其他初始化某些复杂模型才能启动的东西。这也使其更具模块化和可测试性。


0

我有两种方法来解决这个问题:

1.使用静态对象在两个活动之间共享数据

  1. 或者使用共享首选项、Room...Realm

否则,您的活动必须触发ViewModel和Repository。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接