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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:17:04