在颤动的异步函数中捕获 PlatformException
Posted
技术标签:
【中文标题】在颤动的异步函数中捕获 PlatformException【英文标题】:Catching PlatformException in async function in flutter 【发布时间】:2020-11-15 14:33:30 【问题描述】:背景
我正在尝试在我的State
的initState()
方法中从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-catch
和await
,同时仍然保持您的功能。例如。
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的主要内容,如果未能解决你的问题,请参考以下文章