通过代码设置setStartDestination后popBackStack()返回false无响应求助
问题原因
当你通过重新inflate导航图并设置navController.graph = navGraph时,原有的回退栈会被完全清空,此时调用popBackStack()自然没有可回退的目的地,因此返回false。
解决方案
方案一:直接修改现有导航图的起始目的地(推荐)
不需要重新创建整个导航图,直接修改当前导航图的startDestination,这样会保留原有的回退栈:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController // 直接修改已加载的导航图的起始目的地,回退栈不受影响 navController.graph.setStartDestination(R.id.any_destination)
方案二:通过navigate跳转并保留回退栈
如果只是需要跳转到目标页面并支持回退,无需修改startDestination,直接使用navigate()方法即可,目标页面会自动加入回退栈:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController // 跳转到目标页面,自动加入回退栈 navController.navigate(R.id.any_destination)
若需要将目标页面设为新的"首页",同时保留回退到原首页的能力,可以搭配popUpTo参数:
navController.navigate(R.id.any_destination) { // 回退到原起始目的地,但不包含它(即原起始目的地会留在回退栈中) popUpTo(R.id.default_start_destination) { inclusive = false } }
方案三:重新创建导航图后手动恢复回退栈
如果必须重新inflate导航图(比如加载不同的导航配置),可以先保存原回退栈的目的地信息,再手动构建新的回退栈:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController // 保存原回退栈的所有目的地ID(包含当前显示的页面) val originalDestinations = mutableListOf<Int>() navController.backStack.forEach { entry -> originalDestinations.add(entry.destination.id) } navController.currentDestination?.id?.let { originalDestinations.add(it) } // 重新创建导航图并设置起始目的地 val navGraph = navController.navInflater.inflate(R.navigation.nav) navGraph.setStartDestination(R.id.any_destination) navController.graph = navGraph // 手动恢复回退栈 originalDestinations.forEachIndexed { index, destId -> val destination = navGraph.findNode(destId) ?: return@forEachIndexed if (index == originalDestinations.size - 1) { // 最后一个是当前页面,直接跳转过去 navController.navigate(destination.id) } else { // 将之前的目的地添加到回退栈 val backStackEntry = navController.createBackStackEntry(destination, null) navController.backStack.add(backStackEntry) } }
内容的提问来源于stack exchange,提问作者Amay Diam
相关产品推荐
相关产品推荐

