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

如何在Navigator.push中添加路由判断:避免重复跳转至OtpScreen

实现路由跳转的页面判断逻辑(避免重复跳转到OtpScreen)

要实现"当前处于OtpScreen则不跳转,否则跳转"的逻辑,可以通过以下两种可靠方式实现:

方法一:通过路由名称判断(推荐)

先给目标路由设置一个唯一名称,后续通过名称判断当前页面是否为目标页面:

步骤1:给路由添加名称

在跳转时给MaterialPageRoute设置settings参数指定路由名称:

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => OtpScreen(verificationId: verificationId),
    // 为路由设置唯一名称
    settings: const RouteSettings(name: '/otp-screen'),
  ),
);

步骤2:跳转前检查当前路由名称

通过ModalRoute.of(context)获取当前活跃路由,判断其名称是否为目标路由名称,若不是则执行跳转:

final currentRoute = ModalRoute.of(context);

if (currentRoute?.settings.name != '/otp-screen') {
  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => OtpScreen(verificationId: verificationId),
      settings: const RouteSettings(name: '/otp-screen'),
    ),
  );
}

方法二:通过页面Widget类型判断

直接检查当前上下文对应的页面是否为OtpScreen实例,若不是则跳转:

// 查找当前上下文是否存在OtpScreen实例
final isOnOtpScreen = context.findAncestorWidgetOfExactType<OtpScreen>() != null;

if (!isOnOtpScreen) {
  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => OtpScreen(verificationId: verificationId),
    ),
  );
}

注意:这种方法如果OtpScreen被嵌套在其他父Widget(如Scaffold、Container等)内部,可能会出现判断不准确的情况,因此更推荐使用路由名称的判断方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:05:04