Flutter:如何从firebase实时数据库获取新添加的记录?

Gok*_*oku 2 chat dart firebase firebase-realtime-database flutter

我使用下面的代码从我的 firebase 聊天室检索所有数据

void readDataFromFireBase() {

    var databaseReference =
        FirebaseDatabase.instance.reference().child("messages");

    databaseReference
        .child(chatroom.chatId)
        .once()
        .then((DataSnapshot snapshot) {
      Map<dynamic, dynamic> values = snapshot.value;

      values.forEach((key, value) {
        setState(() {
          chatMessageList.add(ChatMessage(
              value["message"], value["fromUser"], value["timestamp"]));
          chatMessageList.sort((a, b) {
            var formatter = new DateFormat('MM/dd/yyyy, kk:mm');
            var dateOne = formatter.parse(a.timestamp);
            var selectedDate = formatter.parse(b.timestamp);
            return dateOne.compareTo(selectedDate);
          });


      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

现在当新消息到达时我怎样才能通知我的聊天室

目前我正在使用下面的代码来监听子添加的事件

listenDataFromFireBase() {
    var db = FirebaseDatabase.instance.reference().child("messages");
    db.child(chatroom.chatId).onChildAdded.listen((data) {
      print("GET_NEW_DATA");
      print(data.snapshot.value["message"] ?? '');
      print(data.snapshot.value["fromUser"] ?? false);
      print(data.snapshot.value["timestamp"] ?? '');
    });
  }
Run Code Online (Sandbox Code Playgroud)

但我面临一个问题,即listenDataFromFireBase()加载特定房间的所有数据

我的要求是每当聊天室中添加新消息时我想要为我的消息布局设置动画

每当我的聊天室中添加新消息时,如何才能通知我的屏幕。

如果需要更多信息,请告诉我。提前致谢。您的努力将受到赞赏。

Fra*_*len 6

正如您所发现的,onChildAdded任何现有数据都会立即触发,之后也会在添加任何数据时触发。如果你想区分这两种情况,你需要组合一个onChild监听器和一个onValue监听器。

onValue侦听器中,您所做的就是标记该事件是否已发生:

databaseReference.onValue.listen((event) {
  setState(() { 
    isInitialDataLoaded = true
  });
});
Run Code Online (Sandbox Code Playgroud)

现在在侦听器中进行所有数据处理onChildAdded,从快照获取消息并将其添加到列表中。然后使用 来isInitialDataLoaded检测这是初始数据还是更新:

var db = FirebaseDatabase.instance.reference().child("messages");
db.child(chatroom.chatId).onChildAdded.listen((data) {
  // TODO: get message from snapshot and add to list

  if (isInitialDataLoaded) {
    // TODO: alert the view about the new data
  }
});
Run Code Online (Sandbox Code Playgroud)

因此,同一个节点上将有两个侦听器。Firebase SDK 实际上会检测到这种情况,并且只从服务器读取一次数据,因此在这种情况下不会传输额外的数据。