使用 Flutter 登录 Google:错误代码 -4

Posted

技术标签:

【中文标题】使用 Flutter 登录 Google:错误代码 -4【英文标题】:Google Sign-In With Flutter: Error Code -4 【发布时间】:2019-06-05 13:42:37 【问题描述】:

我目前尝试在 Flutter 中实现 google_sign_in 包 (https://pub.dartlang.org/packages/google_sign_in)。

为此,我遵循了他们存储库 (https://github.com/flutter/plugins/blob/master/packages/google_sign_in/lib/google_sign_in.dart) 的示例。

在那个例子中,“initState”是一个调用signInSilently

@override
void initState() 
  super.initState();
  _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) 
    setState(() 
      _currentUser = account;
      loggedIn = true;
    );
  );
  loggedIn = false;
  _googleSignIn.signInSilently();

我在 ios 中尝试过这段代码。在我的第一个 App Start 中,它运行良好。但是自从我注销后,我一直在这里重新启动我的应用程序时遇到错误。这是以下 PlatformException:

PlatformException(sign_in_required, com.google.GIDSignIn, The operation couldn’t be completed. (com.google.GIDSignIn error -4.))

我在问题Google Sign-In Error -4 中发现错误代码是因为钥匙串中缺少身份验证。

swift 编程时的解决方案是在尝试signInSilently 之前调用方法* hasAuthInKeychain*。我的问题是flutter包中的GoogleSignIn类没有这样命名的函数。

我是否需要使用此程序包运行另一个呼叫,以确保我可以尝试静默登录?还是我做错了什么来获取此消息,或者甚至有可能捕获此错误?

编辑

我也尝试了 Marcel 的解决方案。不知何故,它没有捕捉到 PlatfromException。

我不知道这是否有帮助:signInSilently() 正在调用一个方法,其中有以下调用(google_sign_in.dart,第 217 行):

await channel.invokeMethod(method)

在platform_channel.dart中有一个调用

codec.decodeEnvelope(result);

平台异常在这里被抛出。

if (errorCode is String && (errorMessage == null || errorMessage is String) && !buffer.hasRemaining)
  throw PlatformException(code: errorCode, message: errorMessage, details: errorDetails);
else
  throw const FormatException('Invalid envelope');

编辑 2

由于我只是运行我的应用程序并没有在调试模式下启动它,它以某种方式再次运行而不会引发异常。我不知道这对代码有何影响以及为什么会出现此异常。我也可以再次在调试模式下运行代码。

从那以后我又遇到了异常。我再次重新启动了 android studio 并在没有调试模式的情况下运行了一次应用程序。

【问题讨论】:

你好请看这个问题github.com/flutter/flutter/issues/15796 您的 google_sign_in 是哪个版本的?我的 ^3.2.4 版应用程序在两个操作系统上运行完全相同的代码段 我注意到当用户之前注销时会出现错误,并且仅在模拟器中发生。编译并带到真机后,没有出现错误。 CMIIW。 【参考方案1】:

您可以通过像这样处理PlatformException 来检查登录是否失败:

void _setUpGoogleSignIn() async 
  try 
    final account = await _googleSignIn.signInSilently();
    print("Successfully signed in as $account.displayName.");
   on PlatformException catch (e) 
    // User not signed in yet. Do something appropriate.
    print("The user is not signed in yet. Asking to sign in.");
    _googleSignIn.signIn();
  

【讨论】:

试过那个。但不知何故,它没有捕捉到错误。在谷歌登录是一个“等待 channel.invokeMethod(method)。在那里抛出了 PlatformException。 好的,我将代码编辑为显式的 try-catch。这行得通吗?【参考方案2】:

这是捕获错误并运行 _googleSignIn.signIn(); 的一种方法;

GoogleSignInAccount googleSignInAccount = await googleSignIn
    .signInSilently(suppressErrors: false)
    .catchError((dynamic error) async 
  GoogleSignInAccount googleSignInAccount =
      await _googleSignIn.signIn();
);

【讨论】:

【参考方案3】:

就我而言,我不希望用户自动看到登录窗口。在这种情况下,我从signIn 更改为signOut。这样,我将用户发送到另一个带有解释性消息和登录按钮的视图。

GoogleSignInAccount googleSignInAccount = await googleSignIn
    .signInSilently(suppressErrors: false)
    .catchError((dynamic error) async 
      GoogleSignInAccount googleSignInAccount = await _googleSignIn.signOut();
      return googleSignInAccount;
    );

【讨论】:

以上是关于使用 Flutter 登录 Google:错误代码 -4的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Google 登录的错误 403 受限客户端

Flutter iOS 应用需要 Google 登录密码

Flutter Google 登录错误未被捕获

Flutter Firebase Android/ios Google 登录错误

尝试使用谷歌登录包登录谷歌 - Flutter

Flutter Google 登录 - 电子邮件数据返回 null