Flutter开发报错:List<dynamic>无法转为Iterable<Map<dynamic,dynamic>>
解决Flutter类型转换错误:
type 'List<dynamic>' is not a subtype of type 'Iterable<Map<dynamic, dynamic>>' 错误原因
json.decode(res.body)返回的是List<dynamic>类型,而groupBy函数期望接收元素为Map<dynamic, dynamic>的可迭代对象,动态类型无法被自动推断为目标类型,导致类型不匹配报错。
修复方案
显式将response转换为List<Map<dynamic, dynamic>>,让Dart明确集合内元素的类型,提供两种实现方式:
方式1:解码时直接做类型断言
修改解码代码,给json.decode的结果加上类型断言:
void getData() async { var url = 'http://xxxxxxx/getEvents.php'; var res = await http.get(Uri.parse(url)); // 显式转换为List<Map<dynamic, dynamic>> var response = json.decode(res.body) as List<Map<dynamic, dynamic>>; print(response); var mySelectedEvents = groupBy(response, (Map obj) => obj['date']).map((k, v) => MapEntry( k, v.map((item) { item.remove('date'); return item; }).toList())); print(mySelectedEvents); }
方式2:传入groupBy前转换类型
如果不想修改解码语句,也可以在传入groupBy时通过cast方法转换类型:
void getData() async { var url = 'http://xxxxxxx/getEvents.php'; var res = await http.get(Uri.parse(url)); var response = json.decode(res.body); print(response); var mySelectedEvents = // 先将response转换为Iterable<Map<dynamic, dynamic>> groupBy(response.cast<Map<dynamic, dynamic>>(), (Map obj) => obj['date']).map((k, v) => MapEntry( k, v.map((item) { item.remove('date'); return item; }).toList())); print(mySelectedEvents); }
额外优化建议
如果接口返回的字段都是字符串类型的键,建议使用Map<String, dynamic>替代Map<dynamic, dynamic>,类型更严谨,能避免后续更多类型相关问题,修改后的类型断言为:
var response = json.decode(res.body) as List<Map<String, dynamic>>;
内容的提问来源于stack exchange,提问作者msi
相关产品推荐
相关产品推荐

