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

Flutter应用使用GetStorage时退出后存储数据丢失如何解决

GetStorage重启后数据丢失问题修复

核心问题点

  • 未正确初始化:应用启动前没有调用await GetStorage.init()完成存储容器初始化,数据仅存在内存中,进程退出后直接丢失。
  • 写入逻辑错误:直接将自定义类Mesure的实例列表写入存储,GetStorage仅支持Dart基础类型(num、String、bool、List、Map)的持久化,未序列化的自定义类实例无法被正确写入磁盘,重启后解析失败会被丢弃。
  • 读取逻辑错误:读取时的类型判断完全不匹配实际存储格式:
    1. 读取结果先被强转为List<dynamic>,后续判断其是否为Map<String,dynamic>的分支永远不可能触发
    2. GetStorage从磁盘读取的内容不会自动转换为自定义的Mesure类型,判断是否为List<Mesure>的分支也永远无法触发,最终读取结果始终为空列表,表现为数据被清空。

修复方案

  1. 首先在应用入口完成GetStorage初始化,必须确保初始化完成再runApp:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化存储容器,必须await等待完成
  await GetStorage.init();
  runApp(const MyApp());
}
  1. 修改写入逻辑,写入前将自定义类列表序列化为基础类型构成的List:
setState(() {
  widget.mesure.sampleNumber = result.rawContent;
  measures.removeWhere((Mesure measure) => measure.id == widget.mesure.id);
  measures.add(Mesure.fromJson(widget.mesure.toJson()));
  // 序列化后再写入:每个Mesure对象转成Json Map,组成基础类型列表
  final storageList = measures.map((measureItem) => measureItem.toJson()).toList();
  box.write("measures", storageList);
});
  1. 修改读取逻辑,修正类型判断,将读取到的Map列表反序列化为Mesure对象:
final box = GetStorage();
List<Mesure> measures = [];

if (box.hasData("measures")) {
  final rawRecords = box.read("measures");
  // 存储的内容是List<Map<String,dynamic>>格式,做对应转换
  if (rawRecords is List) {
    measures = rawRecords.map((rawItem) {
      return Mesure.fromJson(Map<String, dynamic>.from(rawItem as Map));
    }).toList();
  }
}

注意:确保Mesure类的toJson()方法返回Map<String, dynamic>类型,且Map内所有值都是GetStorage支持的基础类型,不要嵌套未序列化的其他自定义类。

内容的提问来源于stack exchange,提问作者Imen MK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:39:18