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
相关产品推荐
相关产品推荐

