取消谷歌登录引发异常 [英] Canceling Google Sign In cause an exception in Flutter

查看:0
本文介绍了取消谷歌登录引发异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正试图在我的Android Ffltter应用程序中实现Google Sign In,但我遇到了这个问题:

当用户取消Google登录(点击后退按钮)时,将引发此异常。

平台异常(PlatformException(Sign_in_Canceled,com.google.android.gms.common.api.ApiException:12501:,NULL))

我发现在一些较新的版本中,这个问题应该得到修复,并且应该返回空值而不是异常。我当前使用的是Google_Sign_in:^4.1.1

我尝试将代码包装在try-Catch块中或对该方法使用.catchError(),但没有任何帮助。

我的代码如下:

  Future googleSign(BuildContext context) async {
    final GoogleSignInAccount googleSignInAccount =
        await googleSignIn.signIn().catchError((onError) => print(onError));

    final GoogleSignInAuthentication googleSignInAuthentication =
        await googleSignInAccount.authentication;

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

    final AuthResult authResult = await _auth.signInWithCredential(credential);

    return authResult.user.uid;
  }

您知道如何处理这个异常吗? 谢谢。

推荐答案

该问题似乎是由于DART VM无法正确检测使用catchError()捕获的异常导致的,如this StackOverflow question

中所述

这个错误似乎没有完美的修复方法。但是,我在Github上遇到了一个比较好的解决方法。

需要您编辑package:flutter/src/services/platform_channel.dart

您必须包装此👇🏽

final Map<dynamic, dynamic> result = await invokeMethod<Map<dynamic, dynamic>>(method, arguments);
return result?.cast<K, V>();

try/catch块如下所示👇🏽(位于invokeMapMethod开头)

try {
    final Map<dynamic, dynamic> result = await invokeMethod<Map<dynamic, dynamic>>(method, arguments);
    return result?.cast<K, V>();
} on PlatformException catch (err) { // Checks for type PlatformException
    if (err.code == 'sign_in_canceled') { // Checks for sign_in_canceled exception
        print(err.toString());
    } else {
        throw err; // Throws PlatformException again because it wasn't the one we wanted
    }
}

您可能还想检查googleSignInAccount是否为null,在这种情况下,您应该返回return null以防止进一步的异常,如NoSuchMethodError: The getter 'authentication' was called on null

因此,您的代码可以重写为

...

final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn().catchError((onError) => print(onError));

// Return null to prevent further exceptions if googleSignInAccount is null
if (googleSignInAccount == null) return null;

final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication;

...

我希望这很容易理解,并且对您确实有效。🙂

这篇关于取消谷歌登录引发异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆