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 中的快照代码不会被执行

Flutter:StreamBuilder 快照——无数据