Как управлять обратной навигацией с помощью Jetpack Compose Навигация (без фрагментов)

#android #navigation #android-jetpack-compose #dagger-hilt #jetpack-compose-navigation

Вопрос:

Я пытаюсь перейти, скажем, с регистрации на панель мониторинга и далее, и запустить регистрацию, как только пользователь попадет на панель мониторинга, но все равно с помощью «обратного действия» я снова попадаю на регистрацию.

Вот пример кода:

 @AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            MainUI()
        }
    }
}
 
 @Composable
fun MainUI() {
    val navController = rememberNavController()

    NavHost(
        navController = navController,
        startDestination = "onboarding"
    ) {
        composable("onboarding") {
            Column {
                Text("I am on onboarding")
                Button(onClick = {
                    navController.navigate("dashboard") {
                        popUpTo("dashboard") // I want to get rid of onboarding here
                    }
                }) {
                    Text("go to dashboard")
                }
            }
        }
        composable("dashboard") {
            Column {
                Text("I am on dashboard")
                Button(onClick = {
                    navController.navigate("detail")
                }) {
                    Text("go to detail")
                }
            }
        }
        composable("detail") {
            Text("I am on detail")
        }
    }
}
 

Это тоже не работает

 navController.navigate("dashboard") {
    popUpTo("dashboard") {
            inclusive = true // no difference
        }

// ....

    popUpTo("onboarding") // also nothing

// ....

    popUpTo("onboarding") {
            inclusive = true // this crashes -> NavGraph cannot be cast to ComposeNavigator$Destination
        }

}

 

По какой-то причине этот вид работает, поэтому панель управления отключена, и из деталей я в конечном итоге попадаю на борт 🤦

 navController.navigate("detail") {
     popUpTo("dashboard") {
            inclusive = true
     }
}
 

Ответ №1:

Я нашел свое решение очень легко, если я ошибаюсь, пожалуйста, просветите меня.

 navController.popBackStack()
 

Ответ №2:

Вы можете использовать ссылку BackHandler:

 @Composable
    fun TestScreen() {
        BackHandler {
             // code
            // example - activity.finish()
        }
    }
 

Ответ №3:

Ну, я сам нашел рабочее решение, все еще не уверен, нужен ли этот «шаблонный код»: (Но это работает по назначению, означает, что «страница» закрывается после перехода с нее.

 NavHost(
        navController = navController,
        startDestination = "onboarding"
    ) {
        navigation(
            startDestination = "onboardingUI",
            route = "onboarding"
        ) {
            composable("onboardingUI") {
                Column {
                    Text("I am on onboarding")
                    Button(onClick = {
                        navController.navigate("dashboard"){
                            popUpTo("onboarding")
                        }
                    }) {
                        Text("go to dashboard")
                    }
                }
            }
        }
        navigation(startDestination = "dashboardUI", route = "dashboard") {
            composable("dashboardUI") {
                Column {
                    Text("I am on dashboard")
                    Button(onClick = {
                        navController.navigate("detail"){
                            popUpTo("dashboard")
                        }
                    }) {
                        Text("go to detail")
                    }
                }
            }
        }
        navigation(startDestination = "detailUI", route = "detail") {
            composable("detailUI") {
                Text("I am on detail")
            }
        }
    }
}

 

ПРИМЕЧАНИЕ: маршрут и начальное назначение, иначе называемое составным, не могут совпадать

Комментарии:

1. Вам просто нужно глубоко задуматься 😉