如何从集合中的文档访问字段
How to access field from document in collection
我的 Firestore 数据库中有一组聊天记录。集合中有一堆文档。每个文档都是一条消息。
我现在正在尝试访问集合中的每条消息和某些特定字段,但我 运行 遇到了问题。
这里是我聊天的地方:
_getChats(String individualId) async {
print("in get chats");
Query q = FirebaseFirestore.instance
.collection("users")
.doc(uid)
.collection('messages')
.doc(individualId)
.collection('chats')
.orderBy("dateTime", descending: true)
.limit(10);
setState(() {
_loadingChats = true;
});
QuerySnapshot querySnapshot = await q.get();
_chats = querySnapshot.docs;
setState(() {
_loadingChats = false;
});
}
在上面的代码中,我将文档分配给一个列表。在这里,我将列表定义为:
List<DocumentSnapshot> _chats = [];
最后,我使用列表视图加载聊天,如下所示:
Widget _showChats2() {
return ListView.builder(itemBuilder: (BuildContext context, int index) {
//Chat chat = _chats[index];
bool isMe = _chats[index].data["senderId"] == uid;
return Align(
alignment: isMe ? Alignment.centerRight
: Alignment.centerLeft,
child: Column(
children: [
Align(
alignment: isMe ? Alignment.centerRight
: Alignment.centerLeft,
child: Card(
color: isMe
? Colors.purpleAccent
: Colors.white,
elevation: 2,
child: Padding(
padding: const EdgeInsets.all(12),
child: Text(
_chats[index].data["message"],
style: TextStyle(
color: isMe
? Colors.white
: Colors.black
),
),
),
),
),
Align(
alignment: isMe
? Alignment.topRight
: Alignment.topLeft,
child: Padding(
padding: isMe ? const EdgeInsets.only(
right: 12)
: const EdgeInsets.only(left: 12),
child: MidText(text: DateFormat('kk:mm').format(
_chats[index].data["dateTime"])),
)
)
],
),
);
});
}
当我尝试使用方括号[] 访问文档的字段时出现上述错误。我想知道在这种情况下从文档字段访问数据的正确方法
而不是_chats[index].data["message"]
尝试 _chats[index]['message']
这里有一些建议
- 使用 streambuilder 而不是下载列表中的聊天记录
- 为消息创建无状态小部件
- 还要避免创建长链的集合和文档,它会让你陷入一些界限。
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance
.collection("users")
.doc(uid)
.collection('messages')
.doc(individualId)
.collection('chats')
.orderBy("dateTime", descending: true)
.limit(10)
.snapshots(),
builder: (_, snapshot) {
return ListView.builder(
itemCount: snapshot.data!.docs.length,
itemBuilder: (BuildContext context, int index) {
return Text(snapshot.data!.docs[index]['message']);
},
);
});
快乐编码:P
我的 Firestore 数据库中有一组聊天记录。集合中有一堆文档。每个文档都是一条消息。 我现在正在尝试访问集合中的每条消息和某些特定字段,但我 运行 遇到了问题。
这里是我聊天的地方:
_getChats(String individualId) async {
print("in get chats");
Query q = FirebaseFirestore.instance
.collection("users")
.doc(uid)
.collection('messages')
.doc(individualId)
.collection('chats')
.orderBy("dateTime", descending: true)
.limit(10);
setState(() {
_loadingChats = true;
});
QuerySnapshot querySnapshot = await q.get();
_chats = querySnapshot.docs;
setState(() {
_loadingChats = false;
});
}
在上面的代码中,我将文档分配给一个列表。在这里,我将列表定义为:
List<DocumentSnapshot> _chats = [];
最后,我使用列表视图加载聊天,如下所示:
Widget _showChats2() {
return ListView.builder(itemBuilder: (BuildContext context, int index) {
//Chat chat = _chats[index];
bool isMe = _chats[index].data["senderId"] == uid;
return Align(
alignment: isMe ? Alignment.centerRight
: Alignment.centerLeft,
child: Column(
children: [
Align(
alignment: isMe ? Alignment.centerRight
: Alignment.centerLeft,
child: Card(
color: isMe
? Colors.purpleAccent
: Colors.white,
elevation: 2,
child: Padding(
padding: const EdgeInsets.all(12),
child: Text(
_chats[index].data["message"],
style: TextStyle(
color: isMe
? Colors.white
: Colors.black
),
),
),
),
),
Align(
alignment: isMe
? Alignment.topRight
: Alignment.topLeft,
child: Padding(
padding: isMe ? const EdgeInsets.only(
right: 12)
: const EdgeInsets.only(left: 12),
child: MidText(text: DateFormat('kk:mm').format(
_chats[index].data["dateTime"])),
)
)
],
),
);
});
}
当我尝试使用方括号[] 访问文档的字段时出现上述错误。我想知道在这种情况下从文档字段访问数据的正确方法
而不是_chats[index].data["message"]
尝试 _chats[index]['message']
这里有一些建议
- 使用 streambuilder 而不是下载列表中的聊天记录
- 为消息创建无状态小部件
- 还要避免创建长链的集合和文档,它会让你陷入一些界限。
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance
.collection("users")
.doc(uid)
.collection('messages')
.doc(individualId)
.collection('chats')
.orderBy("dateTime", descending: true)
.limit(10)
.snapshots(),
builder: (_, snapshot) {
return ListView.builder(
itemCount: snapshot.data!.docs.length,
itemBuilder: (BuildContext context, int index) {
return Text(snapshot.data!.docs[index]['message']);
},
);
});
快乐编码:P