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

Flutter中使用SharedPreferences保存列表遇到问题求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:53:13