Flutter应用重启或重新打开后SharedPreferences数据丢失问题求助
我帮你排查这个问题,这种情况在使用shared_preferences时很常见,大概率是异步操作未等待完成导致的,下面是具体的分析和修复方案:
最可能的原因:保存数据时未等待异步操作完成
你写的saveLoginData是一个Future函数,但如果调用它的时候没有用await等待执行完成,就直接关闭应用或者跳转页面,shared_preferences的磁盘写入操作可能还没完成,导致数据根本没持久化到本地。
比如你之前可能是这样调用的:
// 错误:没有等待保存完成就执行后续操作 saveLoginData(loginModel); Navigator.pushReplacementNamed(context, '/home');
修复方案:调用saveLoginData时必须await
修改调用代码,确保数据写入磁盘后再进行页面跳转或其他操作:
// 正确:等待保存操作完成 await saveLoginData(loginModel); Navigator.pushReplacementNamed(context, '/home');
其他可能的排查点
1. 优化数据读取的代码风格
你的checkIfLogged混用了await和then,虽然功能没问题,但改成纯await风格更清晰,也更容易排查问题:
Future<String?> checkIfLogged() async { SharedPreferences prefs = await SharedPreferences.getInstance(); String? theToken = prefs.getString('theToken'); print(theToken); return theToken; }
2. 确认保存的数据非空
虽然你说保存时print(loginModel.token)输出正确,但可以在保存前加个非空判断,避免意外写入空值:
Future saveLoginData(LoginModel loginModel) async { if (loginModel.token == null || loginModel.username == null) { print('登录数据为空,无法保存'); return; } SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('theToken', loginModel.token!); await prefs.setBool('logged', true); await prefs.setString('type', 'vendor'); await prefs.setString('mobileNumber', loginModel.username!); // 保存后再次验证 print('保存后读取token: ${prefs.getString('theToken')}'); }
3. 升级shared_preferences版本
你当前使用的shared_preferences: ^0.5.12+4是比较旧的版本,可能存在一些已修复的持久化bug,建议升级到最新稳定版,修改pubspec.yaml后执行flutter pub get。
4. 测试时注意冷启动
不要用Flutter的热重启/热重载测试数据持久化,因为热重启会保留内存中的数据,必须完全关闭应用后重新打开,才能验证磁盘上的真实数据。
总结
90%以上的概率是调用保存函数时未await导致的,先把这个点修复,再结合上面的排查步骤,应该就能解决重启后数据丢失的问题了。
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

