从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
相关产品推荐
相关产品推荐

