【问题标题】:Firebase messages not saved in order flutter draftFirebase 消息未按顺序保存 Flutter 草稿
【发布时间】:2020-10-31 13:27:26
【问题描述】:

我基本上正在构建一个消息应用程序,用户可以在其中添加消息(任务),该消息将保存在 firebase 中。然后它应该在屏幕上按顺序显示为“消息气泡”(屏幕底部的最新消息)。消息没有按顺序显示。查看我的 firebase 数据库集合,似乎消息没有按到达时间的顺序保存。这是正常行为吗?这是否意味着我必须对快照进行排序?我认为快照会以与发送消息完全相同的顺序向我显示消息。

 TextField(
              controller: messageTextController,
              autofocus: true,
              textAlign: TextAlign.center,
              cursorColor: Colors.white,
              style: TextStyle(color: Colors.white, fontSize: 20.0),
              onChanged: (newText) {
                newTaskTitle = newText;
              },
            ),
            FlatButton(
              child: Text(
                'Add',
                style: TextStyle(
                  color: kSlate,
                ),
              ),
              color: kSlateBorder,
              onPressed: () {
                messageTextController.clear();
                firestore.collection('Slate1').add({
                  'Task': newTaskTitle,
                  'User': loggedInUser.email,
                });
                Navigator.pop(context);
              },
            ),



Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: firestore.collection('Test').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(
              backgroundColor: Colors.lightBlueAccent,
            ),
          );
        }
        final messages = snapshot.data.documents.reversed;
        List<MessageBubble> messageBubbles = [];
        for (var message in messages) {
          final messageText = message.data['Task'];
          final messageSender = message.data['User'];

          final currentUser = loggedInUser.email;

          final messageBubble = MessageBubble(
            sender: messageSender,
            text: messageText,
            isMe: currentUser == messageSender,
          );

          messageBubbles.add(messageBubble);
        }

【问题讨论】:

    标签: database firebase flutter dart google-cloud-firestore


    【解决方案1】:

    Firestore 中的文档并非按时间自然排序。在控制台中,它们按文档 ID 排序。

    如果您想对集合中的文档进行排序,您应该为此使用文档字段。考虑为每条消息添加一个时间戳字段,然后使用该时间戳order your query

    【讨论】:

      【解决方案2】:

      如果其他人正在寻找答案/实施:

      这是我添加 Firebase 服务器时间戳的方式

      firestore.collection('Test1').add({
                        'Task': newTaskTitle,
                        'User': loggedInUser.email,
                        'Timestamp': FieldValue.serverTimestamp(),
                      });
      

      然后根据时间戳在此处订购:

      return StreamBuilder<QuerySnapshot>(
            stream: firestore.collection('Test1').orderBy('Timestamp').snapshots(),
            builder: (context, snapshot) {
              if (!snapshot.hasData) {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 2017-09-28
        • 2017-06-17
        相关资源
        最近更新 更多