Как только вы позвоните 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
, но мы не делаем с ними ничего значимого.