Flutter Listview дублирует случайный элемент вместо добавления нового элемента к новым данным

#firebase #flutter #google-cloud-firestore #feed #stream-builder

#firebase #трепетание #google-облако-firestore #подача #stream-builder

Вопрос:

Я пытаюсь создать что-то вроде ленты с помощью Flutter и Firebase, и я хочу упорядочивать сообщения по их значению postedAt, но проблема в том, что когда я использую collection.OrderBy(), он не работает должным образом. Он добавляет новую запись в случайное место в ленте и дает ей ссылку на изображение случайной существующей записи (или я думаю, что она просто дублирует один элемент в ленте). Я создал индексы в Firebase, я попробовал оба типа индексов, но ни один из них не работает. Странно то, что когда я добавляю новое сообщение с телефона, когда мое добавление завершено, оно просто работает нормально, но при размещении на другом телефоне оно показывает описанное поведение.

Редактировать: при горячей перезагрузке он работает правильно (последнее добавленное сообщение отображается вверху) Редактировать: когда я удалил метод OrderBy, проблема продолжалась.

 StreamBuilder(
    stream: FirebaseFirestore.instance
      .collection("users")
      .doc(FirebaseAuth.instance.currentUser.uid)
      .collection("posts")
      .orderBy('postedAt', descending:true)
      .snapshots(),
    builder: (BuildContext context,AsyncSnapshot<QuerySnapshot> snapshot) {
       if (!snapshot.hasData) {
          return Center(
              child: CircularProgressIndicator(),
              );
        }

        if (snapshot.hasError) {
             print("error:"   snapshot.error.toString());
         }



     List<Post> posts = [];

     posts = snapshot.data.docs.map((postDoc) {
          return Post.fromDoc(postDoc);
      }).toList();

     if (posts.isEmpty) {
         return Center(
            child: Text("No posts"),
          );
     }

     return ListView.builder(
          cacheExtent: 4000,
          itemCount: posts.length,
          itemBuilder: (BuildContext context, int index) {
            return PostWidget(
                post: posts[index],
                );
            },
          );
        },
     )
 

мои индексы:

Составной индекс
единый индекс

скриншот документа: документ ss

Комментарии:

1. postedAt — это timeStamp поле?

2. Можете ли вы поделиться скриншотом образца документа?

3. @Muthu Thavamani нет, это не временная метка, это целое число DateTime.now().milisecondssinceepoch

4. Я отредактировал скриншот документа

Ответ №1:

Я решил эту проблему. Я подумал, что если он дублирует элементы, то, возможно, он не может их разделить. и добавил параметр ключа PostWidget , чтобы он работал.