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已保存用户信息,重启应用可直接跳转首页
原因分析
- 网络连接异常:设备无法连通Firebase服务器,导致Firebase认证请求失败,但Google本地登录状态已保留
- Firebase配置错误:平台配置文件(Android的
google-services.json、iOS的GoogleService-Info.plist)不正确,或Google登录功能未在Firebase控制台启用 - 代码逻辑缺陷:仅依赖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已勾选
- Android:
- 确认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
相关产品推荐
相关产品推荐

