我正在尝试按时间戳对快照进行排序,但返回原始顺序。
数据结构看起来像这样
我有两个快照,时间戳分别为-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']);
});
答案 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"
。