Flutter按时间戳对Firebase快照进行排序

时间:2018-09-04 02:29:56

标签: firebase-realtime-database flutter

我正在尝试按时间戳对快照进行排序,但返回原始顺序。
数据结构看起来像这样 enter image description here

我有两个快照,时间戳分别为-1536025466539-1536025893015
因此,我希望-1536025893015在排序之后排在第一位。 有人知道如何正确排序吗?

代码:

Map<dynamic, dynamic> map = snapshot.data?.snapshot?.value;
    map.values.toList().sort((a, b) {
      return a['timestamp'].compareTo(b['timestamp']);
    // also not work return b['timestamp'].compareTo(a['timestamp']);
  });

2 个答案:

答案 0 :(得分:2)

从上面的代码中,您似乎没有variable来保存列表。

 Map<dynamic, dynamic> map = {
    "one": {"timestamp": 1},
    "two": {"timestamp": 2}
  };
  List list = map.values.toList(); //variable which holds new list created from Map.
                                   //As it new list, any change in list will not have no impact on map.
  list.sort((a, b) {
    return b["timestamp"].compareTo(a["timestamp"]);
  }); // inplace sort
  print(list); // [{timestamp: 2}, {timestamp: 1}]

如果您还希望在结果中使用key

 var list = map.entries.toList();
 list.sort((a, b) => b.value["timestamp"].compareTo(a.value["timestamp"]));
 var list2 = list.map((a) => {a.key: a.value}).toList();
 print(list2); // [{two: {timestamp: 2}}, {one: {timestamp: 1}}]

答案 1 :(得分:1)

不幸的是,当您调用snapshot.data?.snapshot?.value时,生成的Map不再有项目顺序的空间。

在大多数Firebase SDK中,您可以通过在value事件侦听器中循环快照的子级来解决此问题。但是在Flutter中,您至少需要听onChildAdded事件以保持Flutter中项目的价值,直到解决此问题为止:https://github.com/flutter/flutter/issues/20745

来自我自己的项目之一:

ref.orderByKey().equalTo("child1").onChildAdded.listen((event) {
  print(event.snapshot.key);
});
ref.child("child1").once().then((snapshot) {
  print("Done loading all data for child1");
});

这将首先按照请求的顺序打印所有子节点的键,然后打印"Done loading all data for child1"