Flutter:取消Google登录流程后平台异常

问题描述 投票:4回答:3

这是我的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

我可以进行身份​​验证,登录结构可以正常工作,但是,如果我在Google登录,并且通过点击物理设备(S7 Edge)上的后退按钮来取消Google的身份验证流程,则应用程序将锁定并返回此:

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()
      },
    )
  );
} 
firebase dart firebase-authentication flutter google-signin
3个回答
2
投票

您可以使用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;
      }

1
投票

根据signIn()中对google_sign_in.dart函数的注释,请求取消应返回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中针对此错误提出了一个问题,>

目前,您必须坚持手动捕获错误


0
投票

系统映像需要“ google playstore服务

© www.soinside.com 2019 - 2024. All rights reserved.