Flutter应用确认配送地址时报cloud_firestore/not-found文档不存在错误
错误触发原因
报错核心信息为No document to update,触发原因如下:
- Firestore 提供的
update()方法仅支持更新已存在的文档,如果指定ID的文档尚未在Firestore中创建,调用update()会直接抛出文档不存在的异常 - 你的代码逻辑中,用户登录后直接调用了更新用户信息的接口,未提前判断对应用户ID的
users集合文档是否已经创建,当新用户第一次登录还未生成初始化用户文档时,就会触发该报错
解决方法
最优方案:修改更新方法兼容文档不存在场景
将UserServices类中的updateUserData方法调整为使用set()搭配merge: true参数,该逻辑会自动判断:文档不存在则新建,文档存在则合并更新指定字段,不会抛出不存在异常,无需额外判断逻辑:
Future<void> updateUserData (Map<String, dynamic>values)async{ String id = values['id']; // 替换原update方法为set + merge配置 await _firestore.collection(collection).doc(id).set(values, SetOptions(merge: true)); }
可选方案:显式判断文档存在状态后执行对应操作
如果你需要严格区分创建和更新逻辑,可以先查询文档状态再执行对应操作:
Future<void> updateUserData (Map<String, dynamic>values)async{ String id = values['id']; DocumentSnapshot userDoc = await _firestore.collection(collection).doc(id).get(); if(userDoc.exists){ // 文档存在直接更新 await userDoc.reference.update(values); }else{ // 文档不存在先调用创建方法初始化 await createUserData(values); } }
额外优化建议
- 调用更新用户信息的位置增加异常捕获,避免未处理异常直接导致应用闪退:
try{ _auth.updateUser( id: user?.uid, number: user?.phoneNumber, ); }catch(e){ // 可根据业务需求增加用户提示,例如Toast弹窗 print('用户地址更新失败:$e'); }
- 补充新用户首次登录/注册的初始化逻辑,新用户完成登录后主动调用
createUserData方法生成初始用户文档,避免后续业务流程出现异常
内容的提问来源于stack exchange,提问作者vansika
相关产品推荐
相关产品推荐

