Flutter Firestore:无法删除广播流中的项目



我面临一个问题,我正在开发一个聊天应用程序,在该应用程序中,我希望在听众收到消息后删除该消息。我是新来的,被火球卡住了,请指导我如何解决这个问题。

//服务文件

@override
Stream<Message> messages({required User activeUser}) {
_startReceivingMessages(activeUser);
return _controller.stream;
}
_startReceivingMessages(User activeUser) {
_changeFeed = _messageCollection
.where('to', isEqualTo: activeUser.id)
.snapshots(includeMetadataChanges: false)
.asBroadcastStream()
.listen((snapData) {
if (snapData.docs.isEmpty) return;
snapData.docs.forEach((feedData) async {
final message = _messageFromFeed(feedData);
_controller.sink.add(message);
await _removeDeliverredMessage(message);
});
});
}
Message _messageFromFeed(feedData) {
return feedData.data();
}
_removeDeliverredMessage(Message message) async {
log("try deleting start");
// _changeFeed!.pause();
await _messageCollection.doc(message.id).delete();
// _changeFeed!.resume();
log("try deleting stop");
}
//collections
CollectionReference<Message> get _messageCollection =>
firestore.collection('messages').withConverter<Message>(
fromFirestore: ((snapshot, _) {
return Message.fromJson({
'id': snapshot.id,
'to': snapshot.data()!['to'],
'from': snapshot.data()!['from'],
'contents': encryption.decrypt(snapshot.data()!['contents']),
'timestamp': snapshot.data()!['timestamp'].toDate()
});
}),
toFirestore: ((message, _) => message.toJson()),
);

//测试文件

test('receive suscribe and recieve', () async {
Message message = Message(
from: user2.id!,
to: user1.id!,
timestamp: DateTime.now(),
contents: "Mesaage from Rahul",
);
Message secondMessage = Message(
from: user2.id!,
to: user1.id!,
timestamp: DateTime.now(),
contents: "Another Mesaage from Rahul",
);
await sut.send(message);
sut.messages(activeUser: user1).listen((message) {
log("Messages :::");
log(message.toJson().toString());
});
await sut.send(secondMessage);
});

//输出

Connecting to VM Service at http://127.0.0.1:59909/5QohWpYTglo=/ws
[log] ================LISTERN Message====================
[log] try deleting start
[log] Messages :::
[log] {from: 1111, to: 1234, contents: Mesaage from Rahul, timestamp: 2022-09-17 14:50:34.097438}
[log] try deleting stop
[log] ================LISTERN Message====================
2
[log] try deleting start
[log] Messages :::
[log] {from: 1111, to: 1234, contents: Mesaage from Rahul, timestamp: 2022-09-17 14:50:34.097438}
2
[log] try deleting stop
[log] Messages :::
[log] {from: 1111, to: 1234, contents: Another Mesaage from Rahul, timestamp: 2022-09-17 14:50:34.097715}
✓ receive suscribe and recieve
Exited

我也收到了被删除的消息。请帮帮我。谢谢编码员。度过美好的一天

您需要在此处使用forEachasync版本。

_changeFeed = _messageCollection
.where('to', isEqualTo: activeUser.id)
.snapshots(includeMetadataChanges: false)
.asBroadcastStream()
.listen((snapData) async {
await Future.forEach(snapData.docs, (feedData) async {
final message = _messageFromFeed(feedData);
if (!_controller.isClosed) {
_controller.sink.add(message);
}
await _removeDeliverredMessage(message);
});
});

最新更新