0

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

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

4

1 回答 1

2

根据撰写指南中的思考

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

那个应用状态就是真相的来源。这与应用程序架构指南相匹配,您的状态由负责实际获取、存储和缓存数据的较低级别组件拥有,然后将其暴露给 UI 层。负责获取、存储和缓存数据的这一层通常称为“存储库层”。

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

所以你的架构将包括三层:

  • 拥有您的条目列表的单个存储库。其中最简单的部分可能只是保存在内存中的列表mutableStateOf<List<Entry>>(),当数据随新列表发生变化时您会更新该列表。此类将负责与服务器通信、本地缓存等。
  • (可选,最佳实践)一层 ViewModel,一个用于屏幕 A,一个用于屏幕 B,仅公开该屏幕特别需要的存储库中的方法集(即,您的 ViewModel A 可能公开 a getEntries(),而 ViewModel B可能会暴露一个createEntry(Entry)方法。
  • 屏幕 A 和 B 只专注于显示从它们关联的 ViewModel 中检索到的数据。由于两者都在与同一个存储库层通信,因此创建条目的屏幕 B 将更新屏幕 A 将从中检索其数据的列表。
于 2021-05-16T06:10:50.833 回答