首页 > 解决方案 > Flutter Web:google_sign_in_web:适用于桌面和 iOS。在 Android Chrome 上失败

问题描述

链接到 firebase 的简单身份验证代码。该代码在移动 iOS Safari 和桌面浏览器上运行良好。在 Android Chrome 上登录失败(停止)。

简单的代码片段:


final GoogleSignIn googleSignIn = GoogleSignIn();

  Future loginGoogle() async {
    try {
      Print('AAA');
      await googleSignIn.signIn();
      print('BBB');
    } catch (error) {
      print(error);
    }
  }

  //Listener initialized at creation of this class.
  googleSignInListener() {
    return googleSignIn.onCurrentUserChanged.listen((account) async {
      handleSignIn(account);
    }, onError: (err) => print('Error signing in: $err'));
  }

当 google 登录弹出选项卡在 Android 上打开时,Flutter 似乎停止了。一旦 google 选项卡通过身份验证并自动关闭,flutter 选项卡就会恢复但什么也不做。在 Android Chrome 上,控制台输出仅显示“AAA”。如果我在第一次尝试失败后再次尝试登录,则输出相同,只有“AAA”并且没有谷歌登录弹出窗口。

控制台也不会打印任何错误。

此代码在桌面浏览器和 iOS Safari 浏览器上运行良好。

Android 是否在后台 chrome 选项卡中停止应用程序?

标签: firebasegoogle-signingoogle-authenticationflutter-web

解决方案


我能够得到这个工作。事实证明,您必须在两个位置告知 google 网站 Uri 的身份验证来源以及成功的身份验证可以重定向到的位置。一个位置在 google 控制台中,另一个位置在 firebase 控制台身份验证下。

但是,我无法让 google_sign_in_web 包仍然工作。我使用了 firebase_auth 包并在身份验证请求中设置了谷歌提供程序。这很好用。这是使用 firebase_auth 调整和工作的代码片段

import 'package:firebase_auth/firebase_auth.dart' as FA;
//...

class Auth with ChangeNotifier {
  final FA.FirebaseAuth firebaseAuth = FA.FirebaseAuth.instance;
  FA.GoogleAuthProvider googleAuthProvider = FA.GoogleAuthProvider();
  StreamSubscription<FA.User> authListener;
  //...

  Auth() {
    authListener = signInListener();
    //...
  }

  Future loginGoogle() async {
    await firebaseAuth.setPersistence(FA.Persistence.LOCAL);
    auth = await firebaseAuth.signInWithPopup(googleAuthProvider);
  }

  signInListener() {
    return firebaseAuth.authStateChanges().listen((_user) async {
      //Auth state changed...
    });
  }

  //...
}


推荐阅读