我正在使用以下代码从我的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()
从特定房间加载所有数据
我的要求是,每当在聊天室中添加新消息时,我都希望对其消息布局进行动画处理
每当在聊天室中添加新消息时,如何通知我的屏幕。
如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。
正如您所发现的,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实际上会检测到这种情况,并且仅从服务器读取一次数据,因此在这种情况下不会传输额外的数据。
您可以使用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
事件,并为您提供新数据。] >