Flutter 在尝试 Firebase 身份验证时无法捕获 PlatformException

Posted

技术标签:

【中文标题】Flutter 在尝试 Firebase 身份验证时无法捕获 PlatformException【英文标题】:Flutter unable to catch PlatformException while attempting firebase auth 【发布时间】:2018-10-29 14:56:37 【问题描述】:

我最近才开始使用颤振,我正在尝试使用电子邮件和密码实现 Firebase 登录,当我输入正确的电子邮件和密码时它可以工作,但当密码错误时它不起作用。当密码错误时,它会给出一个 PlatformException,然后应用程序会冻结,即使我已经尝试捕获异常,而 android studio 显示如下:

这是我的登录实现:

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;

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

【问题讨论】:

尝试在以后登录时添加.catchError( @Tree 很遗憾没有工作。 我在另一项任务中遇到了同样的问题。我通过在我的代码中手动查找错误来解决它。尝试匿名登录,看看是否有效。在firebase中启用匿名唱歌。如果这也不起作用,则可能是您在应用程序中的 firebase 设置。比再次通过 firebase 上的 codelab 并再次配置您的应用程序。 【参考方案1】:

使用 FirebaseException 而不是 PlatformException

on FirebaseException catch (e)

【讨论】:

【参考方案2】:

我最近也遇到了这个错误,我发现.catchError() 回调没有在调试模式下被调用(当你点击 VSCode 中的Run-&gt;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 Authentication 的错误时遇到了一些错误,你应该首先尝试通过终端运行。谢谢,我希望这会有所帮助!

【讨论】:

【参考方案3】:

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

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

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

如果您取消选中 Enabled,您会发现 Android Studio“不会妨碍”您捕获异常,并且当 catch 子句执行时,您的应用将正确显示小吃栏,这正是我们所期望的“当我们不是在调试”应用程序。

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

因此,您可以取消选中已启用选项,或者只需按下 Android Studio 中的“恢复程序”按钮,而不必担心。你的应用程序可能工作得很好。 :)

【讨论】:

仍然是dart调试中的一个bug。 GitHub 中是否已经提出了问题?否则我认为应该报告。【参考方案4】:

在 Firebase 控制台设置中更新您的 android 调试 sha1certificate 指纹并尝试

【讨论】:

我似乎找不到任何显示如何执行此操作的资源,如何在 windows 中获取指纹? ***.com/questions/27609442/…关注贾米尔的回答 我只是仔细检查了我的 SHA1 和我的 firebase 控制台上的那个,它们是一样的。

以上是关于Flutter 在尝试 Firebase 身份验证时无法捕获 PlatformException的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:Firebase 身份验证和 Firestore 快照流

如何在 Flutter 手机身份验证中删除验证码

Flutter bloc 和 Firebase 电话身份验证

Flutter Web 中的 Firebase Phone 身份验证

Flutter Firebase 存储:请求没有身份验证令牌

使用存储和 cookie(不使用 Firebase)在 Flutter 中进行身份验证?