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.0flutter 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
相关产品推荐
相关产品推荐

