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

Flutter/Dart如何按当前到过往顺序排序月份列表?

按当前月份到过往月份排序Dart月份列表

要实现从十月(当前月份)开始,按过往月份的顺序排列列表,同时保证对应的数据不会错乱,你可以按照以下方式修改代码:

步骤说明

  1. 将月份与对应的数据(Totaleachlist)配对,避免排序后数据与月份脱节
  2. 定位当前月份在原列表中的索引
  3. 拆分配对后的列表,反转对应部分并合并,得到从当前月往过往月份排列的顺序
  4. 跳转详情页时使用原索引,确保页面数据正确

修改后的完整代码

class _HistoryviewState extends State<Historyview> {
  List<Map<String, dynamic>> monthData = [];

  @override
  void initState() {
    super.initState();
    // 原月份列表
    final originalMonths = [
      'January', 'February', 'March', 'April', 'May',
      'June', 'July', 'August', 'September', 'October',
      'November', 'December'
    ];
    
    // 将月份、对应数据、原索引组合成列表
    monthData = List.generate(originalMonths.length, (index) => {
      'month': originalMonths[index],
      'total': widget.appController.Totaleachlist[index],
      'originalIndex': index
    });

    // 定义当前目标月份
    const targetMonth = 'October';
    // 获取目标月份在原列表中的索引
    final targetIndex = originalMonths.indexOf(targetMonth);

    // 排序:先取目标月份及之前的部分反转(十月→一月),再取目标月份之后的部分反转(十二月→十一月)
    final sortedData = [
      ...monthData.sublist(0, targetIndex + 1).reversed,
      ...monthData.sublist(targetIndex + 1).reversed
    ];

    setState(() {
      monthData = sortedData;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("My History"),
      ),
      body: _buildListView(context),
    );
  }

  ListView _buildListView(BuildContext context) {
    return ListView.builder(
      itemCount: monthData.length,
      itemBuilder: (_, index) {
        final item = monthData[index];
        return ListTile(
          title: Text(item['month']),
          subtitle: Text('${item['total'].toStringAsFixed(3)}€'),
          leading: const Icon(Icons.account_balance_wallet_rounded),
          trailing: const Icon(Icons.arrow_forward),
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => DetailPage(item['originalIndex'], widget.appController)
              )
            );
          },
        );
      },
    );
  }
}

补充说明

  • 如果需要动态获取当前系统月份而非固定十月,可以使用DateTime.now().month来获取数字月份(1=一月,10=十月),再映射到对应的月份名称
  • 排序后的顺序为:十月→九月→八月→…→一月→十二月→十一月,完全符合从当前月份到过往月份的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:10:28