Flutter创建Firestore对象时能否存储文档引用并添加id变量?
当然可以实现这个需求
你完全可以给Customer类添加私有变量来存储Firestore文档ID,这样就能快速获取对应的DocumentReference,满足关联其他集合查询的需求。下面是修改后的完整代码和关键说明:
修改后的Customer类
class Customer { const Customer({ required this.isAdmin, String? id, }) : _id = id; final bool? isAdmin; final String? _id; // 私有变量存储Firestore文档ID // 提供getter获取对应的DocumentReference DocumentReference<Customer>? get documentReference { if (_id == null) return null; return FirebaseFirestore.instance .collection('customer') .doc(_id) .withConverter<Customer>( fromFirestore: (s, _) => Customer.fromJson(s.data()!, id: s.id), toFirestore: (o, _) => o.toJson(), ); } Customer.fromJson(Map<String, Object?> json, {String? id}) : this( isAdmin: json['is_admin'] as bool?, id: id, ); Map<String, Object?> toJson() => { 'is_admin': isAdmin, }; }
修改后的查询方法
Query<Customer> customerQuery(bool criteria) { final dataRef = FirebaseFirestore.instance.collection('customer').withConverter<Customer>( fromFirestore: (snapshot, _) => Customer.fromJson(snapshot.data()!, id: snapshot.id), toFirestore: (customer, _) => customer.toJson(), ); return dataRef.where('is_admin', isEqualTo: criteria); }
关键说明
- 私有变量
_id仅用于存储文档ID,对外不暴露直接修改的入口,保证数据一致性 - 通过
documentReference这个getter方法,可以直接拿到当前Customer对应的Firestore文档引用,后续关联查询时直接用这个引用即可,比如查询该客户的所有订单:// 假设存在orders集合关联customer Future<void> getCustomerOrders(Customer customer) async { final ordersRef = customer.documentReference?.collection('orders'); if (ordersRef != null) { final ordersSnapshot = await ordersRef.get(); // 处理订单数据 } } - 注意:Firestore的文档ID并不包含在文档的JSON数据里,所以必须在
fromFirestore回调中把snapshot.id传递给Customer.fromJson,才能正确初始化_id变量 toJson方法不需要包含_id,因为文档ID是Firestore路径的一部分,不需要存储在文档内容里
内容的提问来源于stack exchange,提问作者cmjordan
相关产品推荐
相关产品推荐

