Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 用户取消登录流时如何处理平台异常_Flutter_Google Signin - Fatal编程技术网

Flutter 用户取消登录流时如何处理平台异常

Flutter 用户取消登录流时如何处理平台异常,flutter,google-signin,Flutter,Google Signin,当用户按“取消”而不是使用谷歌登录窗口登录时,我无法处理平台异常 我甚至尝试了一个if语句,以便在sign返回null时不运行,但这也不起作用 Future<void> _handleSignIn() async { try { await googleSignIn.signIn(); } catch (error) { print(error); } } Future\u handleSignIn()异步{ 试一试{ 等待谷歌签名; }捕获(错误){

当用户按“取消”而不是使用谷歌登录窗口登录时,我无法处理平台异常

我甚至尝试了一个if语句,以便在sign返回null时不运行,但这也不起作用

  Future<void> _handleSignIn() async {
  try {
  await googleSignIn.signIn();
  } catch (error) {
  print(error);
  }
  }
Future\u handleSignIn()异步{
试一试{
等待谷歌签名;
}捕获(错误){
打印(错误);
}
}

您可以简单地捕获
错误
如-

Future<void> _handleSignIn() async {
    await googleSignIn.signIn().catchError((e) {
      print(e);
    });
  }
Future\u handleSignIn()异步{
等待googleSignIn.signIn().catchError((e){
印刷品(e);
});
}

在使用谷歌进行身份验证时,不太明显的是,该过程包括三个步骤

  • \u googleSignIn.signIn()
    //提示窗口
  • googleAccount.authentication
    //获取凭据
  • \u auth.signInWithCredential(凭证)
    //实际的身份验证
  • 我遇到的问题和其他人可能遇到的问题一样,就是当在try-catch块中包装三个步骤而不处理第一个步骤中的null值时,catch块会预期错误对象和代码属性——情况就是这样。不管怎么说,我现在就是这样处理的

     // https://github.com/flutter/flutter/issues/26705
      Future<FirebaseUser> signInWithGoogle() async {    
        FirebaseUser user;
        var errorMessage;
    
        try {
          GoogleSignInAccount googleAccount = await _googleSignIn.signIn();
    
          if (googleAccount == null) {
            errorMessage = "CANCELLED_SIGN_IN";        
            return Future.error(errorMessage);
          }
    
          GoogleSignInAuthentication googleAuthentication = await googleAccount.authentication;
    
          AuthCredential credential = GoogleAuthProvider.getCredential(
            idToken: googleAuthentication.idToken,
            accessToken: googleAuthentication.accessToken,
          );
    
          AuthResult authResult = await _auth.signInWithCredential(credential);
          user = authResult.user; 
          return user;     
        }
        catch(error) {
          switch (error.code) {
              case "ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL":
                errorMessage = "Account already exists with a different credential.";
                break;
              case "ERROR_INVALID_CREDENTIAL":
                errorMessage = "Invalid credential.";
                break;
              case "ERROR_INVALID_EMAIL":
                errorMessage = "Your email address appears to be malformed.";
                break;
              case "ERROR_WRONG_PASSWORD":
                errorMessage = "Your password is wrong.";
                break;
              case "ERROR_USER_NOT_FOUND":
                errorMessage = "User with this email doesn't exist.";
                break;
              case "ERROR_USER_DISABLED":
                errorMessage = "User with this email has been disabled.";
                break;
              case "ERROR_TOO_MANY_REQUESTS":
                errorMessage = "Too many requests. Try again later.";
                break;
              case "ERROR_OPERATION_NOT_ALLOWED":
                errorMessage = "Signing in with Email and Password is not enabled.";
                break;
              default:
                errorMessage = "An undefined Error happened. ";
            }
        }
        if (errorMessage != null) {      
          return Future.error(errorMessage);
        }    
    
        return null;
      }
    
    //https://github.com/flutter/flutter/issues/26705
    使用Google()异步{
    FirebaseUser用户;
    var错误消息;
    试一试{
    GoogleSignInAccount googleAccount=等待_googleSignIn.signIn();
    如果(googleAccount==null){
    errorMessage=“已取消登录”;
    返回Future.error(错误消息);
    }
    GoogleSignInAuthentication googleAuthentication=等待googleAccount.authentication;
    AuthCredential credential=GoogleAuthProvider.getCredential(
    idToken:googleAuthentication.idToken,
    accessToken:googleAuthentication.accessToken,
    );
    AuthResult AuthResult=wait _auth.signwithcredential(凭证);
    user=authResult.user;
    返回用户;
    }
    捕获(错误){
    开关(错误代码){
    案例“错误\u帐户\u存在\u且凭据不同”:
    errorMessage=“已存在具有不同凭据的帐户。”;
    打破
    案例“错误\u无效\u凭证”:
    errorMessage=“无效凭证。”;
    打破
    案例“错误\u无效\u电子邮件”:
    errorMessage=“您的电子邮件地址似乎格式不正确。”;
    打破
    案例“错误\错误\密码”:
    errorMessage=“您的密码错误。”;
    打破
    案例“错误用户未找到”:
    errorMessage=“发送此电子邮件的用户不存在。”;
    打破
    案例“错误用户禁用”:
    errorMessage=“此电子邮件的用户已被禁用。”;
    打破
    案例“错误请求太多”:
    errorMessage=“请求太多。请稍后再试。”;
    打破
    案例“错误操作不允许”:
    errorMessage=“未启用使用电子邮件和密码登录。”;
    打破
    违约:
    errorMessage=“发生了未定义的错误。”;
    }
    }
    如果(errorMessage!=null){
    返回Future.error(错误消息);
    }    
    返回null;
    }
    
    还有谷歌按钮

    GoogleSignInButton(
                onPressed: () async {
                  var isError = false;
                  var authService = Provider.of<AuthService>(context, listen: false);
    
                  await authService.signInWithGoogle().catchError((errorMessage) async {
                    isError = true;
                    if (errorMessage != 'CANCELLED_SIGN_IN') {
                      await showPopup(context, title: 'Validation', child: Text(errorMessage));
                    }                
                  }); 
    
                  if (isError == false) {
                    Navigator.pushReplacementNamed(context, HomeScreen.routeName);
                  }
                },
              ),    
    
    谷歌登录按钮(
    onPressed:()异步{
    var-isError=false;
    var authService=Provider.of(上下文,侦听:false);
    等待authService.signInWithGoogle().catchError((errorMessage)异步{
    isError=真;
    如果(errorMessage!=“已取消登录”){
    等待showPopup(上下文,标题:“验证”,子项:文本(errorMessage));
    }                
    }); 
    if(isError==false){
    Navigator.pushReplacementNamed(上下文,主屏幕.routeName);
    }
    },
    ),    
    
    您确定取消登录时会捕获异常,因为我看到它仍然会抛出最新版本谷歌登录的异常吗
    GoogleSignInButton(
                onPressed: () async {
                  var isError = false;
                  var authService = Provider.of<AuthService>(context, listen: false);
    
                  await authService.signInWithGoogle().catchError((errorMessage) async {
                    isError = true;
                    if (errorMessage != 'CANCELLED_SIGN_IN') {
                      await showPopup(context, title: 'Validation', child: Text(errorMessage));
                    }                
                  }); 
    
                  if (isError == false) {
                    Navigator.pushReplacementNamed(context, HomeScreen.routeName);
                  }
                },
              ),