繁体   English   中英

撰写导航到已经在后台堆栈中的屏幕

[英]Compose navigate to screen that already in backstack

我想要这样的导航:

-我有三个屏幕:“登录”、“注册”和“帐户恢复”;

- 从每个屏幕,我可以导航到任何其他屏幕;

- 当我从“登录”屏幕导航到“注册”然后返回“登录”(单击“转到登录”按钮)时,我希望拥有与开始时相同的屏幕,而不是新屏幕。

现在,每次,当我回到“登录”时,我都会看到一个新屏幕:(

我的导航主机:

    val navController = rememberNavController()

    NavHost(navController = navController, startDestination = Screens.Login.route) {
        composable(route = Screens.Recovery.route) {
            RecoveryScreen(navController = navController)
        }
        composable(route = Screens.Login.route) {
            LoginScreen(navController = navController)
        }
        composable(route = Screens.Registration.route) {
            RegistrationScreen(navController = navController)
        }
    }

指导我用什么方法挖?

你怎么知道是新屏? 让我猜猜,你一定在看屏幕的某些状态,例如,填充的文本字段会是空的,滚动的列表会被重置,复选框会被重置或类似的东西。 您会看到是否从后台调用这些东西并不重要。 问题是,当 Composable 在屏幕上不再可见时,它就会被销毁,将所有状态重置为默认值。 也就是说,它总是会根据导航请求进行重组。 您需要在这里将所有状态存储在视图模型中。 然后,从视图模型本身引用状态。 在视图模型中使用默认值创建状态变量,然后始终从视图模型本身引用。 这样,在重组时,数据将从 vm 中获取,并且它仍然是正确的数据,因为 vm 没有被破坏。

我迟到了,但它可能有助于有人检查 GitHub 中的 Jetnews 示例应用程序,像这样导航

navController.navigate(JetnewsDestinations.HOME_ROUTE) {
            // Pop up to the start destination of the graph to
            // avoid building up a large stack of destinations
            // on the back stack as users select items
            popUpTo(navController.graph.findStartDestination().id) {
                saveState = true
            }
            // Avoid multiple copies of the same destination when
            // reselecting the same item
            launchSingleTop = true
            // Restore state when reselecting a previously selected item
            restoreState = true
        }

这避免了多个返回堆栈也恢复了先前打开的目的地的状态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM