Flutter应用使用GetStorage时退出后存储数据丢失如何解决
GetStorage重启后数据丢失问题修复
核心问题点
- 未正确初始化:应用启动前没有调用
await GetStorage.init()完成存储容器初始化,数据仅存在内存中,进程退出后直接丢失。 - 写入逻辑错误:直接将自定义类
Mesure的实例列表写入存储,GetStorage仅支持Dart基础类型(num、String、bool、List、Map)的持久化,未序列化的自定义类实例无法被正确写入磁盘,重启后解析失败会被丢弃。 - 读取逻辑错误:读取时的类型判断完全不匹配实际存储格式:
- 读取结果先被强转为
List<dynamic>,后续判断其是否为Map<String,dynamic>的分支永远不可能触发 - GetStorage从磁盘读取的内容不会自动转换为自定义的
Mesure类型,判断是否为List<Mesure>的分支也永远无法触发,最终读取结果始终为空列表,表现为数据被清空。
- 读取结果先被强转为
修复方案
- 首先在应用入口完成GetStorage初始化,必须确保初始化完成再runApp:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化存储容器,必须await等待完成 await GetStorage.init(); runApp(const MyApp()); }
- 修改写入逻辑,写入前将自定义类列表序列化为基础类型构成的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); });
- 修改读取逻辑,修正类型判断,将读取到的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
相关产品推荐
相关产品推荐

