Flutter开发中如何避免Cloud Firestore重复写入同谷歌账号用户数据
解决Firestore重复创建用户文档的方案
出现该问题的核心原因是当前每次登录成功后,你都使用了自动生成随机文档ID的方式新增数据,没有绑定用户唯一标识做去重判断,优化方案如下:
核心思路
谷歌账号登录后返回的UID是和账号绑定的永久唯一标识,直接用这个UID作为Firestore用户集合的文档ID,替代默认的自动随机生成ID逻辑,即可从根源避免重复创建文档。
具体实现步骤
- 谷歌登录认证成功后,先从认证响应结果中提取当前用户的固定UID
- 写入用户数据时不要使用
collection.add()方法,改用collection.doc(用户UID).set()方法指定文档ID写入 - 如果需要保留用户文档中已有的其他自定义字段,避免新登录信息覆盖旧数据,可以给
set()方法增加合并参数,以下是Web端JS示例,其他端语法逻辑一致:
// 取到认证返回的用户UID const uid = auth.currentUser.uid; const userDocRef = db.collection("users").doc(uid); await userDocRef.set({ email: 用户邮箱, name: 用户姓名, uid: uid }, { merge: true });
可选扩展逻辑
如果需要区分新老用户做不同的业务处理(比如新用户首次登录弹出引导页,老用户直接跳转首页),可以在写入前先做文档存在性校验:
该逻辑不会影响最终写入效果,仅用于区分首次登录和重复登录的业务分支
const uid = auth.currentUser.uid; const userDocRef = db.collection("users").doc(uid); const docSnap = await userDocRef.get(); if (docSnap.exists()) { // 老用户逻辑,无需重复写入用户基础信息 } else { // 新用户逻辑,写入用户基础信息 await userDocRef.set({ email: 用户邮箱, name: 用户姓名, uid: uid }); }
内容的提问来源于stack exchange,提问作者Sushant Dhiman
相关产品推荐
相关产品推荐

