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