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

Flutter集成Google登录遇cloud_firestore/unknown错误,无法跳转页面

解决Flutter Google登录后Firestore连接异常问题

可能的原因及对应解决方案

1. Firestore平台配置问题

  • Android:检查android/app/google-services.json是否正确放置,确认文件内project_id、database_url等配置与Firebase控制台完全一致。
  • iOS:确认ios/Runner/GoogleService-Info.plist配置正确,Bundle ID需与Firebase控制台登记的一致,同时在Xcode中验证该文件已添加到项目目标中。

2. 网络与权限配置缺失

  • 确保设备/模拟器网络连接正常,Firestore依赖网络访问。
  • Android:在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • iOS:在Info.plist中添加网络权限配置(开发阶段可临时放开):
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

3. 代码优化:异常捕获与空安全处理

你的代码缺少异常捕获逻辑,且存在强制解包的风险,导致Firestore操作失败后无法定位问题,也无法触发页面跳转。修改后的代码如下:

class AuthMethods {
  final FirebaseAuth auth = FirebaseAuth.instance;

  Future<User?> getCurrentUser() async {
    return auth.currentUser;
  }

  Future<void> signInWithGoogle(BuildContext context) async {
    try {
      final GoogleSignIn googleSignIn = GoogleSignIn();
      final GoogleSignInAccount? googleSignInAccount = await googleSignIn.signIn();

      if (googleSignInAccount == null) {
        // 用户取消登录流程
        return;
      }

      final GoogleSignInAuthentication googleSignInAuthentication =
          await googleSignInAccount.authentication;

      final AuthCredential credential = GoogleAuthProvider.credential(
        idToken: googleSignInAuthentication.idToken,
        accessToken: googleSignInAuthentication.accessToken,
      );

      final UserCredential result = await auth.signInWithCredential(credential);
      final User? userDetails = result.user;

      if (userDetails != null) {
        Map<String, dynamic> userInfoMap = {
          "email": userDetails.email,
          "name": userDetails.displayName,
          "imgUrl": userDetails.photoURL,
          "id": userDetails.uid
        };
        await DatabaseMethods().addUser(userDetails.uid, userInfoMap);
        
        // 检查context是否仍可用,避免页面已销毁时跳转
        if (!context.mounted) return;
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => const GoogleUserInfo()),
        );
      }
    } catch (e) {
      print("登录或Firestore操作异常:$e");
      // 可在此处添加用户可见的错误提示,如showDialog
    }
  }
}

class DatabaseMethods {
  Future<void> addUser(String userId, Map<String, dynamic> userInfoMap) async {
    try {
      await FirebaseFirestore.instance
          .collection("User")
          .doc(userId)
          .set(userInfoMap);
    } catch (e) {
      print("添加用户到Firestore失败:$e");
      rethrow; // 抛出异常让上层处理
    }
  }
}

4. 验证Firebase初始化

确保main.dart中正确初始化Firebase:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

5. 深度清理项目

除了flutter clean和flutter pub get,还可执行:

  • Android:进入android目录执行./gradlew clean
  • iOS:进入ios目录执行pod deintegrate && pod install

内容的提问来源于stack exchange,提问作者Finance hyderabad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:33:29