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

Flutter:如何获取单个Firestore文档中的字段总数量

解决方法

DocumentSnapshot本身未提供直接获取字段数量的API,你需要先将文档内容转换为Dart Map类型,再通过Map的length属性获取字段总数。

代码修正点

  • 修正变量笔误:你定义的流变量名为_Shop,StreamBuilder中传入的_ShopStream需要统一变量名
  • 修正长度获取逻辑:调用DocumentSnapshot的data()方法拿到文档内容,强转为Map后取length值
  • 修正列表遍历逻辑:将Map的键值对转为列表后,再按索引对应渲染内容,无法直接用数字索引访问DocumentSnapshot

修正后完整代码

final Stream<DocumentSnapshot<Map<String, dynamic>>> _shopStream =
    FirebaseFirestore.instance
        .collection('shop')
        .doc('banana')
        .snapshots();

StreamBuilder<DocumentSnapshot>(
  stream: _shopStream,
  builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const Center(
        child: CircularProgressIndicator(),
      );
    }
    if (!snapshot.data!.exists) {
      return Center(
        child: Text(
          'Not Available !'.tr,
          style: const TextStyle(
              fontSize: 20,
              fontWeight: FontWeight.bold,
              color: Colors.black),
        ),
      );
    }
    // 转Map获取字段总数
    final Map<String, dynamic> docData = snapshot.data!.data() as Map<String, dynamic>;
    // 把所有键值对转成列表方便遍历
    final docEntries = docData.entries.toList();
    return ListView.builder(
      itemCount: docEntries.length,
      itemBuilder: (context, int index) {
        final entry = docEntries[index];
        return ListTile(
          // 示例是取当前字段对应的值里的name属性,可根据业务调整
          title: Text(entry.value['name'].toString()),
        );
      },
    );
  }
)

补充说明

上述方法获取的是文档顶层字段的总数量,如果你需要统计嵌套字段的总数量,需要递归遍历Map自行统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:48:02