持有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
相关产品推荐
相关产品推荐

