#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») работает.