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

createUserWithEmailAndPassword后updateDisplayName()不生效

问题根因

这是Firebase Auth的实例缓存特性导致的,和空值无关:

  • createUserWithEmailAndPassword返回的User是返回时刻的静态快照,不会自动同步后续的属性修改
  • updateDisplayName仅会把修改提交到Firebase服务端,不会更新你本地代码里已经持有的旧user变量的属性值
  • 即使调用reload()方法,原有user变量指向的实例也不会自动刷新属性,必须重新从认证实例拉取当前用户,才能拿到更新后的displayName
  • 你当前代码直接用更新前的旧user实例做转换、入库,读到的displayName本来就是null,写入Firestore自然为空。
修复代码

更新displayName后重新拉取最新的用户实例,再执行后续逻辑即可:

Future regEmailPass(String email, String password, String? username) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(
          email: email, password: password);
      User? user = result.user;
      // 提交displayName更新
      await user?.updateDisplayName(username);
      // 刷新认证状态,拉取最新用户实例
      await _auth.currentUser?.reload();
      final User? latestUser = _auth.currentUser;

      // 用最新实例做业务转换
      UserInApp? userInApp = _userFromFireBaseUser(latestUser);
      await DatabaseService(user: userInApp).firstTimeCreateDB(username!);
      return userInApp;
    } catch (e) {
      print(e.toString());
      return null;
    }
  }
补充说明
  • 如果username存在传入null的可能,不要在入库时直接使用username!非空断言,提前做参数校验避免运行时报错
  • 只要你传入_userFromFireBaseUser的是重新拉取的latestUser实例,就能正常读取到更新后的displayName值,写入Firestore不会再出现null的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:42:19