如何用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。
原实现问题
之前尝试的中间件存在两个核心问题:
redirect方法中创建了RouteSettings但未返回,而是返回null,导致无法拦截原页面,仍会进入密码验证页;- 重写
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,提问作者徐自强
相关产品推荐
相关产品推荐

