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

问题描述 投票:0回答:2

我正在使用以下代码从我的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);
          });


      });
    });
  }

现在收到新消息后,如何通知我的聊天室

当前,我正在使用以下代码来监听添加了孩子的事件

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"] ?? '');
    });
  }

但是我面临这个问题listenDataFromFireBase()从特定房间加载所有数据

我的要求是,每当在聊天室中添加新消息时,我都希望对其消息布局进行动画处理

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

如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。

firebase flutter firebase-realtime-database dart chat
2个回答
2
投票

正如您所发现的,onChildAdded对于任何现有数据都会立即触发,此后还会在添加任何数据时触发。如果要区分这两种情况,则需要结合使用onChild侦听器和onValue侦听器。

onValue侦听器中,您要做的只是标记事件是否已发生:

databaseReference.onValue.listen((event) {
  setState(() { 
    isInitialDataLoaded = true
  });
});

现在在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
  }
});

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


0
投票

您可以使用onValue

onValue

但是如果使用 /// Fires when the data at this location is updated. `previousChildKey` is null. Stream<Event> get onValue => _observe(_EventType.value); onValue,它将检索此onChildAdded下的所有数据,然后在添加数据时,将再次触发chatroom.chatId事件,并为您提供新数据。] >

© www.soinside.com 2019 - 2024. All rights reserved.