Flutter中仅首次向Firestore保存用户数据的实现问题
问题分析与解决方案
你之前的代码逻辑错误在于:直接判断文档引用是否为null是无效的——调用doc(uid)方法时,无论Firestore中是否存在对应UID的文档,都会返回一个DocumentReference对象,永远不会是null,因此你的if条件永远不成立,导致数据无法写入。
以下是两种可行的实现方式:
方法1:先查询文档是否存在,再写入
通过get()获取文档快照,用exists属性判断文档是否存在,仅当不存在时执行写入:
final currentUser = FirebaseAuth.instance.currentUser!; final userDocRef = FirebaseFirestore.instance.collection('users').doc(currentUser.uid); final docSnapshot = await userDocRef.get(); if (!docSnapshot.exists) { await userDocRef.set({ '1_email': currentUser.email, '2_name': 'Null', '3_phone': '01012345678', '4_age': 20, }); }
方法2:使用事务保证原子性(适合并发场景)
如果存在多个操作同时触发用户数据写入的可能,用事务可以避免重复创建或覆盖数据,确保操作的原子性:
final currentUser = FirebaseAuth.instance.currentUser!; await FirebaseFirestore.instance.runTransaction((transaction) async { final userDocRef = FirebaseFirestore.instance.collection('users').doc(currentUser.uid); final docSnapshot = await transaction.get(userDocRef); if (!docSnapshot.exists) { transaction.set(userDocRef, { '1_email': currentUser.email, '2_name': 'Null', '3_phone': '01012345678', '4_age': 20, }); } });
内容的提问来源于stack exchange,提问作者YUNN
相关产品推荐
相关产品推荐

