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

如何在Flutter或Dart中按日期对列表进行排序?

在Flutter/Dart中按日期对列表排序的实现方法

核心思路

要实现按日期排序,关键是把列表元素的日期字符串转换为DateTime对象,利用DateTime的内置比较逻辑对列表进行排序,再基于排序后的列表构建UI。

具体实现步骤

  1. 日期字符串转DateTime对象
    你的数据中每个元素的rawDate是YYYY-MM-DD格式字符串,可直接用DateTime.parse()方法转换为可比较的DateTime对象。

  2. 列表排序
    使用List.sort()方法,传入自定义比较函数,按DateTime的先后顺序完成升序/降序排序。

  3. 基于排序后的数据构建列表
    将排序后的列表传入ListView.builder,替代原有的未排序数据。

修改后的完整代码示例

Widget _scheduleViewAllBody(ScheduleAll data) {
  // 1. 复制原列表并按日期升序排序
  List<Schedule> sortedData = List.from(data.data);
  sortedData.sort((a, b) {
    DateTime dateA = DateTime.parse(a.rawDate);
    DateTime dateB = DateTime.parse(b.rawDate);
    return dateA.compareTo(dateB); // 要降序就改为dateB.compareTo(dateA)
  });

  // 简化当前日期格式化逻辑
  String currentDateStr = "${DateTime.now().year}-${DateTime.now().month.toString().padLeft(2, '0')}-${DateTime.now().day.toString().padLeft(2, '0')}";

  int? _currentDate;
  if (_currentDate == null) {
    // 在排序后的列表中定位当前日期位置
    for (int index = 0; index < sortedData.length; index++) {
      if (sortedData[index].rawDate == currentDateStr) {
        _currentDate = index;
        break;
      }
    }
  }

  var viewAll = RectGetter(
    key: listViewKey,
    child: ListView.builder(
      controller: _scrollController,
      itemCount: sortedData.length,
      itemBuilder: (context, index) {
        _keys[index] = RectGetter.createGlobalKey();

        print('$currentDateStr => ${sortedData[index].rawDate}');
        
        // 这里继续编写你原本的列表项UI构建逻辑
        return YourScheduleListItem(schedule: sortedData[index]);
      },
    ),
  );

  return viewAll;
}

注意事项

  • 确保rawDate是标准YYYY-MM-DD格式,若格式不固定,建议用intl包的DateFormat类来解析,避免解析异常。
  • 排序时复制原列表(List.from(data.data)),防止修改源数据影响其他业务逻辑。
  • 调整排序方向只需调换比较函数中两个DateTime对象的位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:35:27