Flutter使用SharedPreferences离线存储对象列表被自动转字符串问题
问题原因
SharedPreferences 仅支持存储 String、int、bool、double、List<String> 基础类型数据,直接存储Map列表或自定义对象时,会默认调用对象的toString()方法生成非标准格式的字符串,无法反向解析为原数据结构,就是你遇到的外层包裹引号、JSON键丢失双引号的问题。
解决方案
通过JSON序列化/反序列化处理数据后再进行存取操作,步骤如下:
1. 导入依赖
import 'package:shared_preferences/shared_preferences.dart'; import 'dart:convert'; // Dart内置JSON处理库,无需额外安装
2. 存储数据逻辑
// 你的原始数据列表 List<Map<String, dynamic>> originList = [ {"name":"Indicator","remark":"N/A","point":0}, {"name":"ggggggggggggggggg","remark":"Very Good","point":3}, {"name":"THREE","remark":"Average","point":1} ]; // 先将列表序列化为标准JSON字符串 String jsonString = jsonEncode(originList); // 再存入SharedPreferences final prefs = await SharedPreferences.getInstance(); await prefs.setString('custom_data_key', jsonString);
3. 读取数据逻辑
final prefs = await SharedPreferences.getInstance(); // 先读取存储的JSON字符串 String? storedStr = prefs.getString('custom_data_key'); if (storedStr != null) { // 反序列化得到原始列表结构 List<dynamic> decodedData = jsonDecode(storedStr); // 转换为目标类型即可正常使用 List<Map<String, dynamic>> result = decodedData.cast<Map<String, dynamic>>(); }
补充说明
- 如果需要存储自定义类对象列表,需要为自定义类实现
toJson()、fromJson()序列化方法,先将类实例转为Map结构再执行JSON序列化即可。 - 不要直接调用
toString()方法转换列表/对象后存储,生成的字符串不是标准JSON格式,无法正常解析。
内容的提问来源于stack exchange,提问作者Muhammed Fazil
相关产品推荐
相关产品推荐

