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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:25:17