You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),
      );
    },
)

逻辑说明

  1. 从Onboarding进入SignUp:使用Get.to(),栈结构为[Onboarding, SignUp]
  2. 从SignUp进入SignIn:使用Get.to(),栈结构为[Onboarding, SignUp, SignIn]
  3. 从SignIn返回SignUp:使用Get.pop(),栈回到[Onboarding, SignUp]
  4. 重复跳转时,栈中始终只有Onboarding、最多1个SignUp和最多1个SignIn页面,返回键行为完全符合预期

扩展场景(可选)

如果存在其他路径进入SignIn的情况,可使用Get.offUntil确保跳转到栈中已存在的SignUp页面(需提前给页面配置命名路由):

Get.offUntil(
  MaterialPageRoute(builder: (_) => const SignUp()),
  (route) => route.settings.name == 'Onboarding', // 终止条件:回到Onboarding页面之前的路由
);

内容的提问来源于stack exchange,提问作者KKot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:57:50