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

从SQL数据库获取数据时遇List类型不匹配错误求助

问题排查与解决

核心错误原因

控制台报错'List' is not a subtype of type 'List<MenuModel>',本质是JSON解析类型不匹配:

  • jsonDecode(res.body)返回的是List<dynamic>(实际为List<Map<String, dynamic>>),直接强转成List<MenuModel>时,Dart无法自动将动态JSON对象转为自定义的MenuModel实例。

修复步骤

1. 给MenuModel添加fromJson构造函数

确保自定义模型类有工厂构造函数,用于将单个JSON对象转为MenuModel实例:

class MenuModel {
  final String mealName;
  // 补充你的其他字段(如id、price等)

  MenuModel({required this.mealName});

  // 新增JSON转模型的构造函数
  factory MenuModel.fromJson(Map<String, dynamic> json) {
    return MenuModel(
      mealName: json['mealName'] as String,
      // 按实际字段解析,注意处理可能的null值
    );
  }
}

2. 修改getMeals方法的解析逻辑

将直接强转改为遍历JSON列表,逐个转换为MenuModel实例:

Future<List<MenuModel>> getMeals() async {
  try {
    final res = await http.get(Uri.parse(API.getChefMenu));
    // 先校验响应状态码,确保请求成功
    if (res.statusCode == 200) {
      final List<dynamic> jsonList = jsonDecode(res.body);
      // 遍历转换每个JSON对象为MenuModel
      List<MenuModel> menu = jsonList.map((json) => MenuModel.fromJson(json)).toList();
      return menu;
    } else {
      print('请求失败,状态码:${res.statusCode}');
      return [];
    }
  } catch (e) {
    print(e.toString());
    return [];
  }
}

3. 额外检查点

  • 确认API返回的JSON键名与MenuModel字段完全匹配(注意大小写);
  • 如果API返回嵌套结构(如外层包含data字段),需先取出目标列表再解析:
    final Map<String, dynamic> responseData = jsonDecode(res.body);
    final List<dynamic> jsonList = responseData['data'];
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:32:25