【问题标题】:Flutter sort Firebase snapshot by timestampFlutter 按时间戳对 Firebase 快照进行排序
【发布时间】: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

标签: firebase-realtime-database flutter


【解决方案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 在后台对这些侦听器进行重复数据删除,因此这是检测何时完成(初始和增量)更新完成的常用方法。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多