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

Flutter中如何按int类型值对对象列表进行排序?

在Flutter中按tourPos字段对Orders列表排序的实现方法

当然可以实现啦!在Flutter里按tourPos字段给Orders列表排序是非常常见的需求,我给你拆解一下具体怎么做:

第一步:先定义对应的Dart实体类

首先得把你提供的JSON结构转换成Dart的实体类,方便后续操作。这里我给你写一个基础的示例(你可以根据实际字段补充完整):

class Order {
  final int kundenId;
  final String kundenbezeichnung;
  final String kundenNr;
  // 省略其他不需要展示的字段...
  int tourPos; // 因为你需要修改这个值,所以不要用final修饰
  final List<Position> positionen;

  Order({
    required this.kundenId,
    required this.kundenbezeichnung,
    required this.kundenNr,
    required this.tourPos,
    required this.positionen,
    // 其他字段的构造参数
  });

  // 从JSON解析成Order对象的工厂方法
  factory Order.fromJson(Map<String, dynamic> json) {
    return Order(
      kundenId: json['kundenId'],
      kundenbezeichnung: json['kundenbezeichnung'],
      kundenNr: json['kundenNr'],
      tourPos: json['tourPos'],
      positionen: (json['positionen'] as List)
          .map((posJson) => Position.fromJson(posJson))
          .toList(),
      // 其他字段的映射
    );
  }
}

class Position {
  final int kundenId;
  final int belposId;
  final int artikelId;
  // 省略其他字段...

  Position({
    required this.kundenId,
    required this.belposId,
    required this.artikelId,
    // 其他构造参数
  });

  factory Position.fromJson(Map<String, dynamic> json) {
    return Position(
      kundenId: json['kundenId'],
      belposId: json['belposId'],
      artikelId: json['artikelId'],
      // 其他字段的映射
    );
  }
}

第二步:实现排序逻辑

根据你的列表是否可变,有两种常用的排序方式:

1. 对可变列表直接排序

如果你的订单列表是普通的可变列表(比如用List<Order> orders = [];创建的),直接调用sort方法就行,传入一个比较函数:

// 按tourPos升序排序(从小到大)
orders.sort((a, b) => a.tourPos.compareTo(b.tourPos));

// 如果需要降序(从大到小),把a和b反过来就行:
orders.sort((a, b) => b.tourPos.compareTo(a.tourPos));

2. 对不可变列表生成排序后的新列表

如果你的列表是不可变的(比如用List.unmodifiable创建的,或者不想修改原列表),可以生成一个新的排序后的列表:

// 方法一:先复制原列表再排序
List<Order> sortedOrders = List.from(orders)..sort((a, b) => a.tourPos.compareTo(b.tourPos));

// 方法二:使用dart:collection的sorted扩展(需要先导入)
import 'dart:collection';
List<Order> sortedOrders = orders.sorted((a, b) => a.tourPos.compareTo(b.tourPos));

第三步:修改tourPos后重新排序

你提到会修改tourPos的值,修改完成后只要重新调用排序方法,就能得到更新后的排序结果啦。如果是在UI中展示,记得调用setState(StatefulWidget)或者更新状态管理中的数据,这样界面才会刷新:

// 示例:修改第一个订单的tourPos值
orders[0].tourPos = 3;

// 重新排序
orders.sort((a, b) => a.tourPos.compareTo(b.tourPos));

// 如果是StatefulWidget,记得调用setState更新UI
setState(() {});

额外注意点

如果tourPos有可能为null,一定要在比较时处理null的情况,避免报错:

orders.sort((a, b) {
  // 两个都为null则相等
  if (a.tourPos == null && b.tourPos == null) return 0;
  // a为null则排前面(你可以根据需求改成排后面,return 1即可)
  if (a.tourPos == null) return -1;
  // b为null则排前面
  if (b.tourPos == null) return 1;
  // 正常比较数值
  return a.tourPos!.compareTo(b.tourPos!);
});

内容的提问来源于stack exchange,提问作者moboldi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:27:27