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

Flutter中如何从Firestore获取用户姓名实现登录欢迎消息?

获取Firebase用户姓名并显示欢迎消息

1. 利用Firebase Auth自带的displayName属性

Firebase Auth的User对象本身包含displayName字段,你可以直接调用user?.displayName获取。需要注意这个字段可能为空(比如用户用邮箱注册时未设置姓名),所以要做空值处理:

修改你代码中的Text组件:

Text(
  '${user?.displayName ?? user?.email?.split('@')[0] ?? '사용자'}님, \n환영합니다 :)',
  style: TextStyle(
    fontSize: titleLarge,
    fontFamily: 'semi-bold',
  ),
),
  • 如果displayName存在,直接显示姓名
  • 如果为空,取邮箱的前缀部分作为默认昵称
  • 连邮箱都取不到时,显示默认文本"사용자"

如果用户注册时没有设置displayName,你可以在注册流程中添加设置步骤,注册完成后调用以下代码更新:

// 注册完成后获取user对象
UserCredential userCredential = await FirebaseAuth.instance.createUserWithEmailAndPassword(
  email: email,
  password: password,
);
// 更新displayName
await userCredential.user?.updateDisplayName(userName);

2. 从Firebase数据库(Firestore/Realtime Database)读取自定义姓名

如果你的用户姓名是存储在Firebase数据库中(比如Firestore的users集合),需要通过用户uid查询对应的文档:

步骤1:添加Firestore依赖

确保pubspec.yaml中包含firebase_firestore包:

dependencies:
  firebase_core: ^2.15.0
  firebase_auth: ^4.10.0
  firebase_firestore: ^4.8.2

步骤2:编写获取姓名的异步方法

在你的Widget类中添加方法:

Future<String?> getUserRealName() async {
  if (user == null) return null;
  // 根据uid查询users集合中的文档
  DocumentSnapshot userDoc = await FirebaseFirestore.instance
      .collection('users')
      .doc(user!.uid)
      .get();
  // 返回文档中的name字段(根据你的数据库字段名调整)
  return userDoc.data()?['name'] as String?;
}

步骤3:用FutureBuilder异步显示姓名

修改loginMessage中的Text部分为FutureBuilder,处理异步加载和空值:

Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: [
    FutureBuilder<String?>(
      future: getUserRealName(),
      builder: (context, snapshot) {
        String? userName = snapshot.data ?? user?.email?.split('@')[0] ?? '사용자';
        // 加载中显示占位文本
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text('로딩중...');
        }
        return Text(
          '$userName님, \n환영합니다 :)',
          style: TextStyle(
            fontSize: titleLarge,
            fontFamily: 'semi-bold',
          ),
        );
      },
    ),
    // 右侧的로그아웃按钮保持不变
    TextButton(
      onPressed: () {
        _signOut().then(
          (value) => Get.to(() => HomeScreen()),
        );
      },
      child: Text('로그아웃'),
    ),
  ],
),

注意:数据库权限设置

确保Firestore规则允许已登录用户读取自己的文档:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:50:55