【问题标题】:How to sort a list in Flutter如何在 Flutter 中对列表进行排序
【发布时间】:2021-04-27 17:22:00
【问题描述】:

我正在颤振中构建一个列表,需要通过首先显示最近的时间戳来按日期对其进行排序。

该列表是从如下所示的 json 创建的:

[
   {
      "id":100,
      "timestamp":"2021-02-02T15:15:11Z",
      "name":"Entry1"
   },
   {
      "id":101,
      "timestamp":"2021-03-02T11:12:56Z",
      "name":"Entry2"
   }
]

使用fetchEntries 函数获取json 后,我想对列表进行排序。这是我的代码:

class Values extends Object {
  int id;
  String timestamp;
  String name;

  Values(
      {this.id,
      this.timestamp,
      this.name});

  Values.fromJson(Map<String, dynamic> json) {
    id = json["id"];
    timestamp = json["timestamp"];
    name = json["name"];
  }
}
List<Values> _myList = [];
    fetchReport() {
        _timer = new Timer.periodic(Duration(seconds: 1), (timer) {
            fetchEntries(dates.id.toString(), dates.from, dates.to)
                .then((value) => {
                      _myList.addAll(value),
                      _postsController.add(1),
                      setState(() {})
                    });
            _timer.cancel();
        });
        //This is the sort code that doesn't work
        _myList.sort((a,b)=> a.timestamp.compareTo(b.timestamp));
      }

或者,列表可以按 id 降序排序,但首选时间戳方法。任何建议如何正确地做到这一点?

【问题讨论】:

  • 您需要在比较它们之前解析时间戳。
  • 为什么时间戳是一个字符串?它应该是摄取时的 DateTime,否则 Values 的所有用户都需要独立进行相同的计算!

标签: android flutter sorting dart


【解决方案1】:

取数据后最好解析时间。

_myList.sort((a,b) {
    
    DateFormat formatter = DateFormat("yyyy-MM-ddTHH:mm:ssZ");
        DateTime aTime = formatter.parse(a["timestamp"]);
        DateTime bTime = formatter.parse(b["timestamp"]);
    
    return aTime.compareTo(bTime);
    //return bTime.compareTo(aTime);
    } 

【讨论】:

    【解决方案2】:

    我认为排序不起作用的问题是 _myList.sort 函数在 _myList 填充数据之前被调用。其原因是 _myList 在未来被填充(当 fetchEntires(...).then 的回调时)被调用,而排序函数在创建计时器后立即被调用(在 Timer.periodic 构造函数之后)。

    为了解决这个问题,您需要在列表填充数据后将 _myList.sort 移动到回调。

    关于排序本身。虽然它应该以您的示例格式比较日期,但我宁愿将时间解析为毫秒,然后进行比较。原因是一旦您将日期格式更改为不同的格式,例如“dd-MM-yyyy”排序就会被破坏。

    【讨论】:

    • 谢谢 Alex 的提示,原来我的排序函数没有解析时间字符串,我在填充数据之前进行了排序!点赞!
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2021-07-01
    • 2019-12-10
    • 1970-01-01
    • 2020-07-03
    • 2020-12-23
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多