在目的地之间传递模型

时间:2021-05-16 03:44:30

标签: android android-jetpack-compose android-jetpack-navigation jetpack-compose-navigation

我正在开发使用 Jetpack Compose 和 Jetpack Compose 导航的应用程序。在一个视图(目的地)中,我在条目上显示列表(我们称之为带有模型 A 的视图 A)。从这个视图用户可以转到创建视图(带有模型 B 的视图 B),在那里可以创建新条目。创建成功后,我想更新模型A中的列表,因此用户返回查看新创建的条目后无需刷新视图A。

是否可以使用 NavHost(例如 this)或以任何其他方式在导航目的地之间传递 ViewModel 类?

1 个答案:

答案 0 :(得分:2)

根据Thinking in Compose guide

<块引用>

您的可组合对象负责在每次可观察数据更新时将当前应用程序状态转换为 UI。

该应用程序状态是事实来源。这与 Guide to app architecture 匹配,其中您的状态由负责实际获取、存储和缓存数据的较低级别组件拥有,然后将这些数据公开给 UI 层。负责获取、存储和缓存数据的这一层通常称为“存储库层”。

这意味着直接在导航图中的目的地之间传递数据的快照是解决问题的完全错误的方法:它创建了一个真实来源问题(您相信在目的地或存储库之间发送的快照吗?)。答案始终相同:您的存储库应该始终是事实的来源,并且您应该永远在目标之间传递数据快照。这样,每个使用存储库作为其真实来源的屏幕自动都拥有最新信息,并且永远不需要“刷新”您的数据。

因此您的架构将包括三层:

  • 拥有您的条目列表的单个存储库。其中最简单的部分可能只是作为 mutableStateOf<List<Entry>>() 保存在内存中的列表,当数据随新列表更改时,您会更新该列表。该类将负责与服务器通信、本地缓存等。
  • (可选,也是最佳实践)一层 ViewModel,一个用于屏幕 A,一个用于屏幕 B,它们仅公开该屏幕特别需要的存储库中的一组方法(即,您的 ViewModel A 可能公开一个 { {1}},而 ViewModel B 可能会公开 getEntries() 方法。
  • 屏幕 A 和 B 仅专注于显示从其关联的 ViewModel 检索到的数据。由于两者都在与同一个存储库层通信,因此屏幕 B 创建一个条目将更新屏幕 A 将从中检索其数据的列表。