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

Flutter使用shared_preferences存储自定义Todo类列表遇问题

解决shared_preferences存储自定义Todo列表的问题

shared_preferences的setStringList仅支持存储List<String>类型数据,自定义Todo对象无法直接传入,必须通过序列化/反序列化将对象转换为字符串(通常用JSON格式)后再存储,读取时逆向转换即可。

1. 为Todo类添加序列化与反序列化方法

修改你的Todo类,增加JSON转换相关方法(需先导入dart:convert):

import 'dart:convert';

class Todo {
  Todo({required this.name, required this.checked});
  final String name;
  bool checked;

  // 将Todo对象转为JSON字符串
  String toJson() {
    return jsonEncode({
      'name': name,
      'checked': checked,
    });
  }

  // 从JSON字符串解析出Todo对象
  factory Todo.fromJson(String jsonStr) {
    final Map<String, dynamic> jsonMap = jsonDecode(jsonStr);
    return Todo(
      name: jsonMap['name'],
      checked: jsonMap['checked'],
    );
  }
}

2. 存储Todo列表

将List<Todo>转换为List<String>后,调用setStringList完成存储:

// 获取SharedPreferences实例
final prefs = await SharedPreferences.getInstance();
// 把每个Todo对象转为JSON字符串,生成字符串列表
final todoStringList = _todos.map((todo) => todo.toJson()).toList();
// 存储
await prefs.setStringList("shoppingCard", todoStringList);

3. 读取Todo列表

先获取字符串列表,再逐个反序列化为Todo对象:

final prefs = await SharedPreferences.getInstance();
// 获取存储的字符串列表,为空时返回空列表
final savedTodoStrings = prefs.getStringList("shoppingCard") ?? [];
// 转换回List<Todo>
final List<Todo> savedTodos = savedTodoStrings.map((str) => Todo.fromJson(str)).toList();

注意

之前使用.cast<Todo>()的方式无效,因为getStringList返回的是纯字符串列表,强制类型转换会引发运行时错误,必须通过序列化完成类型转换。

内容的提问来源于stack exchange,提问作者Fabian M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:45:43