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

Flutter Firebase Google登录出现network-request-failed网络错误求助

Flutter Firebase Google登录报network-request-failed错误的解决方案

问题现象

  • 点击登录按钮弹出Google账号选择弹窗,选择账号后弹窗消失,触发错误:[firebase_auth/network-request-failed] A network error (such as timeout, interrupted connection or unreachable host) has occurred.
  • Firebase Auth控制台和Cloud Firestore未存储用户数据,但SharedPreferences已保存用户信息,重启应用可直接跳转首页

原因分析

  1. 网络连接异常:设备无法连通Firebase服务器,导致Firebase认证请求失败,但Google本地登录状态已保留
  2. Firebase配置错误:平台配置文件(Android的google-services.json、iOS的GoogleService-Info.plist)不正确,或Google登录功能未在Firebase控制台启用
  3. 代码逻辑缺陷:仅依赖GoogleSignIn本地状态判断登录,未同步Firebase认证状态;未捕获Firebase操作的异常,导致错误无法处理

解决方案

1. 排查网络问题

  • 确认设备可正常访问Firebase服务,测试访问Firebase相关域名(如firebase.googleapis.com)是否通畅
  • 切换网络环境(如从WiFi切换到移动数据),或关闭代理设置后重试
  • 若在受限网络环境,需确保网络允许访问Firebase的IP和域名

2. 验证Firebase配置

  • 检查Android/iOS项目中的Firebase配置文件是否正确放置:
    • Android:google-services.json放在android/app目录下
    • iOS:GoogleService-Info.plist添加到Xcode项目中,确保Target Membership已勾选
  • 确认Firebase控制台中项目的包名/bundle ID与应用一致
  • 进入Firebase控制台 → 认证 → 登录方法 → Google,确保已启用该登录方式,并填写正确的项目支持邮箱

3. 修复代码逻辑

(1)添加异常捕获与错误处理

修改signInWithGoogle方法,捕获Firebase操作的异常,处理网络错误并清除本地无效登录状态:

Future signInWithGoogle() async {
  preferences = await SharedPreferences.getInstance();
  setState(() {
    loading = true;
  });
  try {
    GoogleSignInAccount? googleUser = await googleSignIn.signIn();

    if (googleUser != null) {
      final GoogleSignInAuthentication googleSignInAuthentication =
          await googleUser.authentication;

      final AuthCredential credential = GoogleAuthProvider.credential(
        accessToken: googleSignInAuthentication.accessToken,
        idToken: googleSignInAuthentication.idToken,
      );
      // 关键:捕获Firebase认证的网络异常
      final UserCredential userCredential =
          await firebaseAuth.signInWithCredential(credential);
      user = userCredential.user;
      if (user != null) {
        final QuerySnapshot result = await FirebaseFirestore.instance
            .collection("users")
            .where("id", isEqualTo: user?.uid)
            .get();
        final List<DocumentSnapshot> docs = result.docs;
        if (docs.length == 0) {
          await FirebaseFirestore.instance.collection("users").doc(user?.uid).set({
            "id": user?.uid,
            "username": user?.displayName,
            "profilePicture": user?.photoURL,
            "phNo": user?.phoneNumber,
            "email": user?.email,
          });
          await preferences.setString('id', user!.uid);
          await preferences.setString('userName', user!.displayName ?? ' ');
          await preferences.setString('photoUrl', user!.photoURL ?? ' ');
          await preferences.setString('email', user!.email ?? '');
        } else {
          await preferences.setString('id', docs[0]['id']);
          await preferences.setString('userName', docs[0]['username']);
          await preferences.setString('photoUrl', docs[0]['photoUrl']);
          await preferences.setString('email', docs[0]['email']);
        }
        Navigator.popAndPushNamed(context, HomePage.id);
      }
    }
  } catch (e) {
    // 处理网络错误
    if (e.toString().contains('firebase_auth/network-request-failed')) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('网络连接失败,请检查网络后重试')),
      );
      // 清除本地Google登录状态,避免重启后误判
      await googleSignIn.signOut();
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('登录失败:${e.toString()}')),
      );
    }
  } finally {
    setState(() {
      loading = false;
    });
  }
}

(2)同步Firebase认证状态

修改isSignedIn方法,结合Firebase Auth的currentUser判断真实登录状态,避免仅依赖GoogleSignIn本地状态:

void isSignedIn() async {
  setState(() {
    loading = true;
  });
  preferences = await SharedPreferences.getInstance();
  // 同时验证Firebase当前用户和GoogleSignIn状态
  User? firebaseUser = firebaseAuth.currentUser;
  isLoggedIn = firebaseUser != null && await googleSignIn.isSignedIn();

  if (isLoggedIn) {
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => HomePage()),
    );
  }
  setState(() {
    loading = false;
  });
}

4. 其他排查步骤

  • 检查AndroidManifest.xml(Android)是否添加网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 清除应用缓存和数据,重新测试登录流程
  • 更新Flutter Firebase相关SDK到最新版本,避免版本兼容问题

内容的提问来源于stack exchange,提问作者Aryan Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:36:14