You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:00:05