Flutter中按条件更新Firestore字段遇currentUser错误的解决方法
问题描述
我已在Flutter中通过Stream Builder成功读取Firestore的数据,代码如下:
stream: FirebaseFirestore.instance.collection('users').where('1_email', isEqualTo:currentUser.currentUser!.email).snapshots(),
但不清楚如何按相同条件更新数据。我已实现指定文档ID更新字段的功能,代码如下:
Future updateUserDetails(String name, String phone, int age) async{ await FirebaseFirestore.instance.collection('users').doc('BwmlWJR7k9PwQQkTu5jJ').update({ '2_name' : name, '3_phone' : phone, '4_age' : age, }); }
尝试参照读取数据的方式通过where条件更新时失败,代码如下:
Future updateUserDetails(String name, String phone, int age) async{ await FirebaseFirestore.instance.collection('users').where('1_email', isEqualTo:currentUser.currentUser!.email).update({ '2_name' : name, '3_phone' : phone, '4_age' : age, }); }
报错信息:
Try correcting the name to the name of an existing getter, or defining a getter or field named 'currentUser'. await FirebaseFirestore.instance.collection('users').where('1_email', isEqualTo:currentUser.currentUser!.email).update({
解决方案
1. 修复currentUser调用错误
报错核心是找不到currentUser getter,先修正当前用户邮箱的获取逻辑:
- 若使用标准Firebase Auth,当前用户应通过
FirebaseAuth.instance.currentUser获取,而非currentUser.currentUser - 若你自定义了Auth实例,检查其属性命名,比如是否是
currentUser.user而非currentUser.currentUser
修正后的条件示例:
// 标准Firebase Auth获取当前用户邮箱 isEqualTo: FirebaseAuth.instance.currentUser!.email
2. 按条件更新的正确实现
Firestore的Query对象没有直接的update方法,需先获取查询结果,再逐个更新文档:
Future updateUserDetails(String name, String phone, int age) async { // 执行查询获取符合条件的文档快照 QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection('users') .where('1_email', isEqualTo: FirebaseAuth.instance.currentUser!.email) .get(); // 遍历文档逐个更新 for (var doc in querySnapshot.docs) { await doc.reference.update({ '2_name': name, '3_phone': phone, '4_age': age, }); } }
优化说明
如果你的邮箱字段是唯一的(查询结果仅一个文档),可以直接取第一个文档更新,无需遍历:
Future updateUserDetails(String name, String phone, int age) async { final user = FirebaseAuth.instance.currentUser; if (user == null) return; // 空安全检查,避免未登录时崩溃 QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection('users') .where('1_email', isEqualTo: user.email) .get(); if (querySnapshot.docs.isNotEmpty) { await querySnapshot.docs.first.reference.update({ '2_name': name, '3_phone': phone, '4_age': age, }); } }
内容的提问来源于stack exchange,提问作者YUNN
相关产品推荐
相关产品推荐

