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

Flutter项目中如何获取Firebase Auth中非当前登录用户的显示名称

实现方案

Firebase Auth客户端SDK出于安全限制,默认不支持直接查询非当前登录用户的身份信息,你可以通过以下两种方式实现需求:

方案一:使用Firestore存储公开用户资料(推荐)

这种方案性能更好,适合帖子/消息列表这类需要批量查询用户信息的场景:

  1. 注册时同步公开数据:用户注册成功后,除了将显示名写入Auth用户资料,同时同步一份到Firestore的公开用户集合,仅存储需要公开的非敏感信息:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

// 注册逻辑执行完成后调用
final currentUser = FirebaseAuth.instance.currentUser;
if (currentUser != null) {
  await FirebaseFirestore.instance
      .collection('public_users')
      .doc(currentUser.uid)
      .set({
        'displayName': currentUser.displayName,
        // 可追加其他需要公开的字段,如头像链接、注册时间等
      });
}
  1. 配置安全规则:确保用户只能修改自己的公开信息,所有人都可以读取公开信息:

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

  1. 查询指定用户显示名:拿到帖子/消息发布者的uid后,直接查询对应文档即可:
Future<String?> getPublisherDisplayName(String publisherUid) async {
  final userDoc = await FirebaseFirestore.instance
      .collection('public_users')
      .doc(publisherUid)
      .get();
  if (userDoc.exists) {
    return userDoc.data()?['displayName'] as String?;
  }
  return null;
}

方案二:通过云函数调用Admin SDK查询

如果你不想额外维护数据库存储用户公开信息,可以用云函数封装Admin SDK的查询能力,客户端调用云函数获取结果:

  1. 编写可调用云函数:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.getUserDisplayName = functions.https.onCall(async (data, context) => {
  const targetUid = data.uid;
  try {
    const userRecord = await admin.auth().getUser(targetUid);
    return {
      displayName: userRecord.displayName
    };
  } catch (e) {
    throw new functions.https.HttpsError("not-found", "查询的用户不存在");
  }
});
  1. 客户端调用云函数获取结果:
import 'package:cloud_functions/cloud_functions.dart';

Future<String?> getPublisherDisplayName(String publisherUid) async {
  try {
    final result = await FirebaseFunctions.instance
        .httpsCallable('getUserDisplayName')
        .call({'uid': publisherUid});
    return result.data['displayName'] as String?;
  } catch (e) {
    return null;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:39:03