在目的地之间传递模型

Passing model between destinations

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

是否可以像 this 那样使用 NavHost 或以任何其他方式在导航目的地之间传递 ViewModel class?

根据 Thinking in Compose guide:

your composables are responsible for transforming the current application state into a UI every time the observable data updates.

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

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

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

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