如何从集合中的文档访问字段

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']

这里有一些建议

  1. 使用 streambuilder 而不是下载列表中的聊天记录
  2. 为消息创建无状态小部件
  3. 还要避免创建长链的集合和文档,它会让你陷入一些界限。

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