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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:45:02