Flutter/Dart如何按当前到过往顺序排序月份列表?
按当前月份到过往月份排序Dart月份列表
要实现从十月(当前月份)开始,按过往月份的顺序排列列表,同时保证对应的数据不会错乱,你可以按照以下方式修改代码:
步骤说明
- 将月份与对应的数据(
Totaleachlist)配对,避免排序后数据与月份脱节 - 定位当前月份在原列表中的索引
- 拆分配对后的列表,反转对应部分并合并,得到从当前月往过往月份排列的顺序
- 跳转详情页时使用原索引,确保页面数据正确
修改后的完整代码
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
相关产品推荐
相关产品推荐

