Flutter: база данных в реальном времени Firebase orderByChild не влияет на результат запроса - PullRequest
0 голосов
/ 21 апреля 2020

Я вставил такие данные в базу данных реального времени Firebase следующим образом:

enter image description here

И я запросил базу данных обратно следующим образом:

final databaseReference = FirebaseDatabase.instance.reference();
databaseReference
    .child('orders')
    .orderByChild('date_slug')
    .limitToFirst(pageSize)
    .once()
    .then((snapshot) {
  firstPageItems = snapshot.value;

  if (firstPageItems != null) {
    List<dynamic> curretList = [];
    firstPageItems.forEach((orderId, orderData) {

      print ("date_slug " + orderData['date_slug'] + "\r\n\r\n\r\n");
      curretList.add(orderData);
    });

    _list.addAll(curretList);
    _listController.sink.add(_list);
  }
});

Однако данные вернулись не так, как я ожидал. Смотрите вывод ниже.

I/flutter (17125): date_slug 2020-04-20 15:52:13
I/flutter (17125): 
I/flutter (17125): 
I/flutter (17125): date_slug 2020-04-20 15:52:11
I/flutter (17125): 
I/flutter (17125): 
I/flutter (17125): date_slug 2020-04-20 15:52:10
I/flutter (17125): 
I/flutter (17125): 
I/flutter (17125): date_slug 2020-04-20 15:52:12

1 Ответ

3 голосов
/ 21 апреля 2020

Как только вы позвоните firstPageItems = snapshot.value, вы конвертируете результаты в карту / словарь. Словарь может содержать ключи и значения результатов, но в нем нет места для относительного порядка результатов.

Чтобы сохранить порядок результатов, вам нужно либо наблюдать onChildAdded :

databaseReference
    .child('orders')
    .orderByChild('date_slug')
    .limitToFirst(pageSize)
    .onChildAdded
    .forEach((event) => {
      print(event.snapshot.value)
    });

Кроме того, вы можете FirebaseList класс из библиотеки FlutterFire, которая использует тот же onChildAdded и другие потоки onChild... для поддержки индексированного списка.

Пример использования этого класса:

var ref = databaseReference
  .child('orders')
  .orderByChild('date_slug')
  .limitToFirst(pageSize)
list = FirebaseList(query: ref, 
  onChildAdded: (pos, snapshot) {},
  onChildRemoved: (pos, snapshot) {},
  onChildChanged: (pos, snapshot) {},
  onChildMoved: (oldpos, newpos, snapshot) {},
  onValue: (snapshot) {
    for (var i=0; i < this.list.length; i++) {
      print('$i: ${list[i].value}');
    }
  }
);

Как вы можете видеть, он использует поток списка onValue для l oop по дочерним элементам по порядку. Методы onChild... необходимы для класса FirebaseList, но мы не делаем с ними ничего значимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...