runZoned<R>函数

R runZoned<R>(
  1. R body(
      ),
    1. {Map<Object?, Object?>? zoneValues,
    2. ZoneSpecification? zoneSpecification,
    3. @弃用("请使用runZonedGuarded代替") Function? onError}
    )

    在它自己的分组区域中运行body。

    使用基于zoneSpecification和zoneValues的Zone.fork创建一个新的分组区域,然后在那个区域中运行body并返回结果。

    示例用法

    var secret = "arglebargle"; // Or a random generated string.
    var result = runZoned(
        () async {
          await Future.delayed(Duration(seconds: 5), () {
            print("${Zone.current[#_secret]} glop glyf");
          });
        },
        zoneValues: {#_secret: secret},
        zoneSpecification:
            ZoneSpecification(print: (Zone self, parent, zone, String value) {
          if (value.contains(Zone.current[#_secret] as String)) {
            value = "--censored--";
          }
          parent.print(zone, value);
        }));
    secret = ""; // Erase the evidence.
    await result; // Wait for asynchronous computation to complete.
    

    新分组区域拦截print并存储一个值在私有符号#_secret下。秘密可以在新的Zone对象中找到,它是body的Zone.current,也是print处理函数的第一个参数self。

    如果设置了ZoneSpecification.handleUncaughtError或者提供了弃用的onError回调,创建的分组区域将是一个错误分组区域。异步错误在具有不同Zone.errorZone的分组区域之间不会跨越区域边界。这种行为的一个后果是,在创建的分组区域中完成作为错误的Future看起来似乎永远不会在属于不同错误区域的区域中使用。在无法访问错误的区域中多次尝试使用future将导致错误在它的原始错误区域中再次被报告。

    请使用runZonedGuarded代替使用弃用的onError参数。如果提供了onError,该函数还尝试捕获和处理来自body的同步错误,但如果泛型参数R不是可空类型,则可能抛出错误并返回null。

    实现

    R runZoned<R>(R body(),
        {Map<Object?, Object?>? zoneValues,
        ZoneSpecification? zoneSpecification,
        @Deprecated("Use runZonedGuarded instead") Function? onError}) {
      checkNotNullable(body, "body");
      if (onError != null) {
        // TODO: Remove this when code have been migrated off using [onError].
        if (onError is! void Function(Object, StackTrace)) {
          if (onError is void Function(Object)) {
            var originalOnError = onError;
            onError = (Object error, StackTrace stack) => originalOnError(error);
          } else {
            throw ArgumentError.value(onError, "onError",
                "Must be Function(Object) or Function(Object, StackTrace)");
          }
        }
        return runZonedGuarded(body, onError,
            zoneSpecification: zoneSpecification, zoneValues: zoneValues) as R;
      }
      return _runZoned<R>(body, zoneValues, zoneSpecification);
    }