Сообщения Firebase не сохраняются в черновике упорядочивания - PullRequest
0 голосов
/ 10 июля 2020

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

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Документы в Firestore естественно не упорядочены по времени. В консоли они отображаются упорядоченными по идентификатору документа.

Если вы хотите упорядочить документы в коллекции, вы должны использовать для этого поле документа. Подумайте о добавлении поля отметки времени к каждому сообщению, а затем упорядочите свой запрос , используя эту отметку времени.

0 голосов
/ 11 июля 2020

на случай, если кто-то еще искал ответ / реализацию:

вот как я добавил временную метку сервера 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) {
...