Flutter中如何关闭应用后仍保留SharedPreferences数据?
SharedPreferences本身设计就是用来做持久化存储的,关闭应用后数据丢失大概率是使用方式出了问题,以下是可行的排查和解决办法:
确保异步读写操作完成
SharedPreferences的所有写入(setXxx)和实例获取都是异步操作,如果在操作未完成时就终止应用,数据可能还没写入磁盘。必须等待异步操作完成后再退出:final prefs = await SharedPreferences.getInstance(); // 等待写入完成 await prefs.setString('user_name', 'test');另外,
apply()是异步无回调的写入方式,commit()是同步返回布尔值表示写入结果,若需要确认写入成功,可使用commit()(注意它会阻塞线程,建议在后台执行):bool isSaved = await prefs.setString('user_name', 'test').then((_) => prefs.commit()); if (!isSaved) { // 处理写入失败逻辑 }避免依赖内存缓存而非实际存储
不要只把数据存在内存变量里却不同步写入SharedPreferences,也不要读取时直接用内存值而不从SharedPreferences加载。每次需要持久化的数据,必须调用SharedPreferences的写入方法,读取时也要从实例中获取最新值。减少频繁写入操作
短时间内多次调用写入方法可能导致系统来不及将数据同步到磁盘,尽量合并多个键值对的写入操作,减少调用次数。检查存储状态
当设备存储空间不足,或者应用的存储权限被限制时,SharedPreferences可能写入失败。可以通过commit()的返回值判断是否写入成功,及时处理异常情况。排除开发环境干扰
开发时使用热重启/热重载可能导致SharedPreferences的状态异常,测试持久化功能时,必须完全关闭应用(杀掉进程)后重新打开验证。关于用户手动清除数据
如果用户手动清除了应用的存储数据,SharedPreferences中的内容会被清空,这是系统机制无法避免。可以考虑增加云备份功能,将重要数据同步到云端,避免丢失。
内容的提问来源于stack exchange,提问作者U.jung

