这是我的pubspec.yaml。我正在使用Flutter:
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
http: ^0.11.3
#Google Sign In
google_sign_in: 3.0.3
firebase_auth: ^0.5.18
flutter_svg: ^0.5.0我可以很好地进行身份验证,登录结构可以工作,但是如果我在谷歌登录时,通过点击物理设备(S7 Edge)上的后退按钮取消了谷歌的身份验证流程,应用程序将锁定并返回以下内容:
Exception has occurred.
PlatformException(sign_in_failed, Status{statusCode=ERROR, resolution=null}, null)这是这种情况的日志。在我看来,它似乎默默地失败了:
I/InputMethodManager(13050): startInputInner - mService.startInputOrWindowGainedFocus
D/ViewRootImpl@3c3c6cd[SignInHubActivity](13050): MSG_WINDOW_FOCUS_CHANGED 0
D/ViewRootImpl@3c3c6cd[SignInHubActivity](13050): MSG_WINDOW_FOCUS_CHANGED 1
V/InputMethodManager(13050): Starting input: tba=android.view.inputmethod.EditorInfo@4d4a683 nm : com.xYNP82hMsgxfvzA.pqfrontend ic=null
I/InputMethodManager(13050): startInputInner - mService.startInputOrWindowGainedFocus
D/ViewRootImpl@3c3c6cd[SignInHubActivity](13050): MSG_WINDOW_FOCUS_CHANGED 0
D/ViewRootImpl@a981422[MainActivity](13050): MSG_WINDOW_FOCUS_CHANGED 1
V/InputMethodManager(13050): Starting input: tba=android.view.inputmethod.EditorInfo@5990000 nm : com.xYNP82hMsgxfvzA.pqfrontend ic=null
I/InputMethodManager(13050): startInputInner - mService.startInputOrWindowGainedFocus
I/FlutterActivityDelegate(13050): onResume setting current activity to this
D/OpenGLRenderer(13050): eglDestroySurface = 0x7cb041df50
D/ViewRootImpl@3c3c6cd[SignInHubActivity](13050): Relayout returned: old=[0,0][1440,2560] new=[0,0][1440,2560] result=0x5 surface={valid=false 0} changed=true
D/ViewRootImpl@3c3c6cd[SignInHubActivity](13050): dispatchDetachedFromWindow
D/InputEventReceiver(13050): channel 'a2e7010 com.xYNP82hMsgxfvzA.pqfrontend/com.google.android.gms.auth.api.signin.internal.SignInHubActivity (client)' ~ Disposing input event receiver.
D/InputEventReceiver(13050): channel 'a2e7010 com.xYNP82hMsgxfvzA.pqfrontend/com.google.android.gms.auth.api.signin.internal.SignInHubActivity (client)' ~NativeInputEventReceiver.在网上没有找到任何解决方案,有人能帮我吗?
更新:我刚刚在日志中收到了一个异常通知:
E/flutter (13050): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (13050): PlatformException(sign_in_failed, Status{statusCode=ERROR, resolution=null}, null)
E/flutter (13050): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:547:7)
E/flutter (13050): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:279:18)
E/flutter (13050): <asynchronous suspension>
E/flutter (13050): #2 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:183:58)
E/flutter (13050): <asynchronous suspension>
E/flutter (13050): #3 GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:222:20)
E/flutter (13050): #4 GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:293:48)
E/flutter (13050): #5 handleSignIn (file:///C:/Users/dark_/picquest-dev/pq_frontend/lib/src/services/auth.dart:9:62)
E/flutter (13050): <asynchronous suspension>
E/flutter (13050): #6 main (file:///C:/Users/dark_/picquest-dev/pq_frontend/lib/main.dart:18:10)
E/flutter (13050): <asynchronous suspension>
E/flutter (13050): #7 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
E/flutter (13050): #8 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)它指向我编写的身份验证服务:这是:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'dart:async';
final GoogleSignIn _googleSignIn = GoogleSignIn();
final FirebaseAuth _auth = FirebaseAuth.instance;
Future<FirebaseUser> handleSignIn() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final FirebaseUser user = await _auth.signInWithGoogle(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
print("signed in " + user.displayName);
return user;
}
Future<Null> handleSignOut() async {
await _auth.signOut();
await _googleSignIn.signOut();
}这就是它的名字:
void main() {
//Default unauthenticated home page
try {
auth.handleSignIn();
} catch(e) {
print(e);
}
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown
]);
runApp(new MaterialApp(
title: 'Test',
home: _defaultHome,
theme: new ThemeData(
primaryColor: Colors.white
),
routes: <String, WidgetBuilder> {
'/onboarding/basic-info': (BuildContext context) => new UserOnBoarding_BasicInfo_Page(),
//'/onboarding/interests': (BuildContext context) => new UserOnBoarding_Interests_Page(),
'/avatar-repository': (BuildContext context) => new AvatarRepositoryPage(),
'/login': (BuildContext context) => new LoginPage(),
'/app/settings': (BuildContext context) => new AppSettingsPage()
},
)
);
} 发布于 2018-08-19 14:13:38
您可以使用catchError捕获错误,如下所示:
Future<FirebaseUser> handleSignIn() async {
final GoogleSignInAccount googleUser =
await _googleSignIn.signIn().catchError((onError) {
print("Error $onError");
});
if (googleUser != null) {
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
final FirebaseUser user = await _auth
.signInWithGoogle(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
)
.catchError((onError) {
print("error $onError");
});
if (user != null) {
print("signed in " + user.displayName);
return user;
}
}
return null;
}发布于 2018-09-21 10:06:07
根据google_sign_in.dart中signIn()函数的注释,取消请求应该返回null,而不是抛出PlatformException
/// Returned Future resolves to an instance of [GoogleSignInAccount] for a /// successful sign in or `null` in case sign in process was aborted.
我在Flutter存储库here中提出了一个关于这个bug的问题
现在,您必须坚持手动捕获错误
发布于 2020-01-02 23:44:38
这个错误不会像@monojmnj所说的那样在发布模式下发生,我认为这是集成开发环境导致的错误,因为当你在终端中运行你的应用程序时,不会导致异常。
https://stackoverflow.com/questions/51914691
复制相似问题