1分钟
05 Zone
那么 Zone
又是什么?它是哪里来的?
在上一篇章中说过,因为 Dart 中 Future
之类的异步操作是无法被当前代码 try/cacth
的,而在 Dart 中你可以给执行对象指定一个 Zone
,类似提供一个沙箱环境 ,而在这个沙箱内,你就可以全部可以捕获、拦截或修改一些代码行为,比如所有未被处理的异常。
那么项目中默认的 Zone
是怎么来的?在 Flutter 中,Dart 中的 Zone
启动是在 _runMainZoned
方法 ,如下代码所示 _runMainZoned
的 @pragma("vm:entry-point")
注解表示该方式是给 Engine 调用的,到这里我们知道了 Zone
是怎么来的了。
///Dart 中
@pragma('vm:entry-point')
// ignore: unused_element
void _runMainZoned(Function startMainIsolateFunction, Function userMainFunction) {
startMainIsolateFunction((){
runZoned<Future<void>>(····);
}, null);
}
///C++ 中
if (tonic::LogIfError(tonic::DartInvokeField(
Dart_LookupLibrary(tonic::ToDart("dart:ui")), "_runMainZoned",
{start_main_isolate_function, user_entrypoint_function}))) {
FML_LOG(ERROR) << "Could not invoke the main entrypoint.";
return false;
}
那么 zone.runUnaryGuarded
的作用是什么?相较于 scheduleMicrotask
的异步操作,官方的解释是:在此区域中使用参数执行给定操作并捕获同步错误。 类似的还有 runUnary
、 runBinaryGuarded
等,所以我们知道前面提到的 zone.runUnaryGuarded
就是 Flutter 在运行的这个 zone 里执行已经注册的 _onData
,并捕获异常。
学员评价