Flutter中如何解决无限导航循环问题?
路由栈重复页面问题修复方案
问题现状
当前跳转逻辑导致多次点击Sign in/Sign up后,路由栈中堆积多个SignUp页面:
- 从SignUp跳SignIn用
Get.to(),栈结构为Onboarding > SignUp > SignIn - 从SignIn跳SignUp用
Get.off(const SignUp()),会将当前SignIn替换为新的SignUp,栈变为Onboarding > SignUp > SignUp - 重复操作后,按返回键需多次退出SignUp才能回到Onboarding,不符合预期的层级逻辑
预期路由逻辑
无论来回跳转多少次,路由栈始终保持:
Onboarding > SignUp > SignIn
返回顺序严格为:SignIn → SignUp → Onboarding
解决方案
修改SignIn页面的跳转逻辑,不再创建新的SignUp页面,而是直接返回栈中已存在的SignUp实例,用Get.pop()替代Get.off():
修改后的SignIn页面跳转代码
RichTextWidget( text: "Don't have a registered account? ", span: 'Sign up', recognizer: TapGestureRecognizer() ..onTap = () { // 弹出当前SignIn页面,回到之前的SignUp页面,保留转场动画 Get.pop( transition: Transition.leftToRight, duration: const Duration(milliseconds: 500), ); }, )
逻辑说明
- 从Onboarding进入SignUp:使用
Get.to(),栈结构为[Onboarding, SignUp] - 从SignUp进入SignIn:使用
Get.to(),栈结构为[Onboarding, SignUp, SignIn] - 从SignIn返回SignUp:使用
Get.pop(),栈回到[Onboarding, SignUp] - 重复跳转时,栈中始终只有Onboarding、最多1个SignUp和最多1个SignIn页面,返回键行为完全符合预期
扩展场景(可选)
如果存在其他路径进入SignIn的情况,可使用Get.offUntil确保跳转到栈中已存在的SignUp页面(需提前给页面配置命名路由):
Get.offUntil( MaterialPageRoute(builder: (_) => const SignUp()), (route) => route.settings.name == 'Onboarding', // 终止条件:回到Onboarding页面之前的路由 );
内容的提问来源于stack exchange,提问作者KKot
相关产品推荐
相关产品推荐

