首页 > 解决方案 > 如何用颤振连续排列云存储文件?

问题描述

我正在尝试在flutter中创建带有firebase的聊天演示应用程序,但是当我发送消息时,这些消息文档会在firestore数据库中的任何位置随机创建。这就是为什么我的聊天屏幕消息的方式不对,意味着没有按时间安排。

一些代码

将消息详细信息保存到 Firestore 的方法:

Future<void> sendMesssage() async{
   if(messagesController.text.length>0){
     String msgId = firestore.collection("messages").document().documentID.toString();

     await firestore.collection("messages").document(msgId).setData({
       'text': messagesController.text,
       "from": widget.user.user.email, //sender email Id
       "to":widget.chatMateEmail, // receiver email id
       "msgId":msgId,
       "senderUid": widget.user.user.uid, //sender uid
       "receiverUid":widget.receiverUid //receiver uid
     });
     messagesController.clear();

   }
  }

UI 聊天界面:

从 Firestore 获取消息的方法:

Expanded(
  child: StreamBuilder<QuerySnapshot>(
    stream: firestore.collection("messages").snapshots(),
    builder: (context, snapshot){
      if(snapshot.hasError){
          return Center(child: Text("${snapshot.error}"),);
        }
      if(!snapshot.hasData){
          return Center(child: CircularProgressIndicator(),);
        }else{
               List<DocumentSnapshot> docs = snapshot.data.documents;
                return
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ListView.builder(
                    itemCount: docs.length,
                    itemBuilder: (context, index){
                        print("Messagessssssss:${docs[index]['text']}");
                        return Message( // custom class
                          from:  docs[index]['from'],
                          text: docs[index]['text'],
                          me: widget.user.user.email == docs[index]['from'],
                        );

                      },
                     ),
                   );
                  }
                },
              ),
            ),

聊天画面:

在此处输入图像描述

我的 Cloud Firestore 屏幕截图:

在此处输入图像描述

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


根据@DougStevenson 先生的回答解决了,我添加了名为“messageTime”的新字段并添加了 DateTime.now(),并根据 messageTime 获取消息(按升序排序)。

我修改了一些代码并完美运行:

 Future<void> sendMesssage() async{
   if(messagesController.text.length>0){
     String msgId = firestore.collection("messages").document().documentID.toString();

     await firestore.collection("messages").document(msgId).setData({
       ..........
       "messageTime": DateTime.now() // message DateTime
     });
     messagesController.clear();

   }
  }
Expanded(
  child: StreamBuilder<QuerySnapshot>(
    stream: firestore.collection("messages").orderBy('messageTime', descending: false).snapshots(), //and sort by ascending order according to datetime.
    builder: (context, snapshot){
            ......

              },
           ),
         ),

推荐阅读