spawn<T> 静态方法
创建并启动一个隔离,它与当前隔离共享相同的代码。
参数 entryPoint
指定在启动的隔离中调用的初始函数。入口点函数将使用 message
作为唯一的参数在新的隔离中调用。
entryPoint
函数必须能够用单个参数调用,即至少有一个位置参数且最多有一个必需位置参数的函数。该函数可以接受任意数量的可选参数,只要它能用单个参数来调用。如果 entryPoint
是闭包,那么由于 Dart 实现的限制,它可能会向隔离发送意外的状态。这可能会导致性能问题、内存使用增加(参见 http://dartbug.com/36983)或,如果状态中包含无法在不同隔离之间共享的对象,则可能导致运行时失败。参见 run 的示例。
message
必须可以在隔离之间传输。无法传输的对象包括打开的文件和套接字(有关详细信息,请参阅 SendPort.send)。通常初始 message
包含一个 SendPort,以便启动器和Spawnee 可以相互通信。
如果将 paused
参数设置为 true
,则隔离将以暂停状态启动,在调用带有 message
的 entryPoint
函数之前,就像通过调用 isolate.pause(isolate.pauseCapability)
的初始调用一样。要继续执行隔离,请调用 isolate.resume(isolate.pauseCapability)
。
如果提供了 errorsAreFatal
、onExit
和/或 onError
参数,则隔离将分别像调用 setErrorsFatal、addOnExitListener 和 addErrorListener 一样,使用相应的参数,并在隔离开始运行之前进行处理。
如果提供了 debugName
,则通过此名称在调试器和日志中可以识别启动的 Isolate
。
如果省略了 errorsAreFatal
,则平台可以选择默认行为或继承当前隔离的行为。
您还可以在返回的隔离上调用 setErrorsFatal、addOnExitListener 和 addErrorListener 方法,但是在隔离以 paused
启动之前,它可能已经终止,这些方法无法完成。
返回一个未来实例,如果启动成功将完成一个 Isolate
实例,否则将完成错误。
可以预期隔离的基本内存开销在 30 kb 左右。
实现
external static Future<Isolate> spawn<T>(
void entryPoint(T message), T message,
{bool paused = false,
bool errorsAreFatal = true,
SendPort? onExit,
SendPort? onError,
@Since("2.3") String? debugName});