firebase - 从 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"));
});
}
}
总是出现坏状态错误。如果您能找出问题所在,我会很高兴。
这是我的防火规则。
解决方案
您应该使用该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");
},
);
推荐阅读
- html - Vuetify:根据(错误)消息的可见性调整输入字段的底部边距
- php - 如何打印解析为 php 对象的 json 字符串
- ios - 在 iOS RxSwift 中用适当的值区分 errorObserver
- openshift - 如何回滚以使用旧图像而不是保持最新(外部构建)?
- csv - 重复的标题名称 Apache Commons-csv(withAllowDuplicateHeaderNames 不起作用)
- xamarin - 从 C# 为 LinearLayout 设置 android:layout_weight
- reactjs - 包含 ReactJS 应用程序的 Docker 容器在本地运行,但在 Web 服务器上失败
- google-apps-script - 在 Column1 的值是动态的对象中获取列名及其值
- python - 如何从列中返回列表的所有子集?
- javascript - 在多维数组中查找值。3层深