[英]How to handle back navigation with Jetpack Compose + Navigation (without fragments)
我正在尝试导航让我们说从入职到仪表板和其他地方,并在用户点击仪表板后弹出入职,但仍然使用“后退操作”我最终再次入职。
这是示例代码:
@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
}
}
您可以使用 BackHandler Link :
@Composable
fun TestScreen() {
BackHandler {
// code
// example - activity.finish()
}
}
好吧,我自己找到了可行的解决方案,仍然不确定是否需要这个“样板代码”:(但这按预期工作,意味着一旦从中导航“页面”就会被解除。
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")
}
}
}
}
注意:可组合的路由和startDestination AKA 名称不能相同
我发现我的解决方案很简单,如果我错了,请赐教。
navController.popBackStack()
正如@James Christian Kaguo 已经说过navController.popBackStack()
是一个选项。 但是使用这种方法时必须小心。 由于某种原因,BackQueue 的大小至少为 2,如果弹出的 backstack 低于该值,导航似乎不再起作用。
因此我写了以下简单的扩展 function:
fun NavController.navigateBack() {
if (backQueue.size > 2) {
popBackStack()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.