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

Flutter如何结合接口表单数据使用SharedPreferences保持用户登录状态

Flutter 基于 SharedPreferences 实现登录态持久化方案

完全兼容你现有代码结构,只需按以下步骤修改即可:

1. 引入依赖

在 pubspec.yaml 中添加 SharedPreferences 依赖:

dependencies:
  flutter:
    sdk: flutter
  # 新增以下依赖,版本可根据实际情况替换为最新稳定版
  shared_preferences: ^2.2.2

修改后执行 flutter pub get 安装依赖。

2. 封装持久化工具类(可选,推荐复用)

新建 sp_util.dart 工具类,封装登录态的存取、判断、清除逻辑,适配你已有的 LoginModel 数据模型:

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
// 引入你已有的登录数据模型
import 'login_model.dart';

class SpUtil {
  static late SharedPreferences _sp;

  // 初始化方法,在main函数调用
  static Future<void> init() async {
    _sp = await SharedPreferences.getInstance();
  }

  // 保存登录信息
  static Future<void> saveLoginInfo(LoginModel model) async {
    await _sp.setString('login_info', jsonEncode(model.toJson()));
    await _sp.setBool('is_login', true);
  }

  // 获取登录信息
  static LoginModel? getLoginInfo() {
    String? infoStr = _sp.getString('login_info');
    if (infoStr == null) return null;
    return LoginModel.fromJson(jsonDecode(infoStr));
  }

  // 判断是否已登录
  static bool isLogin() {
    return _sp.getBool('is_login') ?? false;
  }

  // 登出时清除登录信息
  static Future<void> clearLoginInfo() async {
    await _sp.remove('login_info');
    await _sp.remove('is_login');
  }
}

3. 修改现有登录逻辑

修改 api_manager.dart 中的 userLogin 方法,登录成功后先持久化数据再跳转:

// 原有userLogin方法的成功分支逻辑
Future<void> userLogin(String phone, String standardId, String mediumId) async {
  // --- 原有逻辑:构建FormData、发起登录请求 保持不变 ---
  FormData formData = FormData.fromMap({
    "phone": phone,
    "standard_id": standardId,
    "medium_id": mediumId
  });
  var response = await dio.post("/login接口地址", data: formData);

  if (response.statusCode == 200) {
    // 原有逻辑:解析返回数据为LoginModel 保持不变
    LoginModel loginModel = LoginModel.fromJson(response.data);
    // 新增:持久化存储登录信息
    await SpUtil.saveLoginInfo(loginModel);
    // 原有逻辑:跳转至Dashboard 保持不变
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const DashBoard()));
  }
}

4. 调整APP启动逻辑,判断初始页面

修改 main.dart,APP启动时先判断登录态,直接进入对应页面,避免重复登录:

void main() async {
  // 确保Flutter绑定初始化完成,再执行异步操作
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化SharedPreferences工具类
  await SpUtil.init();
  // 判断登录状态,设置初始路由
  String initialRoute = SpUtil.isLogin() ? '/dashboard' : '/login';
  runApp(MyApp(initialRoute: initialRoute));
}

// 在你的MyApp类中配置路由即可
class MyApp extends StatelessWidget {
  final String initialRoute;
  const MyApp({super.key, required this.initialRoute});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: initialRoute,
      routes: {
        '/login': (context) => const LoginPage(),
        '/dashboard': (context) => const DashBoard(),
      },
    );
  }
}

注意事项

  • SharedPreferences 本身为明文存储,不要存储用户密码等敏感信息,仅存储接口返回的token、用户基础展示信息即可,如有加密需求可替换为 flutter_secure_storage
  • 需额外处理token过期场景:当后续业务接口返回401未授权状态时,调用 SpUtil.clearLoginInfo() 清除登录态,跳回登录页即可

内容的提问来源于stack exchange,提问作者Dhaval Chaudhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:24:05