我正在开发使用 Jetpack Compose 和 Jetpack Compose Navigation 的应用程序。在一个视图(目的地)中,我正在显示条目列表(我们称其为带有模型 A 的视图 A)。从这个视图用户可以转到创建视图(视图 B 和模型 B),可以在其中创建新条目。创建成功后,我想更新模型A中的列表,所以用户返回查看新创建的条目后不需要刷新视图A。
是否可以像这样或以任何其他方式使用 NavHost 在导航目的地之间传递 ViewModel 类?
我正在开发使用 Jetpack Compose 和 Jetpack Compose Navigation 的应用程序。在一个视图(目的地)中,我正在显示条目列表(我们称其为带有模型 A 的视图 A)。从这个视图用户可以转到创建视图(视图 B 和模型 B),可以在其中创建新条目。创建成功后,我想更新模型A中的列表,所以用户返回查看新创建的条目后不需要刷新视图A。
是否可以像这样或以任何其他方式使用 NavHost 在导航目的地之间传递 ViewModel 类?
根据撰写指南中的思考:
每次可观察数据更新时,您的可组合组件负责将当前应用程序状态转换为 UI。
那个应用状态就是真相的来源。这与应用程序架构指南相匹配,您的状态由负责实际获取、存储和缓存数据的较低级别组件拥有,然后将其暴露给 UI 层。负责获取、存储和缓存数据的这一层通常称为“存储库层”。
这意味着在导航图中的目的地之间直接传递数据快照完全是解决问题的错误方法:它会产生真实来源问题(您信任在目的地或存储库之间发送的快照吗?)。答案总是一样的:你的存储库应该永远是事实的来源,你永远不应该在目的地之间传递数据的快照。这样,使用存储库作为其真实来源的每个屏幕都会自动拥有最新信息,并且永远不需要“刷新”您的数据。
所以你的架构将包括三层:
mutableStateOf<List<Entry>>()
,当数据随新列表发生变化时您会更新该列表。此类将负责与服务器通信、本地缓存等。getEntries()
,而 ViewModel B可能会暴露一个createEntry(Entry)
方法。