如何操作FireStore读取用户集合字段,更新room集合对应文档的roomCount值
修正后的实现方案
现有代码的核心问题
FirebaseFirestore.instance.doc().get()是异步方法,未添加await关键字,无法获取到实际的文档返回值,只会拿到Future实例- 高版本cloud_firestore依赖中,
DocumentSnapshot的文档数据是通过data()方法获取,不是data属性,原有写法会报语法错误 - 未判断用户文档是否存在、字段是否为空,直接读取数据会触发空安全报错
- 修改room文档字段使用
set()方法会覆盖整个文档,仅修改单个字段应该用update()方法 - 直接计算
roomCount-1会有并发计数错误风险,推荐用Firebase提供的原子增减操作FieldValue.increment() - 原有代码存在多处语法错误:缺少分号、多余的链式调用点、属性调用遗漏括号等
完整可运行代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; void _onConferenceTerminated(message) async { // 读取当前用户文档,异步操作加await final userDoc = await FirebaseFirestore.instance.collection('user').doc(uid()).get(); // 文档不存在直接终止逻辑 if (!userDoc.exists) return; // 读取documentID字段,做判空处理 final String? getDocId = userDoc.data()?['documentID']; if (getDocId == null || getDocId.isEmpty) return; // 原子操作修改room集合对应文档的roomCount字段,直接减1,无需提前读取当前值 await FirebaseFirestore.instance .collection('room') .doc(getDocId) .update({'roomCount': FieldValue.increment(-1)}); } // 获取用户ID String uid() { final User? user = FirebaseAuth.instance.currentUser; // 用户未登录返回空字符串避免空指针 if (user == null) return ''; return user.uid; }
关键修改说明
- 所有异步操作都添加了
await关键字,确保拿到异步返回的实际结果后再执行后续逻辑 - 增加了多层空判断,避免文档不存在、字段为空、用户未登录等边界场景下的崩溃
- 用
update()方法代替set(),仅修改指定字段不会覆盖文档其他数据 - 使用
FieldValue.increment(-1)实现原子减1操作,无论多少用户同时修改,计数都不会出现误差,也无需提前读取当前的roomCount值
内容的提问来源于stack exchange,提问作者damnexpress
相关产品推荐
相关产品推荐

