You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Firebase子集合中获取userName字段数据?

解决Firebase Firestore子集合字段获取问题

我有一个名为room的Firebase集合,该集合下存在一个名为users的文档,此文档内部包含一个同样名为users的子集合,子集合中的文档包含userName字段,我希望获取该字段的数据。

Firestore结构截图

Firestore结构截图1
Firestore结构截图2
Firestore结构截图3

尝试的代码

StreamBuilder(
  stream: FirebaseFirestore.instance.collection(widget.roomId).doc("users").collection("users").snapshots(),
  builder: (context, newSnapshot){
    final documents = newSnapshot.data?.docs;
    if (newSnapshot.connectionState == ConnectionState.waiting){
      return Text("WAITING"); 
    }
    return ListView.builder(
      itemCount: documents?.length,
      itemBuilder: (context, index) => Container(
        height: 25,
        child: Text(documents![index]["usersName"] ?? "nothing found"),
      ));
  },
),

问题修正与优化

你的代码核心问题是字段名拼写错误:你要获取的是userName,但代码里写成了usersName,修正字段名即可正常读取数据。此外,优化空值处理逻辑,避免强制解包带来的崩溃风险:

StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance
      .collection(widget.roomId)
      .doc("users")
      .collection("users")
      .snapshots(),
  builder: (context, newSnapshot) {
    // 加载中状态
    if (newSnapshot.connectionState == ConnectionState.waiting) {
      return const Text("WAITING"); 
    }
    // 无数据或错误状态
    if (!newSnapshot.hasData || newSnapshot.data!.docs.isEmpty) {
      return const Text("暂无数据");
    }
    final documents = newSnapshot.data!.docs;
    return ListView.builder(
      itemCount: documents.length,
      itemBuilder: (context, index) {
        final userDoc = documents[index];
        // 安全获取userName字段,设置默认值
        final userName = userDoc.get("userName", defaultValue: "未命名");
        return Container(
          height: 25,
          child: Text(userName),
        );
      },
    );
  },
),

内容的提问来源于stack exchange,提问作者Anupriya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:35:26