Flutter 按时间戳对 Firebase 快照进行排序
Posted
技术标签:
【中文标题】Flutter 按时间戳对 Firebase 快照进行排序【英文标题】:Flutter sort Firebase snapshot by timestamp 【发布时间】:2019-02-08 23:59:57 【问题描述】:我正在尝试按时间戳对快照进行排序,但返回原始顺序。 数据结构看起来像这样
我有两个快照,时间戳分别是 -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']);
);
【问题讨论】:
不幸的是,当您调用snapshot.data?.snapshot?.value;
时,生成的Map
不再有空间用于项目的顺序。您将需要收听 .childAdded
事件以维持 Flutter 中项目的价值,至少在此问题得到解决之前:github.com/flutter/flutter/issues/20745。
感谢您的评论。所以,基本上你不能迭代,直到它得到修复对吧?
正确。但是你可以听.childAdded
来完成同样的onChildAdded
。
【参考方案1】:
从上面的代码来看,您似乎没有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]
【讨论】:
【参考方案2】:不幸的是,当您调用snapshot.data?.snapshot?.value
时,生成的Map
不再有空间用于项目的顺序。
在大多数 Firebase SDK 中,您可以通过在值事件侦听器中循环快照的子级来解决此问题。但在 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"
。
【讨论】:
不。 Firebase 在后台对这些侦听器进行重复数据删除,因此这是检测何时完成(初始和增量)更新完成的常用方法。以上是关于Flutter 按时间戳对 Firebase 快照进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在firebase-flutter中为快照数据指定字段[重复]
在加载 Firebase 快照时使用 Flutter 中的 Bloc 流式等待和阻止其他事件
Flutter firebase 查询快照错误:“未处理的异常:错误状态:无元素”
Flutter Firebase:状态不佳:快照既没有数据也没有错误
在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行