Flutter中如何对Map内的data列表按pos字段值排序
报错原因
- 类型未显式声明:json.decode返回的结果默认是
dynamic类型,未做类型转换的前提下,Dart会将_position['data']识别为_InternalLinkedHashMap类型,该类型不存在sort方法。 - sort参数格式错误:代码中用大括号包裹了比较函数,实际传入sort方法的是Set类型,而非要求的Comparator函数;同时比较逻辑未取元素的
pos字段对比,业务逻辑不成立。
修正后代码
import 'dart:convert'; import 'package:http/http.dart' as http; final response = await http.get(Uri.parse('http://www.caguascriollos.com/nuevaweb/wp-json/sportspress/v2/tables')); // 显式转换解析结果为指定类型 List<Map<String, dynamic>> _positions = List<Map<String, dynamic>>.from(json.decode(response.body)); for (var positionItem in _positions) { // 转换data为列表类型,确保可调用sort方法 List<Map<String, dynamic>> dataList = List<Map<String, dynamic>>.from(positionItem['data']); // 按pos字段升序排序 dataList.sort((a, b) { int posA = int.tryParse(a['pos'].toString()) ?? 999; // 转换失败默认放在列表末尾 int posB = int.tryParse(b['pos'].toString()) ?? 999; return posA.compareTo(posB); }); // 排序后的列表赋值回原结构 positionItem['data'] = dataList; }
修改说明
- 所有JSON解析出的动态类型都做了显式转换,明确各字段的类型,避免Dart类型推断错误
- 移除了包裹比较函数的多余大括号,入参符合sort方法的参数要求
- 比较逻辑中读取元素的
pos字段做对比,同时兼容pos为字符串数字的场景,转换失败的元素默认放在列表末尾
内容的提问来源于stack exchange,提问作者Ignacio Martí
相关产品推荐
相关产品推荐

