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

Flutter中如何查找Firestore匹配uid字段的文档并删除该文档

问题原因

  • Firestore文档删除逻辑错误:当前删除语句未生效的核心原因是,执行where条件查询后没有获取匹配的文档结果,users.where(...).firestore实际上返回的是全局Firestore实例,之前的查询条件完全没有生效。同时users.doc()不传参数时会生成一个随机的全新文档ID,你执行删除操作的是一个不存在的文档,所以Firebase不会抛出错误,自然也删不到需要的目标用户文档。
  • 操作顺序存在隐患:如果你的Firestore安全规则限制了仅登录用户可操作自身数据,若先删除Auth账号再操作Firestore文档,会因为身份鉴权失败导致文档删除失败,需要保证Firestore文档删除完成后再执行Auth账号的删除操作。
  • 补充优化建议:存储用户数据时,建议直接将用户的Auth uid作为Firestore文档的ID,后续操作无需执行查询,可直接通过uid定位文档,效率更高也不容易出错。

修正后的代码

CollectionReference users = FirebaseFirestore.instance.collection('users');

TextButton(
  onPressed: () async { 
    try {
      // 第一步:查询匹配uid的用户文档
      final querySnapshot = await users.where('uid', isEqualTo: _auth.currentUser!.uid).get();
      // 遍历删除所有匹配的文档(正常情况下只会有一个)
      for (var doc in querySnapshot.docs) {
        await doc.reference.delete();
      }
      // 第二步:删除Auth账号
      await _auth.currentUser!.delete();
      // 第三步:跳转页面
      if (!context.mounted) return;
      Navigator.pushReplacement(
        context, 
        MaterialPageRoute(builder: (context) => const WelcomeScreen())
      );
    } on FirebaseAuthException catch (error) {
      Fluttertoast.showToast(
        msg: error.message.toString(),
        gravity: ToastGravity.TOP,
        backgroundColor: Colors.red,
        textColor: Colors.white
      );
    } on FirebaseException catch (error) { 
      Fluttertoast.showToast(
        msg: error.message.toString(),
        gravity: ToastGravity.TOP,
        backgroundColor: Colors.red,
        textColor: Colors.white
      );
    }
  },
  child: const Text( 'Delete', style: TextStyle(color: Colors.red)),
)

以uid为文档ID的简化写法

如果当初存储用户数据时使用users.doc(uid).set(用户数据)的逻辑,删除步骤可以直接简化为:

// 无需查询,直接定位删除对应uid的文档
await users.doc(_auth.currentUser!.uid).delete();

内容的提问来源于stack exchange,提问作者Botshelo Ramela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:54:07