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

持有Firebase某文档对应数据时,如何获取该文档的documentID?

Firebase 文档数据获取 DocumentID 方案

场景1:持有数据为 DocumentSnapshot 类型

如果你获取到的data是云Firestore SDK返回的原始DocumentSnapshot对象,直接读取对象自带的id属性即可,你代码中的写法已经是正确可用的:

return GestureDetector(
  onTap: () {
    Navigator.push(context, MaterialPageRoute(
      builder: (context) {
        return ProductScreen(
          // 直接读取DocumentSnapshot的id属性即可
          productID: data.id,
        );
      },
    ));
  },
);

获取DocumentSnapshot的参考代码如下:

// 单文档查询示例
var documentSnapshot = await FirebaseFirestore.instance.collection('products').doc('目标文档ID').get();
// 列表查询示例
QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection('products').get();
List<DocumentSnapshot> docList = querySnapshot.docs;

场景2:持有数据为 .data() 转换后的Map/自定义实体类

如果你已经调用DocumentSnapshot.data()方法把文档内容转成了Map对象,或者序列化后转成了自定义的业务实体类,此时的对象本身不会携带文档ID,需要你在数据转换阶段主动把ID存入对象:

Map 类型处理示例

// 数据查询转换阶段主动写入ID
var snapshot = await FirebaseFirestore.instance.collection('products').doc('xxx').get();
Map<String, dynamic> productData = snapshot.data() as Map<String, dynamic>;
// 新增自定义字段存储文档ID
productData['doc_id'] = snapshot.id;

// 后续使用时直接读取对应字段即可
productID: productData['doc_id'],

自定义实体类处理示例

先给实体类新增ID存储字段:

class Product {
  // 新增字段存储文档ID
  final String docId;
  final String productName;
  final int price;

  Product({
    required this.docId,
    required this.productName,
    required this.price,
  });
}

转换数据时主动赋值:

var snapshot = await FirebaseFirestore.instance.collection('products').doc('xxx').get();
Map<String, dynamic> rawData = snapshot.data() as Map<String, dynamic>;
Product product = Product(
  // 传入文档ID
  docId: snapshot.id,
  productName: rawData['product_name'],
  price: rawData['price'],
);

// 后续使用直接读取属性
productID: product.docId,

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 23:30:04