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

如何在Flutter的Profile页面展示Firebase中的用户注册数据

Flutter Profile页面获取并展示Firebase用户数据

1. 确认Firebase依赖配置

先确保pubspec.yaml中包含必要的Firebase依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^2.15.0
  cloud_firestore: ^4.8.3
  firebase_auth: ^4.10.0

执行命令安装依赖:

flutter pub get

2. 获取当前登录用户UID

先验证用户是否已登录,获取其唯一标识UID:

final currentUser = FirebaseAuth.instance.currentUser;
if (currentUser == null) {
  // 用户未登录时跳转至登录页
  Navigator.pushReplacementNamed(context, '/login');
  return;
}
final userId = currentUser.uid;

3. 从Firestore读取用户数据

假设Firebase Firestore中存在users集合,每个用户数据以UID作为文档ID存储,包含name、age、email字段。通过以下方法异步获取数据:

Future<DocumentSnapshot<Map<String, dynamic>>> fetchUserData() async {
  return FirebaseFirestore.instance.collection('users').doc(userId).get();
}

4. 构建Profile页面展示数据

使用FutureBuilder处理异步数据加载,同时覆盖加载中、错误、无数据等场景:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('个人资料')),
    body: FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
      future: fetchUserData(),
      builder: (context, snapshot) {
        // 加载中状态
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        }
        // 加载错误状态
        if (snapshot.hasError) {
          return Center(child: Text('加载失败: ${snapshot.error}'));
        }
        // 无用户数据状态
        if (!snapshot.hasData || !snapshot.data!.exists) {
          return const Center(child: Text('未找到用户信息'));
        }
        // 解析并展示数据
        final userInfo = snapshot.data!.data()!;
        return Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              ListTile(
                leading: const Icon(Icons.person_outline),
                title: const Text('姓名'),
                subtitle: Text(userInfo['name'] ?? '未设置'),
              ),
              ListTile(
                leading: const Icon(Icons.cake_outlined),
                title: const Text('年龄'),
                subtitle: Text(userInfo['age']?.toString() ?? '未设置'),
              ),
              ListTile(
                leading: const Icon(Icons.email_outlined),
                title: const Text('邮箱'),
                subtitle: Text(userInfo['email'] ?? currentUser?.email ?? '未设置'),
              ),
            ],
          ),
        );
      },
    ),
  );
}

补充:注册时写入用户数据到Firestore

确保用户注册成功后,将信息同步写入Firestore,示例代码:

Future<void> registerUser(String email, String password, String name, int age) async {
  try {
    final authResult = await FirebaseAuth.instance.createUserWithEmailAndPassword(
      email: email,
      password: password,
    );
    // 将用户信息写入Firestore
    await FirebaseFirestore.instance.collection('users').doc(authResult.user!.uid).set({
      'name': name,
      'age': age,
      'email': email,
    });
  } on FirebaseAuthException catch (e) {
    // 处理注册错误(如邮箱已存在、密码强度不够等)
    debugPrint(e.message);
  }
}

可选:实时更新用户数据

如果需要实时同步用户数据(比如修改资料后自动刷新页面),可将FutureBuilder替换为StreamBuilder:

Stream<DocumentSnapshot<Map<String, dynamic>>> getUserDataStream() {
  return FirebaseFirestore.instance.collection('users').doc(userId).snapshots();
}

在页面中使用StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>,逻辑与FutureBuilder基本一致,无需单独处理加载中状态(可通过initialData优化初始显示)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:05:10