我有一个关于如何处理项目中特定情况的后退导航的问题。基础知识看起来像这样:
我有一个教程(全部用 Compose 编写),分为三个不同的部分,每个部分都有自己的视图模型和导航图。这是它的大致样子:
@Composable
Section1HostScreen() {
val section1VM: Section1ViewModel
NavHost() {
composable<ScreenA>
composable<ScreenB>
composable<ScreenC>
composable<ScreenD>
composable<Section2HostScreen>
}
}
一旦我们导航到
Section2HostScreen
,我们就会得到与第一部分的主机屏幕类似的设置,带有 Section2ViewModel
和一系列屏幕,然后将进入第 3 部分的主机屏幕。
我遇到的问题是,如果用户从第 2 部分的初始
Screen E
导航回来,我希望他们能够返回到第 1 部分中的 ScreenD
,并显示他们离开时的 UI 状态,这目前不起作用,因为视图模型现在已经消失了。
实现这一目标的最佳方法是什么?我所面临的唯一限制是我需要将视图模型分开,因此我无法使用一个视图模型来管理整个教程流程,因为当多人进行更改时,会导致臃肿且难以解决合并冲突。感谢您的帮助。
您当前的设置将有一个非常深的 backStack。想象一下,如果您有 10、15 个部分,导航图会是什么样子。我建议您使用嵌套图或拥有一个托管所有部分的父级 NavHost,并将导航逻辑传递到每个部分的第一个和最后一个屏幕。
关于保留 UI 状态,如果您想“永久”保留 UI 状态(即用户从 Screen7 返回到 Screen1 并仍然具有相同的状态),您可以实现一个小型数据库或 DataStore 来获取简单值只需让您的 ViewModel 从中获取状态即可。如果您只想在背靠背屏幕上保留简单状态,那么您可以为您的 ViewModel 实现 SavedStateHandle