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

Flutter应用调用updateDisplayName设置用户显示名不生效如何解决

问题原因

你遇到的displayName为空的问题由以下2个核心原因导致:

  • updateDisplayName() 本身是异步Future方法,你当前代码没有加await等待执行完成,方法还没跑完后续逻辑就已经执行完毕,Firebase Auth本地缓存的用户信息没有得到更新
  • 显示名更新完成后没有主动调用用户实例的reload()方法刷新本地缓存,即使服务端更新完成,本地读取的还是旧的空值
  • 代码混用await和.then的异步写法,很容易产生时序逻辑漏洞

修复方案

将donorSignUp方法按如下逻辑调整,统一用await处理所有异步操作,等待更新和缓存刷新完成后再执行后续逻辑:

void donorSignUp() async {
    try {
      showLoading();
      // 改用await同步写法,避免.then的异步时序问题
      final result = await auth
          .createUserWithEmailAndPassword(
              email: email.text.trim(), 
              password: password.text.trim()
          );
      final currentUser = result.user!;
      // 等待显示名更新完成
      await currentUser.updateDisplayName(donorModel.value.name);
      // 主动刷新本地用户缓存,确保后续读取的是最新值
      await currentUser.reload();
      
      // 所有异步操作完成后再执行后续业务逻辑
      String _userId = currentUser.uid;
      _addDonorToFirestore(_userId);
      _clearSignUpControllers();
    } catch (e) {
      debugPrint(e.toString());
      Get.snackbar('Sign Up Failed', 'Try again');
    } finally {
      // 补充关闭加载逻辑,避免异常场景下一直显示加载态
      hideLoading();
    }
  }

补充说明

如果后续其他页面读取displayName还是为空,主动执行一次用户刷新即可拿到最新值:

await auth.currentUser?.reload();
final latestDisplayName = auth.currentUser?.displayName;

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

相关产品推荐
方舟 Agent Plan

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

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