@@ -16,16 +16,20 @@ abstract class PortClient {
1616}
1717
1818class ParentPortClient implements PortClient {
19- late Future <SendPort > sendPort;
19+ late Future <SendPort > sendPortFuture;
20+ SendPort ? sendPort;
2021 ReceivePort receivePort = ReceivePort ();
2122 bool closed = false ;
2223 int _nextId = 1 ;
2324
2425 Map <int , Completer <Object ?>> handlers = HashMap ();
2526
2627 ParentPortClient () {
27- final initCompleter = Completer <SendPort >();
28- sendPort = initCompleter.future;
28+ final initCompleter = Completer <SendPort >.sync ();
29+ sendPortFuture = initCompleter.future;
30+ sendPortFuture.then ((value) {
31+ sendPort = value;
32+ });
2933 receivePort.listen ((message) {
3034 if (message is _InitMessage ) {
3135 assert (! initCompleter.isCompleted);
@@ -56,7 +60,7 @@ class ParentPortClient implements PortClient {
5660 }
5761
5862 Future <void > get ready async {
59- await sendPort ;
63+ await sendPortFuture ;
6064 }
6165
6266 void _cancelAll (Object error) {
@@ -72,10 +76,11 @@ class ParentPortClient implements PortClient {
7276 if (closed) {
7377 throw ClosedException ();
7478 }
75- var completer = Completer <T >();
79+ var completer = Completer <T >. sync ();
7680 var id = _nextId++ ;
7781 handlers[id] = completer;
78- (await sendPort).send (_RequestMessage (id, message, receivePort.sendPort));
82+ final port = sendPort ?? await sendPortFuture;
83+ port.send (_RequestMessage (id, message, null ));
7984 return await completer.future;
8085 }
8186
@@ -84,7 +89,8 @@ class ParentPortClient implements PortClient {
8489 if (closed) {
8590 throw ClosedException ();
8691 }
87- (await sendPort).send (_FireMessage (message));
92+ final port = sendPort ?? await sendPortFuture;
93+ port.send (_FireMessage (message));
8894 }
8995
9096 RequestPortServer server () {
@@ -138,7 +144,7 @@ class ChildPortClient implements PortClient {
138144
139145 @override
140146 Future <T > post <T >(Object message) async {
141- var completer = Completer <T >();
147+ var completer = Completer <T >. sync ();
142148 var id = _nextId++ ;
143149 handlers[id] = completer;
144150 sendPort.send (_RequestMessage (id, message, receivePort.sendPort));
@@ -177,12 +183,13 @@ class RequestPortServer {
177183class PortServer {
178184 final ReceivePort _receivePort = ReceivePort ();
179185 final Future <Object ?> Function (Object ? message) handle;
186+ final SendPort ? replyPort;
180187
181- PortServer (this .handle) {
188+ PortServer (this .handle) : replyPort = null {
182189 _init ();
183190 }
184191
185- PortServer .forSendPort (SendPort port, this .handle) {
192+ PortServer .forSendPort (SendPort port, this .handle) : replyPort = port {
186193 port.send (_InitMessage (_receivePort.sendPort));
187194 _init ();
188195 }
@@ -208,11 +215,12 @@ class PortServer {
208215 // Fire and forget
209216 handle (request.message);
210217 } else {
218+ final replyPort = request.reply ?? this .replyPort;
211219 try {
212220 var result = await handle (request.message);
213- request.reply .send (_PortChannelResult .success (request.id, result));
221+ replyPort ! .send (_PortChannelResult .success (request.id, result));
214222 } catch (e, stacktrace) {
215- request.reply
223+ replyPort !
216224 .send (_PortChannelResult .error (request.id, e, stacktrace));
217225 }
218226 }
@@ -238,7 +246,7 @@ class _FireMessage {
238246class _RequestMessage {
239247 final int id;
240248 final Object message;
241- final SendPort reply;
249+ final SendPort ? reply;
242250
243251 _RequestMessage (this .id, this .message, this .reply);
244252}
0 commit comments