无法显示Firebase当前用户用户名,请求指导使用当前用户UID的方法
问题描述
我在开发中尝试显示Firebase当前用户的用户名以用于更新个人资料,但无法正常显示。目前仅能正常显示用户邮箱,displayName始终显示No Name,请求指导如何使用当前用户的UID来解决用户名无法显示的问题。
我的代码:
Padding( padding: const EdgeInsets.all(16.0), child: Text(FirebaseAuth.instance.currentUser!.email!), ), Padding( padding: const EdgeInsets.all(16.0), child: Text( FirebaseAuth.instance.currentUser!.displayName ?? 'No Name' // 无法显示Firebase中的当前用户名 ), ),
解决方案
为什么displayName为空?
Firebase Auth的displayName字段默认是空值,只有当你在用户注册时主动设置,或者后续调用updateProfile方法更新过该字段,它才会有值。如果从未设置过,自然会显示你指定的No Name兜底文本。
方案1:更新Firebase Auth中的displayName
如果你的用户名数据本来就应该存在Firebase Auth里,先确保已经设置了该字段。比如在用户注册完成后,或者用户修改资料时执行以下代码:
final user = FirebaseAuth.instance.currentUser; if (user != null) { await user.updateProfile(displayName: "新的用户名"); // 更新后需要重新获取用户信息,或者调用reload() await user.reload(); final updatedUser = FirebaseAuth.instance.currentUser; // 此时updatedUser?.displayName就会是新设置的值 }
方案2:用UID从数据库(如Firestore)获取用户名
大部分场景下,用户的详细资料(比如用户名、头像、个人简介等)会存在Firestore或Realtime Database中,而非仅存在Firebase Auth里。此时可以用用户UID作为查询条件,从数据库拉取用户名:
步骤1:确保数据库中已存储用户资料
假设你用Firestore,用户数据的结构可能是这样的(文档ID为用户UID):
users (集合) - UID12345 (文档) - username: "张三" - email: "zhangsan@example.com" - ...其他字段
步骤2:通过UID查询用户名
在Flutter中,你可以用FutureBuilder来异步获取并显示数据:
Padding( padding: const EdgeInsets.all(16.0), child: FutureBuilder<DocumentSnapshot>( future: FirebaseFirestore.instance .collection('users') .doc(FirebaseAuth.instance.currentUser!.uid) .get(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Text("加载中..."); } if (snapshot.hasError) { return Text("加载失败"); } final userData = snapshot.data?.data() as Map<String, dynamic>?; final username = userData?['username'] ?? 'No Name'; return Text(username); }, ), ),
注意事项
- 确保用户已成功登录,建议给
FirebaseAuth.instance.currentUser添加空安全判断,避免因用户未登录导致崩溃。 - 如果用数据库方案,要设置好Firestore的安全规则,确保只有登录用户能访问自己的资料。
内容的提问来源于stack exchange,提问作者user19908504
相关产品推荐
相关产品推荐

