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

Flutter中如何从Firebase实时数据库获取当前用户对应数据?

Flutter获取Firebase Auth用户并读取实时数据库数据方案

1. 先确认基础配置

首先确保你的Flutter项目已经完成Firebase的基础集成:

  • 在pubspec.yaml中添加依赖:
    dependencies:
      flutter:
        sdk: flutter
      firebase_core: ^2.15.0
      firebase_auth: ^4.10.0
      firebase_database: ^10.2.0
    
    执行flutter pub get安装依赖。
  • 打开Firebase控制台,开启Firebase身份验证(比如邮箱/密码登录)和实时数据库,同时设置合理的数据库安全规则(避免公开读写):
    {
      "rules": {
        "users": {
          "$uid": {
            ".read": "$uid === auth.uid",
            ".write": "$uid === auth.uid"
          }
        }
      }
    }
    
    这个规则限制只有当前认证用户能读写自己的数据,符合安全规范。

2. 获取当前认证用户并读取数据

通过FirebaseAuth的状态监听获取当前用户,再根据用户UID读取实时数据库中对应的用户数据,以下是完整的页面示例:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';

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

  @override
  State<UserProfileScreen> createState() => _UserProfileScreenState();
}

class _UserProfileScreenState extends State<UserProfileScreen> {
  User? _currentUser;
  Map<String, dynamic>? _userInfo;
  final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();

  @override
  void initState() {
    super.initState();
    // 监听用户登录/登出状态变化
    FirebaseAuth.instance.authStateChanges().listen((user) {
      setState(() {
        _currentUser = user;
        if (_currentUser != null) {
          // 用户已登录,拉取对应数据
          _loadUserInfo();
        } else {
          // 用户未登录,清空数据
          _userInfo = null;
        }
      });
    });
  }

  // 从实时数据库读取用户数据
  void _loadUserInfo() {
    _dbRef.child('users/${_currentUser!.uid}').onValue.listen((event) {
      final snapshot = event.snapshot;
      if (snapshot.value != null) {
        setState(() {
          _userInfo = Map<String, dynamic>.from(snapshot.value as Map);
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('我的资料')),
      body: Center(
        child: _currentUser == null
            ? const Text('请先完成登录')
            : _userInfo == null
                ? const CircularProgressIndicator()
                : Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Text('用户ID: ${_currentUser!.uid}'),
                      const SizedBox(height: 16),
                      Text('姓名: ${_userInfo!['nama']}'),
                      Text('邮箱: ${_userInfo!['email']}'),
                      Text('电话: ${_userInfo!['telp']}'),
                    ],
                  ),
      ),
    );
  }
}

3. 核心要点说明

  • 数据库节点匹配:你的数据库结构是users节点下以用户UID为子节点,存储用户信息,所以代码中用users/${_currentUser!.uid}定位到当前用户的数据节点,和你的截图结构完全对应。
  • 实时监听:使用onValue监听数据变化,当数据库中用户信息更新时,界面会自动刷新,比单次读取更适合动态场景。
  • 权限排查:如果出现权限错误,先检查Firebase控制台的数据库规则是否正确,确保规则中的auth.uid能和用户UID匹配。

内容的提问来源于stack exchange,提问作者M. Imam Whidyarto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:30:43