Flutter从SharedPreferences读取自定义类List<SvItem>报错解决
问题根源
- 保存的是
List<SvItem>,jsonEncode后生成JSON数组,jsonDecode返回的是List<Map<String,dynamic>>,但直接用SvItem.fromJson解析整个List,而该方法期望单个Map<String,dynamic>,导致类型不匹配。 SvItem.fromJson实现错误:参数类型写成Map<String, SvItem>(应为Map<String, dynamic>),且未从JSON中读取实际值,而是硬编码字符串,完全无法完成解析。
修复步骤
1. 修正SvItem类的fromJson工厂方法
调整参数类型,并正确从JSON中提取字段值:
import 'package:flutter/material.dart'; class SvItem with ChangeNotifier { final String id; final String meatType; final String meatTypeImg; final String meatCut; final String duration; final String temperatur; final List<String> instructions; final String notes; bool isFavorite; SvItem({ required this.id, required this.meatType, required this.meatTypeImg, required this.meatCut, required this.duration, required this.temperatur, required this.instructions, required this.notes, this.isFavorite = false, }); factory SvItem.fromJson(Map<String, dynamic> json) { return SvItem( id: json['id'] as String, meatType: json['meatType'] as String, meatTypeImg: json['meatTypeImg'] as String, meatCut: json['meatCut'] as String, duration: json['duration'] as String, temperatur: json['temperatur'] as String, instructions: List<String>.from(json['instructions'] as List), notes: json['notes'] as String, isFavorite: json['isFavorite'] as bool, ); } Map<String, dynamic> toJson() { return { "id": id, "meatType": meatType, "meatTypeImg": meatTypeImg, "meatCut": meatCut, "duration": duration, "temperatur": temperatur, "instructions": instructions, "notes": notes, "isFavorite": isFavorite }; } }
2. 修正读取代码
遍历jsonDecode返回的List,逐个解析为SvItem对象:
Future getCustomRecipesState() async { final prefs = await SharedPreferences.getInstance(); var recipeData = prefs.getString("customRecipesList"); if (recipeData == null) { return []; // 无数据时返回空列表 } List<dynamic> jsonList = jsonDecode(recipeData); List<SvItem> customRecipes = jsonList .map((item) => SvItem.fromJson(item as Map<String, dynamic>)) .toList(); print(customRecipes); return customRecipes; }
3. 优化保存代码(可选)
添加类型约束,避免传入错误类型:
Future saveCustomRecipes(List<SvItem> items) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString("customRecipesList", jsonEncode(items)); setState(() {}); } // 调用时确保customRecipes是List<SvItem>类型 saveCustomRecipes(customRecipes);
内容的提问来源于stack exchange,提问作者quik
相关产品推荐
相关产品推荐

