Flutter Web 使用 GetX 实现未认证用户全局路由重定向问题问询
解决方案
你可以直接使用GetX内置的**路由中间件(GetMiddleware)**实现全局路由鉴权,无需在每个页面单独加校验逻辑,同时能完美解决URL不更新、路由直接访问的问题,具体实现步骤如下:
1. 自定义全局鉴权中间件
新建一个AuthMiddleware类,继承GetMiddleware,重写redirect方法,所有路由跳转前都会先走这个方法做校验:
class AuthMiddleware extends GetMiddleware { @override RouteSettings? redirect(String? route) { // 全局获取认证状态,判断是否已登录 bool isLoggedIn = Get.find<AuthController>().loggedIn; // 允许匿名访问的路由白名单 List<String> whiteList = ["/login", "/notfound"]; // 未登录且当前访问路由不在白名单内,直接重定向到登录页 if (!isLoggedIn && !whiteList.contains(route)) { return const RouteSettings(name: "/login"); } // 已登录状态下访问登录页,自动重定向到仪表盘,避免登录后退回登录页 if (isLoggedIn && route == "/login") { return const RouteSettings(name: "/dashboard"); } // 其余情况正常放行 return null; } }
2. 绑定中间件到路由配置
修改你的GetMaterialApp配置:
- 废弃原来的
Root组件,直接将/login路由对应到LoginScreen - 给需要鉴权的路由绑定
AuthMiddleware - 初始路由直接设为
/dashboard即可,中间件会自动根据登录状态做跳转
GetMaterialApp( initialBinding: InitialBinding(), debugShowCheckedModeBanner: false, theme: CustomTheme().getLightTheme, themeMode: ThemeMode.light, title: "----------", initialRoute: "/dashboard", unknownRoute: GetPage(name: "/notfound", page: () => NotFoundPage()), getPages: [ GetPage(name: "/login", page: () => LoginScreen()), GetPage( name: "/dashboard", page: () => Dashboard(), // 绑定鉴权中间件 middlewares: [AuthMiddleware()], ), ], ),
3. 补充可选逻辑
登录成功后直接调用Get.offAllNamed("/dashboard")跳转即可,URL会自动同步更新。如果需要处理登录过期踢人场景,可以在InitialBinding中添加全局状态监听:
ever(Get.find<AuthController>().loggedIn, (isLoggedIn) { if (!isLoggedIn) { Get.offAllNamed("/login"); } });
以上实现完全覆盖你的需求:用户直接在地址栏输入/dashboard时未登录会自动跳转到/login,登录后访问路径会同步更新,无需在每个页面添加校验逻辑。
内容的提问来源于stack exchange,提问作者Phake
相关产品推荐
相关产品推荐

