尝试使用firebase身份验证时,Flutter无法捕获PlatformException

时间:2018-05-19 09:11:02

标签: android firebase exception firebase-authentication flutter

我刚刚开始使用flutter,我正在尝试使用电子邮件和密码实现firebase登录,当我输入正确的电子邮件和密码时它可以正常工作,但在密码错误时则不行。当密码错误时它会给出一个PlatformException然后应用程序冻结,即使我试图捕获异常,而android studio在下面显示:

enter image description here

这是我在实施中的签到:

String _reason;
  Future<void> _performLogin() async {
    String reason;
    // This is just a demo, so no actual login here.
    try{
      FirebaseUser user =  await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password);
      if(user != null){
        Navigator.of(context).push(new MaterialPageRoute<dynamic>(
          builder: (BuildContext context) {
            return new MyApp();
          },
        ));
        final snack = new SnackBar(
          content: new Text("Signed In Successfully"),
          action: null,
          duration: new Duration(seconds: 4),
          backgroundColor: Colors.black,
        );

        Scaffold.of(context).showSnackBar(snack);
      }
    }on PlatformException catch(e){

      reason = '${e.message}';

      /*final snack = new SnackBar(
        content: new Text(e.message),
        action: null,
        duration: new Duration(seconds: 4),
        backgroundColor: Colors.black,
      );

      Scaffold.of(context).showSnackBar(snack);*/
    }
    setState(() {
      _reason = reason;
    });

  }

我还添加了import 'package:flutter/services.dart' show PlatformException;

请告诉我如何捕捉异常,谢谢。

4 个答案:

答案 0 :(得分:2)

我最近也遇到了此错误,并且我发现在调试模式下(即单击VSCode中的.catchError()按钮时)没有调用Run->Start Debugging回调。

但是,当您输入flutter run -d时,.catchError()方法将被回调,因为它不在调试模式下。

要获取您首选的模拟器代码,请将以下代码行粘贴到终端中:

instruments -s devices

如果这不起作用,您也可以尝试粘贴以下内容:

xcrun simctl list

将像以前一样调用.catchError()方法,并且其中的代码将按预期执行!

此外,该应用程序不会再因PlatformException()而崩溃,而是会显示类似以下的日志:

[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The getter 'uid' was called on null.
Receiver: null

我也曾在Google登录中遇到过此问题,其中没有调用.catchError()

最后,如果您在处理Firebase身份验证时遇到一些错误,则应首先尝试首先通过终端运行。谢谢,希望对您有所帮助!

答案 1 :(得分:0)

我有一段时间遇到同样的问题,并找出了原因。

这里的问题是,尽管它“似乎”无法捕获PlatformException ,实际上,您正在“捕获”异常。

在Android Studio中,我们可以设置调试中断策略, 通过转到运行>查看断点。 enter image description here

如果您取消选中已启用,则会发现Android Studio不会“捕获”您捕获的异常,并且当执行catch子句时,您的应用将正确显示小吃栏,这是我们期望的“当我们没有调试”该应用。

但是,当我们在启用Break on异常的情况下进行调试时,Android Studio只是通过在catch子句执行之前中断PlatformException来完成其工作。

因此,您可以仅取消选中“启用”选项,或者只按Android Studio中的“恢复程序”按钮,而不必担心它。您的应用程序可能工作正常。 :)

答案 2 :(得分:0)

使用 FirebaseException 而不是 PlatformException

on FirebaseException catch (e){}

答案 3 :(得分:-4)

在firebase控制台设置中更新android debug sha1certificate指纹,然后尝试