Search code examples
android-jetpack-composeandroid-jetpack-navigationjetpack-compose-navigation

Compose navigation: How to avoid to add the current destination to the back queue once you navigate out of it?


The use case is the following:

  1. I have a back queue with already several destinations.
? -> ... -> ?
  1. A new destination, let's call it Foo screen, is shown and is currently at the top.
? -> ... -> ? -> F
  1. From the Foo screen I want to navigate to a new Bar screen but, depending on a certain condition, when navigating back I want to either go back to the Foo screen or skip the Foo screen and go directly to the previous screen in the queue.
if (skipFoo)
   ? -> ... -> ? -> B
else
   ? -> ... -> ? -> F -> B

Can this be achieved using the NavOptionsBuilder from androidx.navigation?

I know that I can use popUpTo(0) { inclusive = true } to remove everything but the new destination from the stack but I just want to prevent the current screen to be added when I'm navigating out of it, and only when a certain condition is satisfied.

Also, the content of the stack of destinations is dynamic (the Foo screen can be added at any time) so I can't simply hardcode a popUpToId with a fixed destination, since I don't know what is the destination immediately before Foo screen on the stack.


Solution

  • It can be done using popUpTo:

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