如何在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方案,操作步骤如下:
- 先给你的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库自动生成序列化代码,不需要手动编写避免出错。
- 存储时先把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); }
- 读取时先取出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
相关产品推荐
相关产品推荐

