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

Flutter从SharedPreferences读取自定义类List<SvItem>报错解决

解决Flutter中SharedPreferences读取List类型不匹配问题

问题根源

  1. 保存的是List<SvItem>,jsonEncode后生成JSON数组,jsonDecode返回的是List<Map<String,dynamic>>,但直接用SvItem.fromJson解析整个List,而该方法期望单个Map<String,dynamic>,导致类型不匹配。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:17:31