send abstract method Null safety
- Object? message
Sends an asynchronous message
through this send port, to its
corresponding ReceivePort.
The transitive object graph of message
can contain the following
objects:
- Null
- bool
- int
- double
- String
- List, Map or Set (whose elements are any of these)
- TransferableTypedData
- SendPort
- Capability
- Type representing one of these types, Object, dynamic, void or Never
If the sender and receiver isolate share the same code (e.g. isolates
created via Isolate.spawn), the transitive object graph of message
can
contain any object, with the following exceptions:
- Objects with native resources (subclasses of e.g.
NativeFieldWrapperClass1
). A Socket object for example referrs internally to objects that have native resources attached and can therefore not be sent. - ReceivePort
- DynamicLibrary
- Finalizable
- Finalizer
- NativeFinalizer
- Pointer
- UserTag
MirrorReference
Apart from those exceptions any object can be sent. Objects that are identified as immutable (e.g. strings) will be shared whereas all other objects will be copied.
The send happens immediately and may have a linear time cost to copy the transitive object graph. The send itself doesn't block (i.e. doesn't wait until the receiver has received the message). The corresponding receive port can receive the message as soon as its isolate's event loop is ready to deliver it, independently of what the sending isolate is doing.
Note: Due to an implementation choice the Dart VM made for how closures represent captured state, closures can currently capture more state than they need, which can cause the transitive closure to be larger than needed. Open bug to address this: http://dartbug.com/36983
Implementation
void send(Object? message);