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

Flutter应用重启或重新打开后SharedPreferences数据丢失问题求助

解决shared_preferences重启后数据丢失的问题

我帮你排查这个问题,这种情况在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:47:39