spawn<T> 静态方法

Future<Isolate> spawn<T>(
  1. void entryPoint(
    1. T message
    ),
  2. T message,
  3. {bool paused = false,
  4. bool errorsAreFatal = true,
  5. SendPort? onExit,
  6. SendPort? onError,
  7. @Since("2.3") String? debugName}
)

创建并启动一个隔离,它与当前隔离共享相同的代码。

参数 entryPoint 指定在启动的隔离中调用的初始函数。入口点函数将使用 message 作为唯一的参数在新的隔离中调用。

entryPoint 函数必须能够用单个参数调用,即至少有一个位置参数且最多有一个必需位置参数的函数。该函数可以接受任意数量的可选参数,只要它能用单个参数来调用。如果 entryPoint 是闭包,那么由于 Dart 实现的限制,它可能会向隔离发送意外的状态。这可能会导致性能问题、内存使用增加(参见 http://dartbug.com/36983)或,如果状态中包含无法在不同隔离之间共享的对象,则可能导致运行时失败。参见 run 的示例。

message 必须可以在隔离之间传输。无法传输的对象包括打开的文件和套接字(有关详细信息,请参阅 SendPort.send)。通常初始 message 包含一个 SendPort,以便启动器和Spawnee 可以相互通信。

如果将 paused 参数设置为 true,则隔离将以暂停状态启动,在调用带有 messageentryPoint 函数之前,就像通过调用 isolate.pause(isolate.pauseCapability) 的初始调用一样。要继续执行隔离,请调用 isolate.resume(isolate.pauseCapability)

如果提供了 errorsAreFatalonExit 和/或 onError 参数,则隔离将分别像调用 setErrorsFataladdOnExitListeneraddErrorListener 一样,使用相应的参数,并在隔离开始运行之前进行处理。

如果提供了 debugName,则通过此名称在调试器和日志中可以识别启动的 Isolate

如果省略了 errorsAreFatal,则平台可以选择默认行为或继承当前隔离的行为。

您还可以在返回的隔离上调用 setErrorsFataladdOnExitListeneraddErrorListener 方法,但是在隔离以 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});