Ошибка получения данных из вложенной коллекции flutter firebase

#firebase #flutter #google-cloud-firestore

#firebase #флаттер #google-облако-firestore

Вопрос:

В приложении обмена сообщениями flutter создаются чаты, и на экране беседы я могу получить доступ к вложенной коллекции сообщений. Но когда я пытаюсь получить доступ к той же вложенной коллекции на главной странице (где отображаются существующие чаты) Я не могу получить к ним доступ.

У меня есть коллекция чатов, в которых хранятся пользователи в виде массива. Затем сообщения с именем subcollection сохраняют сообщения.

Смотрите, документ называется лексикографически, прикрепленный к и между ними. Кроме того, у него есть коллекция сообщений.

введите описание изображения здесь

И коллекция сообщений также не пуста.

На главной странице существующие чаты отображаются в ListTile. Я хочу показать последнее сообщение в его подзаголовке.

Итак, вот последний виджет с отслеживанием состояния сообщения.

 class _LastMessageState extends State<LastMessage> {
  
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<QuerySnapshot>(
        future: FirebaseFirestore.instance
            .collection("ChatRooms")
            .doc(widget.chatRoomID)
            .collection("Messages")
            .orderBy("Time")
        .snapshots()
        .last,
    builder: (context, documentSnapshot) {
      return Text(documentSnapshot.data.docs.last.get("Message"));
    });
  }
}
 

Всегда появляется ошибка плохого состояния.
Я был бы рад, если бы вы могли разобраться в проблеме.

Редактировать :

Это мои правила firestore.

Ответ №1:

Вы должны использовать этот limit() метод, чтобы получить a QuerySnapshot только с одним документом. Затем вы можете поступить следующим образом, зная, что первый (и уникальный) элемент docs списка — это документ, который вы ищете:

 return FutureBuilder<QuerySnapshot>(
  future: FirebaseFirestore.instance.
        .collection("ChatRooms")
        .doc(widget.chatRoomID)
        .collection("Messages")
        .orderBy("Time", descending: true)
        .limit(1)
        .get(),

  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {

    if (snapshot.hasError) {
      return Text("...");
    }

    if (snapshot.connectionState == ConnectionState.done) {
      if (snapshot.data.size > 0) {
        return Text(snapshot.data.docs[0].get("Message"));
      } else {
        return Text("No document");
      }
    }

    return Text("Loading");
  },
);
 

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

1. Он показывает: RangeError (index): Недопустимое значение: допустимый диапазон значений пуст: 0. Значит ли это, что я не могу получить доступ к коллекции сообщений? Я добавил правила облачного firestore, не могли бы вы, пожалуйста, взглянуть.

2. Да, я точно скопировал его.

3. Я хочу упомянуть еще об одной вещи. В конструкторе класса LastMessage я принимаю. chatroomID.

4. и удивительно.

5. LastMessage (chatroomID: «DanielandVicky») работает.