Как оформить документы облачного пожарного хранилища последовательно с флаттером? - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь создать демонстрационное приложение чата с firebase во флаттере, но когда я отправляю сообщение, эти документы создаются случайно в любом месте базы данных 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();

   }
  }

Интерфейс для экрана чата:

метод получения сообщений из магазина:

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'],
                        );

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

Экран чата:

enter image description here

Снимок экрана My Cloud Firestore:

enter image description here

1 Ответ

1 голос
/ 17 января 2020

Это решено в соответствии с ответом @DougStevenson sir, я добавил новое поле с именем «messageTime» и добавил DateTime.now (), и извлек сообщения в соответствии с messageTime (сортировка по возрастанию).

I немного изменил мой код и работает отлично:

 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){
            ......

              },
           ),
         ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...