firebase - 如何刷新 Firebase streambuilder 并减少文档读取次数

标签 firebase flutter google-cloud-firestore

我正在努力与 Flutter 建立聊天,我计划使用 firestore。我有一个流构建器,我将读取的文档数量限制为 20。聊天工作正常并显示最后 20 条消息。现在,我想在滚动到顶部后立即添加接下来的 20 条旧消息。
我有一个可行的解决方案,但我不确定它是最好的解决方案。我最担心的是每次更改限制值时我正在执行多少次读取。我是在阅读 20 篇新文章还是阅读了 40 篇新文档?如果我滚动更多,我是否使用了 60 次读取?
见下面我的代码

void initState() {
    maxMessageToDisplay = 20;
    _scrollController = ScrollController();
    _scrollController.addListener(() {
      if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
        setState(() {
          maxMessageToDisplay += 20;
        });
      }
    });
    super.initState();
}

Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore.collection('chat').limit(maxMessageToDisplay).orderBy('timestamp', descending: true).snapshots(),
      builder: (context, snapshot) {
     
        final messages = snapshot.data.documents;

        messages.sort((a, b) => b.data['timestamp'].compareTo(a.data['timestamp']));
        var format = new DateFormat("Hm");

        List<MessageBubble> messageBubbles = [];
        for (var message in messages) {
          final messageText = message.data['text'];
          final messageSender = message.data['sender'];
          final messagePhoto = message.data['photo'];
          final messageUserId = message.data['uid'];

          final messageTime = format.format(DateTime.fromMillisecondsSinceEpoch(message.data['timestamp'], isUtc: false));    

          final messageBubble = MessageBubble(
            sender: messageSender,
            text: messageText,
            photo: messagePhoto,
            time: messageTime,
            userId: messageUserId,
          );
          messageBubbles.add(messageBubble);
        }
        return Expanded(
          child: ListView(
            controller: _scrollController,
            reverse: true,
            padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 10.0),
            children: messageBubbles,
          ),
        );
      },
    );
  }
}

最佳答案

如果监听器在 30 分钟内没有断开连接,则不必担心,因为 Firebase 仅在文档​​更改时计算新读取。
因此,在您的情况下,如果您阅读了 20 个文档,然后用户滚动并获得 20 个,您将只有 40 个而不是 60 个阅读。
您可以阅读有关 Firebase 计费的更多信息 here

关于firebase - 如何刷新 Firebase streambuilder 并减少文档读取次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63509021/

相关文章:

java - 如何从 Firebase 中检索 ListView 中的数据

ios - 自动完成文本字段和 Firebase

angular - 如何像 typescript 中的数组一样解析 Json 对象。 MAP firestore 内的 MAP

javascript - Firebase 云 Firestore + 身份验证 : write only for signed in users

firebase - Firestore : Getting a subcollection from a DocumentSnapshot

java - 适配器不显示 Firebase 实时数据库中的产品图片和价格

java - 来自 Firebase 的数据未显示在 RecyclerView 中

flutter - 有没有办法检查 flutter 中的互联网连接强度?

dart - 如何使用 FutureBuilder 从 ListView 中删除项目

flutter - 如何解决 Dart 的 future ?