Flutter中如何将Firebase文档字段值存入全局布尔变量并更新
问题分析与解决方案
核心问题点
你的代码存在几个关键问题导致auth变量无法正确更新:
- 全局
email变量仅在初始化时获取一次,切换账号后不会自动同步最新用户邮箱,导致请求的是旧用户的文档 - 初始化
email时直接使用currentUser!.email,登录前currentUser为null会触发空指针崩溃 - 缺少错误处理逻辑,未考虑文档不存在、字段缺失或Firestore请求失败的情况
- 混合使用
await和then,代码冗余且易出现异步逻辑问题
修正后的全局变量与更新函数
替换variable.dart内容为以下代码:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; bool auth = false; Future<void> authUpdate() async { final currentUser = FirebaseAuth.instance.currentUser; // 未登录时直接将权限设为false if (currentUser == null) { auth = false; return; } try { final userDoc = await FirebaseFirestore.instance .collection('Users') .doc(currentUser.email) .get(); if (userDoc.exists) { // 字段不存在时默认设为false,避免空指针 auth = userDoc.data()?['auth?'] ?? false; } else { // 用户文档不存在时的处理逻辑 auth = false; } } catch (e) { // 捕获Firestore请求异常,避免崩溃 print('权限更新失败: $e'); auth = false; } }
使用说明
- 登录后手动更新:在登录按钮的点击事件中,确保登录完成后等待权限更新完成:
onPressed: () async { // 执行Firebase登录逻辑 await FirebaseAuth.instance.signInWithEmailAndPassword( email: 'user@example.com', password: 'password123', ); // 登录成功后更新权限 await authUpdate(); // 此时可正常使用auth变量 print('当前用户权限状态: $auth'); },
- 自动监听登录状态变化:如果需要切换账号或登出时自动更新权限,可在APP初始化时添加Auth状态监听:
// 例如在main函数或根Widget的initState中添加 FirebaseAuth.instance.authStateChanges().listen((user) async { await authUpdate(); // 若需触发UI更新,可结合状态管理工具(如Provider、Bloc)通知组件刷新 });
内容的提问来源于stack exchange,提问作者Matteo Di Pangrazio
相关产品推荐
相关产品推荐

