Flutter API请求报错:List<dynamic>无法转为List<Map<String, dynamic>>
错误原因与解决方法
这个错误的核心是类型不匹配:Flutter中json.decode()解析API返回的数组时,默认返回List<dynamic>类型,但你代码中试图将它直接赋值给List<Map<String, dynamic>>,编译器无法确认动态列表里的每个元素都是Map类型,因此抛出类型转换异常。
常见场景与修复方式
假设你的_getAllFurnis()方法类似下面的写法,问题就出在JSON数据的类型转换环节:
Future<List<Furni>> _getAllFurnis() async { final response = await http.get(Uri.parse('https://your-api.com/chairs')); // 这里直接赋值会触发错误 List<Map<String, dynamic>> data = json.decode(response.body); return data.map((item) => Furni.fromJson(item)).toList(); }
针对这个问题,有几种可靠的修复方式:
显式转换列表元素类型:用
cast()或List.from()把List<dynamic>转为List<Map<String, dynamic>>List<dynamic> rawData = json.decode(response.body); List<Map<String, dynamic>> data = rawData.cast<Map<String, dynamic>>(); // 或者 List<Map<String, dynamic>> data = List<Map<String, dynamic>>.from(rawData);在对象转换时直接处理动态元素:无需提前转换整个列表,在
map遍历的时候强制转换单个元素Future<List<Furni>> _getAllFurnis() async { final response = await http.get(Uri.parse('https://your-api.com/chairs')); List<dynamic> rawData = json.decode(response.body); return rawData.map((item) => Furni.fromJson(item as Map<String, dynamic>)).toList(); }确认API返回结构:如果API返回的是嵌套JSON(比如
{"furnis": [...]}),你需要先提取数组字段,再做转换,否则会把整个JSON对象当成List处理,也会触发类似错误:Map<String, dynamic> responseData = json.decode(response.body); List<dynamic> rawData = responseData['furnis'];
内容的提问来源于stack exchange,提问作者Shreyas K S
相关产品推荐
相关产品推荐

