Flutter中使用SharedPreferences保存列表遇到问题求助
嘿,我一眼就看出问题所在啦!SharedPreferences.setStringList() 方法只能直接存储纯String类型的列表,但你的 todosEventos 显然是自定义的 TodosEventos 对象列表,不是String数组——这就是运行时抛出异常的核心原因。
下面是具体的解决方案,分三步搞定:
1. 给自定义类添加序列化/反序列化方法
首先要让你的 TodosEventos 类支持转换成JSON格式(因为JSON可以转成String存储),我们手动实现toJson()和fromJson()方法(也可以用json_serializable库自动生成,这里先讲基础手动方式):
class TodosEventos { final String eventName; final DateTime eventDate; // 根据你的实际类属性调整,这里举个例子 TodosEventos({required this.eventName, required this.eventDate}); // 将对象转为JSON Map Map<String, dynamic> toJson() { return { 'eventName': eventName, 'eventDate': eventDate.toIso8601String(), // DateTime需转成String才能序列化 // 其他属性同理,确保都是JSON支持的类型 }; } // 从JSON Map转回对象 factory TodosEventos.fromJson(Map<String, dynamic> json) { return TodosEventos( eventName: json['eventName'], eventDate: DateTime.parse(json['eventDate']), ); } }
2. 保存对象列表到SharedPreferences
把每个TodosEventos对象先转成JSON字符串,再组成String列表存储:
SharedPreferences prefs = await SharedPreferences.getInstance(); // 将对象列表转换为JSON字符串列表 List<String> eventStringList = todosEventos .map((event) => jsonEncode(event.toJson())) .toList(); // 调用setStringList存储 await prefs.setStringList('events', eventStringList);
3. 从SharedPreferences读取并还原对象列表
读取时把String列表再转回TodosEventos对象列表:
SharedPreferences prefs = await SharedPreferences.getInstance(); List<String>? savedEventStrings = prefs.getStringList('events'); if (savedEventStrings != null) { List<TodosEventos> restoredEvents = savedEventStrings .map((eventStr) => TodosEventos.fromJson(jsonDecode(eventStr))) .toList(); // restoredEvents就是你之前保存的对象列表啦 }
额外小贴士
- 如果你的类结构复杂,推荐使用
json_serializable库自动生成序列化代码,避免手动写的错误; - 确保对象中所有属性都能被JSON序列化:比如
DateTime、enum这类特殊类型都需要做转换处理; - 存储前可以先打印
eventStringList确认每个元素都是合法的JSON字符串,方便排查问题。
内容的提问来源于stack exchange,提问作者Moisés Ochoa
相关产品推荐
相关产品推荐

