【问题标题】:Compose navigation: How to avoid to add the current destination to the back queue once you navigate out of it?组合导航:如何避免在导航出当前目的地后将其添加到后台队列?
【发布时间】:2023-02-25 22:07:37
【问题描述】:

用例如下:

  1. 我有一个已经有几个目的地的后排队列。
    ? -> ... -> ?
    
    1. 一个新的目的地,我们称之为 Foo 屏幕,显示并且当前位于顶部。
    ? -> ... -> ? -> F
    
    1. 我想从 Foo 屏幕导航到新的 Bar 屏幕,但根据特定条件,当导航返回时我想返回 Foo 屏幕或跳过 Foo 屏幕并直接转到之前的屏幕队列。
    if (skipFoo)
       ? -> ... -> ? -> B
    else
       ? -> ... -> ? -> F -> B
    

    这可以使用 androidx.navigation 中的 NavOptionsBuilder 来实现吗?

    我知道我可以使用 popUpTo(0) { inclusive = true } 从堆栈中删除除新目的地以外的所有内容,但我只想防止在我导航出当前屏幕时添加当前屏幕,并且只有在满足特定条件时才添加。

    此外,目的地堆栈的内容是动态的(可以随时添加 Foo 屏幕)所以我不能简单地用固定目的地硬编码 popUpToId,因为我不知道之前的目的地是什么堆栈上的 Foo 屏幕。

【问题讨论】:

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


    【解决方案1】:

    可以使用popUpTo来完成:

    navController.navigate(Screens.Bar.route) {
        popUpTo(Screens.Foo.route) {
            inclusive = true
        }
    }
    

    【讨论】:

      【解决方案2】:

      它可以通过以下代码来实现。它帮助了我。

      示例 1:

      在导航到“朋友列表”目的地之前,将所有内容从返回堆栈弹出到“家”目的地

      navController.navigate("friendslist") {
          popUpTo("home")
      }
      

      示例 2:

      在导航到“朋友列表”目的地之前,将包括“家”目的地在内的所有内容都从返回堆栈中弹出

      navController.navigate("friendslist") {
          popUpTo("home") { inclusive = true }
      }
      

      示例 3:

      只有当我们不在“搜索”目的地时才导航到“搜索”目的地,避免在返回堆栈顶部出现多个副本

      navController.navigate("search") {
          launchSingleTop = true
      }
      

      参考资料:https://developer.android.com/jetpack/compose/navigation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 2012-11-18
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多