Флаттер сортирует снимок Firebase по отметке времени - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь отсортировать снимок по отметке времени, но возвращает исходный порядок.
структура данных выглядит следующим образом 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 голосов
/ 04 сентября 2018

К сожалению, когда вы звоните snapshot.data?.snapshot?.value, в результате Map больше не остается места для порядка элементов.

В большинстве Firebase SDK вы можете решить эту проблему, зациклив дочерние элементы снимка в слушателе события value. Но во Флаттере вам нужно будет прослушивать события onChildAdded, чтобы сохранить значение элементов во Флаттере, по крайней мере до тех пор, пока эта проблема не будет решена: 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".

0 голосов
/ 04 сентября 2018

Из приведенного выше кода похоже, что у вас нет 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}}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...