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
相关产品推荐
相关产品推荐

