如何在颤振/飞镖中捕获平台异常?

Posted

技术标签:

【中文标题】如何在颤振/飞镖中捕获平台异常?【英文标题】:How to catch platformException in flutter/dart? 【发布时间】:2019-09-28 13:16:20 【问题描述】:

我来了

发生了异常。 PlatformException (PlatformException(sign_in_canceled, com.google.android.gms.common.api.ApiException: 12501: , null))

每当我尝试取消登录时,我的应用中都会弹出 google。

复制步骤:

在应用程序中,当按下使用 google 登录按钮时,会出现 google 登录页面,其中包含所有 gmail 帐户供您选择登录或注册。

触摸弹出窗口的外部区域以取消登录,然后关闭弹出窗口。

之后代码中出现平台异常:

发生了异常。 PlatformException (PlatformException(sign_in_canceled, com.google.android.gms.common.api.ApiException: 12501: , null))

现在登录按钮不起作用,应用程序崩溃,

试过 try/catch - 不工作

【问题讨论】:

请添加显示您在做什么的代码。你在 api 调用中使用 await 吗? 我也有同样的问题 【参考方案1】:
try 
  final res = await _auth.signInWithEmailAndPassword(
      email: email, password: password);
  if (res != null) loggedUser = res.user;
 on PlatformException catch (err) 
  // Handle err
 catch (err) 
  // other types of Exceptions

【讨论】:

包含一些关于代码如何回答问题或解决问题的解释通常很有用。 我的错误是没有打电话给await。如果你没有在 try 中调用 await ,那么在你完成块后错误会出现,因此不会被 oncatch 块捕获。【参考方案2】:

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

【讨论】:

【参考方案3】:

显然,此问题仍未解决,如果您从终端使用 flutter run -d 运行颤振应用程序,则不会发生此问题 不要担心应用程序的发布版本。它不会在发布版本中崩溃或冻结。

【讨论】:

【参考方案4】:

这是捕获平台异常的方法

try 
  //
 on PlatformException catch (e) 
  if (e.code == '???') 
     // 
  
 catch (e) 
  //

【讨论】:

以上是关于如何在颤振/飞镖中捕获平台异常?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在颤振飞镖中渲染脚本标签

如何在飞镖/颤振中设置或删除地图标记

如何在颤振/飞镖的多级下拉菜单中使用此 Json

如何在颤振/飞镖中缓存列表视图构建器?

如何在飞镖/颤振中按日期对列表进行排序/排序?

如何在颤振飞镖中使用相同的元素初始化列表?