Flutter使用Firebase Auth时Facebook登录无法获取邮箱、谷歌登录正常如何修复
问题修复方案
问题原因
Facebook登录默认不会申请邮箱权限,平台不会主动返回用户邮箱信息,因此Firebase Auth拿到的用户数据里就没有邮箱字段。
修复步骤
步骤1:调整Facebook登录的权限申请
调用Facebook登录方法时主动传入email权限,告知平台你需要获取用户邮箱信息。
步骤2:兼容邮箱不存在的场景
部分用户可能没有绑定Facebook邮箱、或者登录时拒绝了邮箱授权,前端展示时必须做非空判断,不能直接用!强制解包空值。
修改后的完整代码
google_sigincontrol.dart 调整
final googleSignIn = GoogleSignIn(); GoogleSignInAccount ? _user; GoogleSignInAccount get user => _user!; Future facebookLogin() async { // 新增权限申请:public_profile是默认权限,email是获取邮箱必须的权限 final LoginResult result = await FacebookAuth.instance.login( permissions: ['public_profile', 'email'], ); if (result.status == LoginStatus.success) { final OAuthCredential credential = FacebookAuthProvider.credential(result.accessToken!.token); final userCredential = await FirebaseAuth.instance.signInWithCredential(credential); // 可选:如果Firebase没有自动同步邮箱,手动拉取Facebook用户数据更新 if (userCredential.user?.email == null) { final fbUserInfo = await FacebookAuth.instance.getUserData( fields: "name,email,picture.width(200)", ); if (fbUserInfo['email'] != null) { await userCredential.user?.updateEmail(fbUserInfo['email']); } } notifyListeners(); return userCredential; } notifyListeners(); } Future googleLogin() async { final googleUser = await googleSignIn.signIn(); if (googleUser == null) return; _user = googleUser; final googleAuth = await googleUser.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); await FirebaseAuth.instance.signInWithCredential(credential); notifyListeners(); }
screen.dart 调整(空安全兼容)
final user = FirebaseAuth.instance.currentUser!; CircleAvatar( radius: 40, backgroundImage: NetworkImage(user.photoURL ?? '你的默认占位图链接'), ), SizedBox(height: 8), Text('Name: ${user.displayName ?? '匿名用户'}', style: TextStyle(color: Colors.black,fontSize: 16), ), SizedBox(height: 8), // 邮箱为空时展示提示文本,避免崩溃 Text('Email: ${user.email ?? '用户未提供邮箱信息'}', style: TextStyle(color: Colors.black,fontSize: 16), ),
注意事项
- 确认你的Facebook应用在开发者后台已经开放了邮箱权限,该权限属于普通权限,不需要官方审核即可使用。
- 极端场景下还是会出现拿不到邮箱的情况,必须保留空判断逻辑,避免应用出现空指针崩溃。
内容的提问来源于stack exchange,提问作者Pranav Variar
相关产品推荐
相关产品推荐

