在颤动的异步函数中捕获 PlatformException

Posted

技术标签:

【中文标题】在颤动的异步函数中捕获 PlatformException【英文标题】:Catching PlatformException in async function in flutter 【发布时间】:2020-11-15 14:33:30 【问题描述】:

背景

我正在尝试在我的StateinitState() 方法中从Firestore 获取预订文件。 这也是我第一次使用flutter/dart,如果我犯了一个非常菜鸟的错误,请见谅。

问题

当我运行 get() 方法(一个返回 Future<DocumentSnapshot>async 函数)时,会引发错误。我正在尝试捕获并处理此错误。该错误是我打算获得的“权限不足”错误。

我的代码

class _MyHomePageState extends State<MyHomePage> 
  final firestoreInstance = Firestore.instance;
  Future<DocumentSnapshot> _futureBooking;

  @override
  void initState() 
    super.initState();

    try 
      _futureBooking = firestoreInstance
          .collection('bookings')
          .document('1Twgjq5YTe3Oa12wwbs1')
          .get();
     catch (err) 
      print("error fetching from firestore: $err");
    
  

结果

catch 块永远不会进入,并且应用程序在拨打get() 时总是崩溃。

任何帮助将不胜感激!

【问题讨论】:

请使用提供的格式化工具将错误直接复制粘贴到问题中。 还解决了您认为您在initState 中检索Future 是一个错误的想法,这实际上是为FutureBuilder 检索Future 的预期方法(假设您使用它来根据文档显示您检索的内容。许多人不这样做,而是在没有真正了解后果的情况下检索build 中的Future。当然,在某些情况下,这是有意的。 【参考方案1】:

当您不使用 await 时,您无法使用 try-catch 块捕获错误。

要以您希望调用此未来函数的方式捕获错误,请使用Future 类的catchError 方法。 例如。

_futureBooking = firestoreInstance
  .collection('bookings')
  .document('1Twgjq5YTe3Oa12wwbs1')
  .get()
  .catchError(
    (err) 
      print("error fetching from firestore: $err");
    
  );

或者,您仍然可以使用try-catchawait,同时仍然保持您的功能。例如。

Future<DocumentSnapshot> wrapperFunction() async 
  try 
    return await firestoreInstance
      .collection('bookings')
      .document('1Twgjq5YTe3Oa12wwbs1')
      .get();
   catch (err) 
    print("error fetching from firestore: $err");
  


@override
void initState() 
  super.initState();
  _futureBooking = wrapperFunction();

【讨论】:

感谢您,效果很好。事实证明,我的应用程序实际上并没有崩溃,而只是打破了异常......我很傻。由于我使用的是FutureBuilder,因此我完全删除了try / catch,并允许异常将快照hasError 方法设置为true。但是知道如何做到这一点非常有用。再次感谢! (重要)请注意,所有这些捕获平台异常仅适用于“Release Vestion”,它不适用于调试。 @gsm 这是不正确的。无论编译模式如何,都可以捕获所有异常。如果这是您亲身经历的事情,那是由于您的 IDE 中的设置可以捕获所有异常,无论它们是否被捕获。 VS 代码中还有一个错误(可能会或可能不会修复)阻止该设置被禁用。

以上是关于在颤动的异步函数中捕获 PlatformException的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中返回异步函数的值?

颤动异步到同步编程

如何在嵌套异步函数中捕获错误

在 Node/Express 的异步函数中捕获错误

为啥我无法在具有 void 返回类型的异步函数中捕获异常?

如何在构造函数中捕获异步方法的异常?