Firestore Streams 订阅

Posted

技术标签:

【中文标题】Firestore Streams 订阅【英文标题】:Firestore Streams subscription 【发布时间】:2020-10-15 11:34:22 【问题描述】:

我目前正在用颤振设计一个聊天应用程序,为此我正在使用 Firestore。我想知道这些流是如何工作的,因为我想知道读取次数,以便我可以预测限制。假设当前有 315 条消息,并且所有消息都在当前聊天屏幕中。如果一个人输入一条新消息,它将是第 316 条消息,因此 Flutter Stream 会读取所有 316 条消息,或者只是获取新添加的消息并将其附加到 315 成员列表中。

我看到很多视频阅读博客,他们只是错过了这一点。我想清楚地理解这一点。

return StreamBuilder<QuerySnapshot>(
      stream: _firestoreDatabase.collection(id).orderBy('time').snapshots(),
      builder: (context, snapshot) 
        if (!snapshot.hasData) 
          return Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Center(
                child: CircularProgressIndicator(
                  backgroundColor: Colors.lightBlueAccent,
                ),
              ),
            ],
          );
         else 
          final messages = snapshot.data.documents.reversed;
          List<MessageBubble> messageBubbles = [];
          for (var message in messages) 
            final messageText = message.data['amount'];
            final messageSender = message.data['team'];
            final timeDisp = message.data['timedisp'];
            final currentUser = teamName;

            bool isManager;
            if (messageSender.toString() == 'Manager') 
              isManager = true;
             else 
              isManager = false;
            

            final messageBubble = MessageBubble(
              sender: messageSender,
              text: messageText.toString(),
              isMe: currentUser == messageSender,
              timeDisp: timeDisp,
              isManager: isManager,
            );
            messageBubbles.add(messageBubble);
          

    return Expanded(
            child: ListView(
              reverse: true,
              padding: EdgeInsets.symmetric(vertical: 10, horizontal: 10),
              children: messageBubbles,
            ),
          );
        
      ,
    );

【问题讨论】:

请编辑问题以显示您正在使用的查询代码,以便我们更好地了解您在做什么。 是的,我已经添加了代码 【参考方案1】:

您从 Firestore 流中获取文档的方式取决于您在可能是 StreamBuilder 小部件上执行的查询。

如果您愿意,您可以让聊天的新成员获取当前聊天数据库中可用的所有 Firestore 文档,或者通过添加时间戳参数然后查询快照来获取最新的文档,例如这个:

Firebase.instance().collection("Chats").where("sentTimestamp",isGreaterThanOrEqualTo: new DateTime.now())

您可以通过以下问题了解有关按日期获取和比较的更多信息: How to fetch records by comparing with date in flutter cloud firestore plugin?

【讨论】:

要明确一点,这是 GreaterThanorEqualTo 将比较 firestore 数据库中的所有数据(时间戳),并且只会获取最新的消息,对吗? 没错。这样您就可以过滤掉不需要的文档。 非常感谢您的帮助。今天学了一个新方法! 确保在添加消息时创建时间戳字段并将其保存在数据库中。祝你好运! 我还遇到了另一个问题,因为我使用 datetime.now() 作为时间戳来对消息进行排序,我的一些朋友的时间快了 2 秒或者某种消息然后被排序错误的方式。你能建议一个更好的方法来找到正确的时间吗?【参考方案2】:

当您从它的流中执行查询时,它最初会读取所有匹配的文档。只要流处于活动状态,文档就会缓存在内存中。如果新文档与查询匹配,则只会读取新文档,而其他所有内容都将从内存中重用。它不会再次读取所有以前缓存的文档。

【讨论】:

非常感谢。这就是我一直在寻找的答案。 澄清一下,缓存内存就是我们移动设备中缓存的内存吧?

以上是关于Firestore Streams 订阅的主要内容,如果未能解决你的问题,请参考以下文章

ComponentWillUnmount取消订阅Firestore

如何使用 Stripe 订阅平台通过 Firestore 在 Stripe 中添加产品和价格

谷歌云发布/订阅功能在查询 Firestore 时给出“请求的快照版本太旧”

嵌套可观察订阅问题,无法取消订阅

在Redis pub / sub和Akka Streams中使用SSE的最简单方法是什么?

php Mostrar独家envío免费提供ocultar resto