Я недавно начал изучать плагины Flutter и FlutterFire.Вчера я работал с плагином firebase_database, который позволяет добавлять базу данных Firebase Realtime в Flutter.Пробуя простое чтение в базе данных, я заметил странное поведение в одном из потоков, предоставляемых firebase_database, который является onChildAdded.
Так что моя проблема в том, что когда я использую поток onChildAdded с StreamBuilder, он возвращает толькоединственный последний ребенок.Когда я работал с базой данных Firebase в Java, метод onChildAdded вызывался для каждого дочернего элемента DatabaseReference, а не только для последнего дочернего элемента.(Предполагая, что onChildAdded обеспечивает одинаковое поведение как в Java, так и в Dart)
Я должен также упомянуть, что когда я использую поток onValue, все работает отлично, и я получаю все дочерние элементы моего DatabaseReference.
Вот как выглядит моя база данных Firebase:
Код с использованием onChildAdded
Widget _getBody(BuildContext context) {
final DatabaseReference databaseRef = FirebaseDatabase.instance.reference();
return StreamBuilder(
stream: databaseRef.child("notes").child('android').onChildAdded,
builder: (BuildContext context, AsyncSnapshot<Event> snapshot) {
if (snapshot.hasData) {
Map<dynamic, dynamic> notes = snapshot.data.snapshot.value;
notes.forEach(
(key, value) {
print(notes[key]);
}
);
}
return Container(); //Just a blank widget because builder has to return a widget
},
);
}
Вывод для onChildAdded:
Код с использованиемonValue
Widget _getBody(BuildContext context) {
final DatabaseReference databaseRef = FirebaseDatabase.instance.reference();
return StreamBuilder(
stream: databaseRef.child("notes").child('android').onValue,
builder: (BuildContext context, AsyncSnapshot<Event> snapshot) {
if (snapshot.hasData) {
List<dynamic> notes = snapshot.data.snapshot.value;
notes.forEach(
(item) {
print("$item \n");
}
);
}
return Container(); //Just a placeholder because builder has to return a widget
},
);
}
Вывод для onValue:
Поэтому я надеялся, что можно будет получить все дочерние элементы, используя поток onChildAdded.Любая помощь приветствуется!