firebase_database中onChildAdded流的意外行为

时间:2019-07-10 15:03:41

标签: android firebase-realtime-database flutter dart

我最近开始学习Flutter和FlutterFire插件。昨天我正在与 firebase_database插件,可将Firebase实时数据库添加到Flutter。在尝试一个 简单地读取数据库,我注意到firebase_database提供的Streams之一onChildAdded中发生了一些奇怪的行为。

所以我的问题是,当我将onChildAdded流与StreamBuilder一起使用时,它仅返回一个最新的子级。当我过去使用Java使用Firebase数据库时,为DatabaseReference的每个子项(而不是最新的子项)调用了onChildAdded方法。 (假设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流获取所有子级。任何帮助表示赞赏!

0 个答案:

没有答案