Flutter使用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
相关产品推荐
相关产品推荐

