繁体   English   中英

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

[英]Flutter Firestore : Unable to delete item inside the broadcast stream

我遇到了一个问题,我正在开发一个聊天应用程序,我想在侦听器收到一条消息后删除它。 我是 flutter 和 firebase 的新手并卡在这里,请指导我如何解决这个问题。

//服务文件

@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);
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM