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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:09:03