#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. Вам просто нужно глубоко задуматься 😉