取消谷歌登录引发异常 [英] Canceling Google Sign In cause an exception in Flutter
问题描述
我正试图在我的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屋!