使用go_router如何避免已打开的路由重复跳转?
问题分析与解决办法
根本问题:导航API混用
你同时使用了Flutter原生的Navigator.push()和go_router的context.push(),这是错误的用法。go_router有自己独立的路由栈管理逻辑,和原生命令式导航混用会打乱它的栈结构,直接导致重复页面的问题。
修正方案
- 统一导航方式:把所有原生
Navigator.push()替换成go_router的context.push(),比如首页跳转到objects路由,改成context.push('/objects')(根据你的实际路由路径调整)。 - 推送通知跳转优化:
- 直接用
context.go('/object/${objectId}'):这个方法会调整路由栈到目标路由——如果目标路由已经在栈顶,不会重复创建;如果在栈中其他位置,会清空上方的路由并跳转到该页面,避免重复。 - 或者手动检查路由栈:通过
GoRouter.of(context).routerDelegate.currentConfiguration获取当前路由栈,遍历判断目标路由是否存在,若存在则调用context.popUntil()定位到该路由,不存在再执行context.push()。
- 直接用
关于redirect的疑问
不需要用redirect处理这个场景。redirect是用来做全局路由守卫(比如未登录跳转登录页)的,用在重复路由的场景属于过度设计,完全没必要。
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

