Неожиданное поведение потока onChildAdded в базе данных firebase_database - PullRequest
1 голос
/ 10 июля 2019

Я недавно начал изучать плагины Flutter и FlutterFire.Вчера я работал с плагином firebase_database, который позволяет добавлять базу данных Firebase Realtime в Flutter.Пробуя простое чтение в базе данных, я заметил странное поведение в одном из потоков, предоставляемых firebase_database, который является onChildAdded.

Так что моя проблема в том, что когда я использую поток onChildAdded с StreamBuilder, он возвращает толькоединственный последний ребенок.Когда я работал с базой данных Firebase в Java, метод onChildAdded вызывался для каждого дочернего элемента DatabaseReference, а не только для последнего дочернего элемента.(Предполагая, что onChildAdded обеспечивает одинаковое поведение как в Java, так и в Dart)

Я должен также упомянуть, что когда я использую поток onValue, все работает отлично, и я получаю все дочерние элементы моего DatabaseReference.

Вот как выглядит моя база данных Firebase:

This is how my Firebase Database looks

Код с использованием 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: Output for 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:

Output for onValue

Поэтому я надеялся, что можно будет получить все дочерние элементы, используя поток onChildAdded.Любая помощь приветствуется!

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