Флаттер: как получить вновь добавленную запись из базы данных Firebase в реальном времени? - PullRequest
0 голосов
/ 12 марта 2020

Я использую приведенный ниже код для извлечения всех данных из моего чата 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() загрузка всех данных из определенной комнаты

Мое требование всякий раз, когда новое сообщение добавляется в чат, я хочу анимировать макет моего сообщения

Как я могу получать уведомления на моем экране, когда новое сообщение добавляется в мою комнату чата.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Заранее спасибо. Ваши усилия будут оценены.

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Как вы обнаружили, onChildAdded запускается немедленно для любых существующих данных, а после этого также при добавлении любых данных. Если вы хотите различить guish между этими двумя случаями, вам нужно объединить onChild слушателя и onValue слушателя.

В onValue слушателе все, что вы делаете is флаг того, произошло ли это событие:

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 голосов
/ 12 марта 2020

Вы можете использовать onValue:

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

Но если вы используете onValue или onChildAdded, он получит все данные в этом chatroom.chatId, затем при добавлении данных событие onValue будет запущено снова и выдаст вам новые данные.

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