当我尝试为
ZoneSpecification
实现分叉覆盖时,如下所示:
runZoned(
() {
runZoned(() {
print('in zone');
});
},
zoneSpecification: ZoneSpecification(
fork: (self, parent, zone, specification, zoneValues) {
print('forked!');
return zone.fork(specification: specification, zoneValues: zoneValues);
},
),
);
我只明白这个:
分叉了! (x7990)
分叉!
未处理的异常:
堆栈溢出
#0 _print (dart:_builtin:29:1)
...
#7993 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
在代码中我读到只有 RootZone 包含输入区域,所以我不知道如何完成任务。
在处理程序
zone.fork
中对 fork
的调用和嵌套的 runZoned
似乎会导致循环并最终导致堆栈溢出。
下面的示例使用 ZoneDelegate
parent
创建分叉并添加一些 zoneValues
只是为了帮助识别区域:
import 'dart:async';
int id = 0;
void main(List<String> args) {
runZoned(
() {
runZoned(
() {
print(' -> Now in zone: ${Zone.current[#id]}');
print(' parent zone: ${Zone.current.parent![#id]}');
},
zoneValues: {#id: ++id},
);
},
zoneValues: {#id: ++id},
zoneSpecification: ZoneSpecification(fork: (
self,
parent,
zone,
specification,
zoneValues,
) {
print('Forking zone with id: ${zone[#id]}');
return parent
.fork(zone, specification, {#id: (zoneValues![#id] as int) + 100});
}));
}
控制台输出如下:
$ dart zone_example.dart
Forking zone with id: 1
-> Now in zone: 102
parent zone: 1