Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Flatter firebase的子集合获取数据时出错_Firebase_Flutter_Google Cloud Firestore - Fatal编程技术网

从Flatter firebase的子集合获取数据时出错

从Flatter firebase的子集合获取数据时出错,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,在Fatter消息应用程序中,聊天室被创建,在对话屏幕上,我可以访问消息的子集合。但是当我试图在主页上访问同一个子集合时 (显示现有聊天记录的地方)我无法访问它们 我有一个聊天室的集合,其中用户作为一个数组存储。然后,名为subcollection的消息存储这些消息 请参阅,该文档的命名按词典顺序随附于之间。此外,它还具有消息集合 消息集合也不是空的 在主页上,现有聊天记录显示在listTile中。我想在副标题中显示最后一条消息 这里是最后一个消息有状态小部件 class _LastMess

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

我有一个聊天室的集合,其中用户作为一个数组存储。然后,名为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"));
    });
  }
}
class\u LastMessageState扩展状态{
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:FirebaseFirestore.instance
.收藏(“聊天室”)
.doc(widget.chatRoomID)
.收集(“信息”)
.orderBy(“时间”)
.快照()
.最后,
生成器:(上下文,文档快照){
返回文本(documentSnapshot.data.docs.last.get(“消息”);
});
}
}
总是出现坏状态错误。 如果你能解决这个问题,我会很高兴的

编辑:

这是我的firestore规则。

您应该使用该方法,以便只使用一个文档获得。然后,您可以执行以下操作,知道列表的第一个(也是唯一的)元素就是您要查找的文档:

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");
  },
);
返回FutureBuilder(
未来:FirebaseFirestore.instance。
.收藏(“聊天室”)
.doc(widget.chatRoomID)
.收集(“信息”)
.orderBy(“时间”,降序:true)
.限额(1)
.get(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
返回文本(“…”);
}
if(snapshot.connectionState==connectionState.done){
如果(snapshot.data.size>0){
返回文本(snapshot.data.docs[0].get(“消息”);
}否则{
返回文本(“无文件”);
}
}
返回文本(“加载”);
},
);
您应该使用该方法,以便仅使用一个文档获得。然后,您可以执行以下操作,知道列表的第一个(也是唯一的)元素就是您要查找的文档:

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");
  },
);
返回FutureBuilder(
未来:FirebaseFirestore.instance。
.收藏(“聊天室”)
.doc(widget.chatRoomID)
.收集(“信息”)
.orderBy(“时间”,降序:true)
.限额(1)
.get(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
返回文本(“…”);
}
if(snapshot.connectionState==connectionState.done){
如果(snapshot.data.size>0){
返回文本(snapshot.data.docs[0].get(“消息”);
}否则{
返回文本(“无文件”);
}
}
返回文本(“加载”);
},
);

显示RangeError(索引):无效值:有效值范围为空:0。那么,这是否意味着我无法访问邮件收集?我已经添加了云firestore规则,请看一看。是的,我完全复制了它。还有一件事,我想提一下。在LastMessage类的构造函数中,我接受。聊天室ID.LastMessage(聊天室ID:“DanielandVicky”)正在工作。它显示,RangeError(索引):无效值:有效值范围为空:0。那么,这是否意味着我无法访问邮件收集?我已经添加了云firestore规则,请看一看。是的,我完全复制了它。还有一件事,我想提一下。在LastMessage类的构造函数中,我接受。令人惊讶的是,LastMessage(聊天室ID:“DanielandVicky”)正在运行。