Flutter GetX AuthMiddleware失效求助:重启后无法维持登录状态
GetX AuthMiddleware失效及登录状态不保持问题修复
已登录状态下重启APP无法自动跳转至对应页面,需重新登录,期望根据SharedPreferences中存储的role值自动路由到用户首页(user角色)或管理员页(admin角色),以下是问题排查及修复方案:
问题根源排查
- 测试Mock清空真实存储:Main函数中调用
SharedPreferences.setMockInitialValues({})会覆盖真实的SharedPreferences数据,这是测试环境专属代码,正式环境必须移除,否则重启后存储的role会被清空。 - 角色字符串不匹配:LoginPage中用户登录时存储的是
'users',但AuthMiddleware中判断的是'user',字符串不一致导致中间件无法识别已登录用户角色。 - home配置绕过中间件:直接设置
home: LoginPage()会跳过getPages中/路由的中间件拦截,中间件仅对getPages内定义的路由生效,需移除home配置让APP默认加载/路由触发中间件逻辑。 - redirect逻辑不完整:AuthMiddleware的
redirect方法未明确处理无匹配角色的情况,需返回null允许访问登录页,避免路由异常。
修复后的代码
Main文件代码
import 'package:flutter/material.dart'; import 'package:gettest/middelware/auth_middelware.dart'; import 'package:gettest/utiliz/mybindings.dart'; import 'package:gettest/view/adminpage.dart'; import 'package:gettest/view/counterpage.dart'; import 'package:gettest/view/home.dart'; import 'package:get/get.dart'; import 'package:gettest/view/login.dart'; import 'package:gettest/view/mirrorpage.dart'; import 'package:gettest/view/operationpage.dart'; import 'package:gettest/view/pageone.dart'; import 'package:shared_preferences/shared_preferences.dart'; late SharedPreferences sharedpref; void main() async { WidgetsFlutterBinding.ensureInitialized(); sharedpref = await SharedPreferences.getInstance(); // 移除测试用Mock初始化代码 // SharedPreferences.setMockInitialValues({}); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return GetMaterialApp( // 移除home配置,默认加载getPages中的'/'路由 // home: LoginPage(), getPages: [ GetPage( name: '/', page: () => LoginPage(), middlewares: [AuthMiddelware()]), GetPage( name: '/homepgae', page: () => HomePage(), ), GetPage(name: '/adminPage', page: () => const AdminPage()), GetPage(name: "/pageone", page: () => const PageOne()), GetPage( name: "/PageCounter", page: () => CounterPage(), binding: MyBinding()), GetPage(name: '/Pageoperation', page: () => const OperationPage()), GetPage( name: '/PageCounterMirror', page: () => MirorPage(), binding: MyBinding()) ], ); } }
AuthMiddleware文件代码
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:gettest/main.dart'; class AuthMiddelware extends GetMiddleware { @override RouteSettings? redirect(String? route) { // 匹配LoginPage中存储的'users'字符串 if (sharedpref.getString('role') == 'users') { return const RouteSettings(name: '/homepgae'); } if (sharedpref.getString('role') == 'admin') { return const RouteSettings(name: '/adminPage'); } // 无匹配角色时返回null,允许访问登录页 return null; } }
LoginPage文件代码(可选:也可将存储值改为'user',与中间件判断统一)
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:gettest/main.dart'; class LoginPage extends StatelessWidget { const LoginPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('HtSouq'), centerTitle: true, ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ MaterialButton( onPressed: () { // 若修改此处为'user',需同步修改AuthMiddleware的判断条件 sharedpref.setString('role', 'users'); Get.offNamed('/homepgae'); }, color: Colors.amberAccent, child: const Text('Login'), ), MaterialButton( onPressed: () { sharedpref.setString('role', 'admin'); Get.offNamed('/adminPage'); }, color: Colors.amberAccent, child: const Text('Admin'), ), ], ), ), ); } }
内容的提问来源于stack exchange,提问作者mohammed bamlhes
相关产品推荐
相关产品推荐

