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

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í

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:24:04