首页 > 解决方案 > 从 Flutter Firebase 的子集合中获取数据时出错

问题描述

在 Flutter 消息应用程序中,创建了聊天室,在对话屏幕上,我可以访问消息的子集合。但是,当我试图在主页(显示现有聊天)上访问相同的子集合时,我无法访问它们。

我有一组 ChatRoom,其中存储了用户作为数组。然后,名为 subcollection 的 Messages 存储消息。

看,该文档按字典顺序命名,并在两者之间附加。此外,它具有 Messages 集合。

在此处输入图像描述

并且消息集合也不是空的。

在主页上,现有的聊天显示在 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"));
    });
  }
}

总是出现坏状态错误。如果您能找出问题所在,我会很高兴。

编辑 :

这是我的防火规则。

标签: firebasefluttergoogle-cloud-firestore

解决方案


您应该使用该limit()方法,以便仅获得一个文档。然后您可以执行以下操作,知道列表的第一个(也是唯一的)元素是您要查找的文档: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");
  },
);

推荐阅读