【问题标题】:Compose navigate to screen that already in backstack撰写导航到已经在后台堆栈中的屏幕
【发布时间】:2021-08-19 11:02:19
【问题描述】:

我想要这样的导航:

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

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

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

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

我的导航主机:

    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)
        }
    }

指导我挖哪条路?

【问题讨论】:

    标签: android kotlin android-jetpack-compose android-jetpack-navigation


    【解决方案1】:

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

    【讨论】:

    • 是的,你是对的。但是由于我使用的是 Compose,我不需要使用任何片段和多个活动,那么我如何设法保留我的 VM 实例?在用户授权时重置 LoginVM、RegistrationVM 和 RecoveryVM 的所有字段似乎不是最佳解决方案。
    • 你必须。这就是这样做的方式。否则,您将需要手动销毁视图模型,然后在需要时重新创建,但为什么不在每个 VM 中创建一个简单的方法来一次重置所有值呢?
    • 这种方法迫使我为每个屏幕调用每个 VM(在这种情况下为 3 个 VM)的重置方法,这只是一个简单的示例。但是如果我在后台堆栈中有十个不同的屏幕,我想注销,在这种情况下,我需要重置所有的虚拟机。我认为这是一个容易出错的解决方案。
    • 我不认为这是最佳解决方案,我知道我需要将数据存储在我的虚拟机中,但是当您从一个选项卡导航到另一个选项卡时,内容会产生闪烁效果,动画会重新开始,卷轴失去了价值,我不认为这对用户有好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多