compose-navigation alpha09导航时如何移除栈内Splash页避免返回回退
alpha09 版本的导航组件不支持手动操作导航图、在导航回调里直接清图的写法,你之前尝试的三类方法全部失效的核心原因,是导航指令本身是异步入队执行的,手动修改graph的时序和导航动作的执行时序完全错位,还会打乱导航系统本身维护的返回栈状态。
要实现「跳转登录页时把Splash启动页从返回栈彻底移除,按返回键不会回退到启动页」的需求,不需要手动操作graph,直接用导航自带的栈操作配置就能完成,正确代码如下:
navHostController.navigate(Route.login.id) { // 定位当前导航图的起始目的地,也就是Splash页对应的入口 popUpTo(navHostController.graph.findStartDestination().id) { // 将匹配到的Splash页从栈中彻底移除,不保留任何状态 inclusive = true } // 避免重复触发跳转时生成多个重复的登录页实例 launchSingleTop = true }
之前三类写法失效的具体原因
- 第一种在
navigate的导航配置块里调用graph.clear(),会在导航动作还没正式入队执行时,就把整个导航图的配置清空,直接导致后续跳转找不到对应的目的地配置,触发状态异常 - 第二种是先触发navigate入队,再立刻执行
graph.clear(),因为navigate是异步执行的,清图操作会先于真正的导航逻辑运行,直接导致跳转动作失效 - 第三种是先记录当前Splash的目的地id,触发跳转后再从静态graph里删除这个目的地配置,本质改的是导航图的静态规则,而不是动态运行的返回栈结构,删除操作根本不会影响已经存在于栈里的Splash页实例,按返回键依然会回到启动页
补充:如果Splash不是导航图的默认起始目的地,只需将
popUpTo的入参替换为Splash页对应的固定路由id即可,核心逻辑保持不变。
内容的提问来源于stack exchange,提问作者Mahdi-Malv
相关产品推荐
相关产品推荐

