send 抽象方法
- Object? message
通过此发送端口异步 message
,发送到其对应的 ReceivePort。
如果发送和接收的isolate不共享相同的代码(使用 Isolate.spawnUri 创建的isolate不共享其父isolate的代码),则message
的传递对象图只能包含以下类型的对象
null
true
和false
- int、double、String 实例
- 通过列表、映射和集合字面量创建的实例
- 通过以下构造函数创建的实例
- SendPort 实例,来自 ReceivePort.sendPort 或 RawReceivePort.sendPort,其中接收端口是使用那些类的构造函数创建的。
- 代表前述类型的 Type 实例,例如
Object
、dynamic
、void
和Never
以及所有这些类型的可空变体。对于泛型类型,类型参数必须是可发送类型,整个类型才能发送。
如果发送者和接收者的isolate共享相同的代码(例如,通过 Isolate.spawn 创建的isolate),则message
的传递对象图可以包含任何对象,但有以下例外
- 具有本地资源的对象(例如
NativeFieldWrapperClass1
的子类)。例如,Socket 对象内部引用具有本地资源的对象,因此不能发送。 - ReceivePort
- DynamicLibrary
- Finalizable
- Finalizer
- NativeFinalizer
- Pointer
- UserTag
MirrorReference
带 @pragma('vm:isolate-unsendable')
标记的类、扩展或实现此类类的实例无法通过端口发送。
除了这些例外,任何对象都可以发送。被识别为不可变的对象(例如字符串)将被共享,而所有其他对象将被复制。
发送是立即发生的,可能具有复制传递对象图的线性时间成本。发送本身不阻塞(即不等待接收者接收到消息)。对应的接收端口可以在其isolate的事件循环准备好传递消息时接收消息,而不考虑发送者isolate正在进行什么操作。
注意:由于Dart VM在如何表示捕获的闭包状态方面的实现选择,闭包目前可以捕获比所需更多的状态,这可能导致传递闭包比所需更大。有关此问题的bug,请查阅:http://dartbug.com/36983
实现
void send(Object? message);