【问题标题】:Flutter : how to get newly added record from firebase real time database?Flutter:如何从 firebase 实时数据库中获取新添加的记录?
【发布时间】:2020-06-24 12:01:08
【问题描述】:

我正在使用以下代码从我的 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() 从特定房间加载所有数据

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

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

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

【问题讨论】:

  • 哪个特定部分导致问题? 1) 通知 Flutter 视图? 2) 在初始消息加载后检测新消息何时到达?
  • @FrankvanPuffelen 第二个问题在初始消息加载后检测新消息何时到达?

标签: firebase flutter firebase-realtime-database dart chat


【解决方案1】:

你可以使用onValue:

  /// Fires when the data at this location is updated. `previousChildKey` is null.
  Stream<Event> get onValue => _observe(_EventType.value);

但是如果您使用onValueonChildAdded,它将检索此chatroom.chatId 下的所有数据,然后当您添加数据时,onValue 事件将再次触发并为您提供新数据。

【讨论】:

  • 嗨,firestore 收藏也可以吗?还是只是实时数据库?我可以在那个时候收到任何用户发送的新消息吗?
  • 如果你想继续监听任何新数据,那么是的,有一个方法snapshots(),它返回一个Stream。 @ShotoTodoroki
  • 所以它会像实时聊天会话一样工作吗?如果两个用户同时发送消息,他们将能够看到彼此的消息?
【解决方案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 实际上检测到了这种情况,只从服务器读取一次数据,所以在这种情况下没有额外的数据被传输。

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2019-04-13
    • 1970-01-01
    • 2020-09-07
    • 2021-07-18
    相关资源
    最近更新 更多