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

如何用GetMiddleware拦截路由,跳过密码验证页直接跳转目标页?

GetX密码验证页拦截解决方案

环境与场景

使用版本:get:4.6.5 或 5.0.0-beat.52
场景:存在密码验证页GetTest2Page,提交正确密码后执行上页传入的跳转方法进入GetTest3Page,跳转代码如下:

// 注:原代码疑似笔误,应为跳转到密码验证页GetTest2Page
Get.toNamed(GetTest2Page.name, arguments: () {
  Get.toNamed(GetTest3Page.name);
});

需求

若半小时内已验证过密码,则直接跳转至GetTest3Page,无需进入GetTest2Page。

原实现问题

之前尝试的中间件存在两个核心问题:

  1. redirect方法中创建了RouteSettings但未返回,而是返回null,导致无法拦截原页面,仍会进入密码验证页;
  2. 重写onPageCalled返回null触发路由配置异常,返回父类实现则无法拦截。

正确实现方案

1. 维护验证时间戳

全局记录上次密码验证的时间,用于判断是否在有效期内:

DateTime? _lastPasswordVerifiedTime;

2. 修正中间件逻辑

在SystemPasswordMiddleware的redirect方法中完成有效期判断与拦截跳转:

class SystemPasswordMiddleware extends GetMiddleware {
  @override
  RouteSettings? redirect(String? route) {
    // 判断是否在30分钟有效期内
    bool isValid = false;
    if (_lastPasswordVerifiedTime != null) {
      final timeDiff = DateTime.now().difference(_lastPasswordVerifiedTime!);
      isValid = timeDiff.inMinutes < 30;
    }

    if (isValid) {
      // 获取传入的跳转函数并执行
      final jumpAction = Get.arguments as void Function()? ?? () {};
      jumpAction();
      // 返回目标页的RouteSettings,拦截原密码验证页
      return const RouteSettings(name: GetTest3Page.name);
    }

    // 不在有效期内,正常进入密码验证页
    return null;
  }
}

3. 更新验证时间戳

在GetTest2Page密码验证通过后,更新全局时间戳:

// 密码验证成功时执行
_lastPasswordVerifiedTime = DateTime.now();
// 执行传入的跳转函数
final jumpAction = Get.arguments as void Function();
jumpAction();

4. 路由配置保持不变

原GetMaterialApp的路由配置无需修改,确保GetTest2Page绑定该中间件即可。


内容的提问来源于stack exchange,提问作者徐自强

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:14:59