如何在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
相关产品推荐
相关产品推荐

