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