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

如何在Flutter session中保存完整的model/POJO类?

方案1:运行期内存级存储(对应Android Application级全局存储,杀应用即失效,符合传统session生命周期)

这是最贴近原生Android开发习惯的轻量方案,不需要序列化,性能开销最低:

  • 首先实现一个全局单例管理类,用来统一持有session级数据
class SessionManager {
  // 单例初始化逻辑
  SessionManager._internal();
  static final SessionManager instance = SessionManager._internal();
  factory SessionManager() => instance;

  // 声明你的model类变量,示例model类为UserModel
  UserModel? currentUser;
  // 其他需要存在session里的全局变量都可以在这里声明
}
  • 存取操作直接调用单例即可,和Android里存在Application类的逻辑完全一致:
// 存数据
SessionManager.instance.currentUser = yourUserModelInstance;
// 取数据
UserModel? loginUser = SessionManager.instance.currentUser;

该方案适合只需要应用运行期间临时持有、不需要重启后保留的场景,没有额外的依赖引入。


方案2:可持久化session存储(杀应用重启后仍可读取)

如果需要退出应用再打开还能保留session数据,就需要把model序列化后存入本地持久化容器,对应Android原生的SharedPreferences方案,操作步骤如下:

  1. 先给你的model类增加序列化、反序列化方法:
class UserModel {
  final String userName;
  final int userId;
  final String avatar;

  UserModel({required this.userName, required this.userId, required this.avatar});

  // 转json方法,用于序列化存储
  Map<String, dynamic> toJson() => {
    "userName": userName,
    "userId": userId,
    "avatar": avatar,
  };

  // 从json转model方法,用于读取时反序列化
  factory UserModel.fromJson(Map<String, dynamic> json) => UserModel(
    userName: json["userName"],
    userId: json["userId"],
    avatar: json["avatar"],
  );
}

如果你的model嵌套层级复杂、字段多,可以用json_serializable库自动生成序列化代码,不需要手动编写避免出错。

  1. 存储时先把model转成json字符串再存入本地容器:
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

Future<void> saveUserToSession(UserModel user) async {
  final sp = await SharedPreferences.getInstance();
  String userJsonStr = jsonEncode(user.toJson());
  await sp.setString("session_user", userJsonStr);
}
  1. 读取时先取出json字符串再转回model对象:
Future<UserModel?> getUserFromSession() async {
  final sp = await SharedPreferences.getInstance();
  String? userJsonStr = sp.getString("session_user");
  if (userJsonStr == null) return null;
  Map<String, dynamic> userJson = jsonDecode(userJsonStr);
  return UserModel.fromJson(userJson);
}

如果存储的是密码、token这类敏感数据,不要用shared_preferences,安卓端它是明文存储的xml文件,改用flutter_secure_storage加密存储即可,API调用逻辑和shared_preferences基本一致。

内容的提问来源于stack exchange,提问作者Rakesh Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 15:06:04