7

I am using Jetpack Compose ui version 1.3.0-beta08 and navigation compose version 2.4.0-alpha02 and working Bloom app with all new Architecture components. After login success I need to clear all previous compose login screens, but even added popUpTo("HomeScreen"){inclusive = true}, my login screen removed from backstack, but login welcome screen not removed from backstack, when I click back from Home screen. is it anything I am missing/wrong in compose navigation?

composable(Screen.LoginScreen.route) {
                LoginScreen {
                    Log.d("AppMainNavigation", "AppMainNavigation: ${navController.backQueue}")
                    navController.navigate(Screen.HomeBaseScreen.route){
                        popUpTo(Screen.LoginScreen.route){
                            inclusive = true
                        }
                        launchSingleTop = true
                    }
                }
            }

GitHub Link : https://github.com/rramprasad/BloomApp/blob/main/app/src/main/java/dev/ramprasad/bloom/MainActivity.kt

Ramprasad
  • 7,981
  • 20
  • 74
  • 135

2 Answers2

2

update your jetpack compose version to the latest release preview version and all other dependencies. current jetpack composes version: 1.0.0-rc02

and also which screen you want to popup just use this

my splash screen code:

 @Composable
 fun Navigate(navController: NavController) {
    produceState(initialValue = -1) {
        delay(1500)
        navController.popBackStack()
        val route = if (Firebase.auth.currentUser == null) AppRouter.Intro.route else AppRouter.Home.route
        navController.navigate(route)
    }
 }

so here you can use this below line to remove screen from backstack

navController.popBackStack()
Ole Pannier
  • 3,208
  • 9
  • 22
  • 33
Nafis Kabbo
  • 568
  • 5
  • 8
  • Unfortunately, this is doesn't help. My case is - I have a drawer with several items. And I want each item to clear the backstack. So when user clicks back on that screen - he finishes the app. As a last resort, I will listen to back click... But ideally, would like to solve this with navigation. – Alex Zaitsev Jul 27 '21 at 13:35
  • @rocknow did you figure out? – Gunhan Nov 24 '21 at 11:55
  • @rocknow did you find it? – Ammar Mar 06 '23 at 14:10
0

Use WelcomeScreen's route as a parameter in popUpTo function. It clears all backstack's entries before WelcomeScreen, and if inclusive = true then WelcomeScreen too.

navController.navigate(Screen.HomeBaseScreen.route) {
    popUpTo(Screen.WelcomeScreen.route) { inclusive = true }
}

Also, if you use parameters in the route, you have to use them in popUpTo as well.

navController.navigate(Screen.HomeBaseScreen.route) {
    popUpTo(Screen.WelcomeScreen.route + "/{someId}") { inclusive = true }
}