如何在Flutter GetX中完成当前中间件后跳转至下一个中间件
Flutter GetX 中间件执行完成后跳转下一个中间件的实现方案
GetX的路由中间件会按照你配置的优先级顺序链式执行,当前中间件拦截跳转至对应页面完成业务逻辑后,调用Get.next()方法即可通知GetX继续执行下一个中间件,无需手动指定下一个中间件的路由。
以下是对应你场景的完整示例:
1. 配置路由与中间件
首先定义路由规则,按顺序配置首页的中间件列表:
import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; // 路由表定义 class AppPages { static final routes = [ // 目标首页,配置两个中间件 GetPage( name: '/home', page: () => const HomePage(), // priority数值越小优先级越高,执行顺序为FirstMiddleware → SecondMiddleware middlewares: [ FirstMiddleware(priority: 1), SecondMiddleware(priority: 2), ], ), // 第一个中间页路由 GetPage(name: '/first-mid', page: () => const FirstMidPage()), // 第二个中间页路由 GetPage(name: '/second-mid', page: () => const SecondMidPage()), ]; } // 第一个中间件定义 class FirstMiddleware extends GetMiddleware { FirstMiddleware({required super.priority}); @override RouteSettings? redirect(String? route) { // 业务判断逻辑,比如是否已同意隐私协议 bool isPrivacyAgreed = Get.find<SharedPreferences>().getBool('privacy_agreed') ?? false; if (!isPrivacyAgreed) { // 拦截跳转至第一个中间页 return const RouteSettings(name: '/first-mid'); } // 不需要拦截则返回null,自动进入下一个中间件 return null; } } // 第二个中间件定义 class SecondMiddleware extends GetMiddleware { SecondMiddleware({required super.priority}); @override RouteSettings? redirect(String? route) { // 业务判断逻辑,比如是否已登录 bool isLoggedIn = Get.find<SharedPreferences>().getString('user_token') != null; if (!isLoggedIn) { // 拦截跳转至第二个中间页 return const RouteSettings(name: '/second-mid'); } // 不需要拦截则返回null,直接进入目标首页 return null; } }
2. 第一个中间页完成任务后跳转到下一个中间件
在FirstMidPage完成对应业务(比如用户同意隐私协议)后,调用Get.next()即可触发下一个中间件执行:
class FirstMidPage extends StatelessWidget { const FirstMidPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: () async { // 执行业务逻辑,存储用户同意状态 await Get.find<SharedPreferences>().setBool('privacy_agreed', true); // 通知GetX当前中间件执行完毕,继续执行下一个中间件 Get.next(); }, child: const Text('同意隐私协议'), ), ), ); } }
3. 第二个中间页完成任务后跳转目标首页
在SecondMidPage完成业务(比如用户登录)后,同样调用Get.next(),中间件链执行完毕就会自动跳转到最初请求的目标首页:
class SecondMidPage extends StatelessWidget { const SecondMidPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: () async { // 执行业务逻辑,存储用户登录凭证 await Get.find<SharedPreferences>().setString('user_token', 'your_valid_token'); // 通知GetX当前中间件执行完毕,中间件链结束后自动跳转首页 Get.next(); }, child: const Text('完成登录'), ), ), ); } }
注意事项
- 如果你需要直接跳过所有后续中间件直接进入目标页,也可以手动调用
Get.offNamed('/home'),但更推荐用Get.next()走标准链式逻辑,避免业务流程混乱 - 如果中间件的
redirect方法返回null,代表当前中间件无需拦截,会自动进入下一个中间件的判断逻辑 - 中间件的
priority参数要和你想要的执行顺序匹配,数值越小执行优先级越高
内容的提问来源于stack exchange,提问作者harish balaji
相关产品推荐
相关产品推荐

