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

如何在Flutter应用中从Firebase获取用户数据并展示到个人资料页

从Firebase获取用户数据并展示到Flutter个人资料页

步骤1:添加Firestore依赖

先确保你的pubspec.yaml包含Firebase核心和Firestore依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_auth: ^latest_version
  firebase_core: ^latest_version
  cloud_firestore: ^latest_version

运行flutter pub get完成依赖安装。

步骤2:修改ProfilePage代码

以下是整合数据获取、状态管理和展示逻辑的完整代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:line_awesome_flutter/line_awesome_flutter.dart';
import '../Reminder/ui/theme.dart';

class ProfilePage extends StatefulWidget {
  const ProfilePage({super.key});

  @override
  State<ProfilePage> createState() => _ProfilePageState();
}

class _ProfilePageState extends State<ProfilePage> {
  final user = FirebaseAuth.instance.currentUser!;
  Map<String, dynamic>? _userData;
  bool _isLoading = true;
  String? _errorMessage;

  @override
  void initState() {
    super.initState();
    _fetchUserData();
  }

  // 从Firestore拉取用户数据
  Future<void> _fetchUserData() async {
    try {
      // 假设用户数据存在"users"集合中,文档ID对应当前用户UID
      DocumentSnapshot userDoc = await FirebaseFirestore.instance
          .collection('users')
          .doc(user.uid)
          .get();

      if (userDoc.exists) {
        setState(() {
          _userData = userDoc.data() as Map<String, dynamic>;
          _isLoading = false;
        });
      } else {
        setState(() {
          _errorMessage = "用户数据不存在";
          _isLoading = false;
        });
      }
    } catch (e) {
      setState(() {
        _errorMessage = "获取数据失败: ${e.toString()}";
        _isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text(
          'Profile',
          style: headingStyle,
        ),
        backgroundColor: Get.isDarkMode ? Colors.grey[700] : Colors.white,
      ),
      body: SingleChildScrollView(
        child: Container(
          padding: const EdgeInsets.all(10),
          child: Column(
            children: [
              SizedBox(
                width: 120,
                height: 120,
                child: Image(image: AssetImage("images/profile.png")),
              ),
              const SizedBox(height: 50),
              // 处理加载、错误、数据展示三种状态
              _isLoading
                  ? CircularProgressIndicator()
                  : _errorMessage != null
                      ? Text(_errorMessage!, style: TextStyle(color: Colors.red))
                      : Form(
                          child: Column(
                            children: [
                              TextFormField(
                                readOnly: true,
                                initialValue: _userData?['email'] ?? user.email,
                                decoration: InputDecoration(
                                    prefixIconColor: Get.isDarkMode?Colors.black:Colors.white,
                                    focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(100), borderSide: BorderSide(color: Get.isDarkMode?Colors.white:Colors.black,)),
                                    labelText: "Email",
                                    prefixIcon: Icon(LineAwesomeIcons.envelope_1, color:  Get.isDarkMode?Colors.white:Colors.black),
                                    border: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(100))),
                              ),
                              SizedBox(height: 10),
                              TextFormField(
                                readOnly: true,
                                initialValue: _userData?['fullName'] ?? "未设置",
                                decoration: InputDecoration(
                                    prefixIconColor: Get.isDarkMode?Colors.black:Colors.white,
                                    focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(100), borderSide: BorderSide(color: Get.isDarkMode?Colors.white:Colors.black,)),
                                    labelText: "Full Name",
                                    prefixIcon: Icon(LineAwesomeIcons.user, color:  Get.isDarkMode?Colors.white:Colors.black),
                                    border: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(100))),
                              ),
                              SizedBox(height: 10),
                              TextFormField(
                                readOnly: true,
                                initialValue: _userData?['dateOfBirth'] ?? "未设置",
                                decoration: InputDecoration(
                                    prefixIconColor: Get.isDarkMode?Colors.black:Colors.white,
                                    focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(100), borderSide: BorderSide(color: Get.isDarkMode?Colors.white:Colors.black,)),
                                    labelText: "Date of Birth",
                                    prefixIcon: Icon(LineAwesomeIcons.baby_carriage, color:  Get.isDarkMode?Colors.white:Colors.black),
                                    border: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(100))),
                              ),
                              SizedBox(height: 10),
                              TextFormField(
                                readOnly: true,
                                initialValue: _userData?['bloodType'] ?? "未设置",
                                decoration: InputDecoration(
                                    prefixIconColor: Get.isDarkMode?Colors.black:Colors.white,
                                    focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(100), borderSide: BorderSide(color: Get.isDarkMode?Colors.white:Colors.black,)),
                                    labelText: "Blood Type",
                                    prefixIcon: Icon(Icons.bloodtype, color:  Get.isDarkMode?Colors.white:Colors.black),
                                    border: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(100))),
                              ),
                              SizedBox(height: 15,),
                              SizedBox(
                                width: 100,
                                child: MaterialButton(
                                  onPressed: () {
                                    FirebaseAuth.instance.signOut();
                                  },
                                  color: Colors.redAccent,
                                  child: Text('SIGN OUT'),
                                ),
                              ),
                            ],
                          ),
                        ),
            ],
          ),
        ),
      ),
    );
  }
}

关键注意事项

  • 集合与字段匹配:如果你的Firestore用户数据集合不是users,或者字段名(如fullName、dateOfBirth)和代码不一致,需要同步修改对应代码段。
  • Firestore权限:在Firebase控制台设置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,提问作者NyK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:20:50