【问题标题】:How to get new messages on bottom of the list view如何在列表视图底部获取新消息
【发布时间】:2021-01-12 17:05:18
【问题描述】:

当我从 fire base 获取消息时,新消息会随机出现在列表视图中,如何在颤振中设置列表视图底部的新消息?

代码如下:

 body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            StreamBuilder<QuerySnapshot>(
              stream: _firestore.collection('messages').snapshots(),
              builder: (context, snapshot) {
                List<MyMessageContainer> messageWidget = [];
                if (!snapshot.hasData) {
                  return Center(
                    child: CircularProgressIndicator(
                      backgroundColor: Colors.lightBlue,
                    ),
                  );
                }
                final messagesDoc = snapshot.data.docs.reversed;
                for (var messageData in messagesDoc) {
                  final messageBody = messageData.data();
                  final messageText = messageBody['text'];
                  final messageSender = messageBody['sender'];
                  final msg = MyMessageContainer(
                    message: messageText,
                    sender: messageSender,
                    isCurrentUser: messageSender == user.email ? true : false,
                  );
                  messageWidget.add(msg);
                }
                return Expanded(
                  child: ListView(
                    reverse: true,
                    children: messageWidget,
                  ),
                );
              },
            ),

【问题讨论】:

    标签: android firebase flutter google-cloud-firestore


    【解决方案1】:

    Firestore 没有内置方法来识别“新”消息。如果需要,您必须在每个文档中存储一个带有时间戳的值。

    完成后,您可以在代码中以正确的顺序获取它们:

    _firestore.collection('messages').orderBy("timestampField").snapshots()
    

    【讨论】:

    • 我使用 orderBy 时无法正常工作,所有消息都消失了。另一种解决方案??
    • 您是否在文档中添加了timestampField,正如我在第一句话中所说的那样?否则,查询确实不会匹配任何内容,因为 Firebase 没有内置机制来查询文档的创建/编辑时间。
    • 是的,我将 timestampField 作为 String 参数按顺序传递,然后所有消息都消失了。
    • 请再仔细阅读我的回答,尤其是前两句话:Firestore 没有内置方法来识别“新”消息。如果你想这样做,你必须在每个文档中存储一个带有时间戳的值。只有在你这样做之后,查询才会开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2013-07-20
    相关资源
    最近更新 更多