如何在Flutter Firebase Authentication中获取当前登录用户的数据
解决方案
你已经定义了用于监听登录状态的authStateProvider,直接基于该Provider做监听即可实现用户数据的获取和UI自动更新,以下是具体用法:
1. UI层展示用户信息
在Widget中直接监听authStateProvider,它会自动订阅Firebase的登录状态流,用户登录/登出时会自动触发UI刷新,示例代码如下:
// 示例:展示当前登录用户邮箱的页面 class UserInfoPage extends ConsumerWidget { const UserInfoPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { // 监听登录状态变化 final authState = ref.watch(authStateProvider); return Scaffold( body: authState.when( // 加载中状态处理 loading: () => const Center(child: CircularProgressIndicator()), // 异常状态处理 error: (error, stackTrace) => const Center(child: Text('获取用户信息失败')), // 获取到用户状态数据 data: (user) { if (user == null) { // 未登录状态的展示逻辑 return const Center(child: Text('请先登录账号')); } // 已登录状态:可直接使用user对象的字段,也可赋值给变量做其他业务逻辑 return Center(child: Text('当前登录邮箱:${user.email}')); }, ), ); } }
2. 业务逻辑中获取用户数据
如果需要在点击事件、接口请求等业务逻辑中获取当前用户信息,直接读取authStateProvider的当前值即可:
ElevatedButton( onPressed: () { final currentUser = ref.read(authStateProvider).value; if (currentUser != null) { // 执行业务逻辑,比如调用接口传递用户邮箱、上报用户行为等 debugPrint('当前操作的用户邮箱:${currentUser.email}'); } }, child: const Text('提交数据'), )
3. 可选优化:封装常用用户信息Provider
可以提前封装通用的用户信息Provider,减少重复的判空代码:
// 全局当前用户Provider final currentUserProvider = Provider<User?>((ref) { return ref.watch(authStateProvider).value; }); // 全局用户邮箱Provider final userEmailProvider = Provider<String?>((ref) { return ref.watch(currentUserProvider)?.email; }); // 之后使用时直接调用即可,无需重复处理状态 final userEmail = ref.watch(userEmailProvider);
注意事项
- 不要直接调用
FirebaseAuth.instance.currentUser获取用户,该方法返回的是瞬时快照,无法监听登录状态变化,登录成功后可能出现延迟取不到值的问题,也无法触发UI自动更新。 authStateProvider会自动管理订阅生命周期,页面销毁时会自动取消监听,不需要手动处理资源释放。
内容的提问来源于stack exchange,提问作者Diego jiménez
相关产品推荐
相关产品推荐

