@@ -16,11 +16,30 @@ static void ResizeChannelBuffer(NSObject<FlutterBinaryMessenger>* binaryMessenge
1616 [binaryMessenger sendOnChannel: FlutterChannelBuffersChannel message: message];
1717}
1818
19+ static FlutterBinaryMessengerConnection SetMessageHandler (
20+ NSObject <FlutterBinaryMessenger>* messenger,
21+ NSString * name,
22+ FlutterBinaryMessageHandler handler,
23+ NSObject <FlutterTaskQueue>* taskQueue) {
24+ if (taskQueue) {
25+ NSCAssert ([messenger respondsToSelector: @selector (setMessageHandlerOnChannel:
26+ binaryMessageHandler:taskQueue: )],
27+ @" " );
28+ return [messenger setMessageHandlerOnChannel: name
29+ binaryMessageHandler: handler
30+ taskQueue: taskQueue];
31+ } else {
32+ return [messenger setMessageHandlerOnChannel: name binaryMessageHandler: handler];
33+ }
34+ }
35+
36+ // //////////////////////////////////////////////////////////////////////////////
1937@implementation FlutterBasicMessageChannel {
2038 NSObject <FlutterBinaryMessenger>* _messenger;
2139 NSString * _name;
2240 NSObject <FlutterMessageCodec>* _codec;
2341 FlutterBinaryMessengerConnection _connection;
42+ NSObject <FlutterTaskQueue>* _taskQueue;
2443}
2544+ (instancetype )messageChannelWithName : (NSString *)name
2645 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger {
@@ -40,18 +59,28 @@ + (instancetype)messageChannelWithName:(NSString*)name
4059- (instancetype )initWithName : (NSString *)name
4160 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
4261 codec : (NSObject <FlutterMessageCodec>*)codec {
62+ self = [self initWithName: name binaryMessenger: messenger codec: codec taskQueue: nil ];
63+ return self;
64+ }
65+
66+ - (instancetype )initWithName : (NSString *)name
67+ binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
68+ codec : (NSObject <FlutterMessageCodec>*)codec
69+ taskQueue : (NSObject <FlutterTaskQueue>*)taskQueue {
4370 self = [super init ];
4471 NSAssert (self, @" Super init cannot be nil" );
4572 _name = [name retain ];
4673 _messenger = [messenger retain ];
4774 _codec = [codec retain ];
75+ _taskQueue = [taskQueue retain ];
4876 return self;
4977}
5078
5179- (void )dealloc {
5280 [_name release ];
5381 [_messenger release ];
5482 [_codec release ];
83+ [_taskQueue release ];
5584 [super dealloc ];
5685}
5786
@@ -85,7 +114,7 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler {
85114 callback ([codec encode: reply]);
86115 });
87116 };
88- _connection = [ _messenger setMessageHandlerOnChannel: _name binaryMessageHandler: messageHandler] ;
117+ _connection = SetMessageHandler ( _messenger, _name, messageHandler, _taskQueue) ;
89118}
90119
91120- (void )resizeChannelBuffer : (NSInteger )newSize {
@@ -96,6 +125,7 @@ - (void)resizeChannelBuffer:(NSInteger)newSize {
96125
97126#pragma mark - Method channel
98127
128+ // //////////////////////////////////////////////////////////////////////////////
99129@implementation FlutterError
100130+ (instancetype )errorWithCode : (NSString *)code message : (NSString *)message details : (id )details {
101131 return [[[FlutterError alloc ] initWithCode: code message: message details: details] autorelease ];
@@ -136,6 +166,7 @@ - (NSUInteger)hash {
136166}
137167@end
138168
169+ // //////////////////////////////////////////////////////////////////////////////
139170@implementation FlutterMethodCall
140171+ (instancetype )methodCallWithMethodName : (NSString *)method arguments : (id )arguments {
141172 return [[[FlutterMethodCall alloc ] initWithMethodName: method arguments: arguments] autorelease ];
@@ -175,11 +206,13 @@ - (NSUInteger)hash {
175206
176207NSObject const * FlutterMethodNotImplemented = [[NSObject alloc ] init ];
177208
209+ // //////////////////////////////////////////////////////////////////////////////
178210@implementation FlutterMethodChannel {
179211 NSObject <FlutterBinaryMessenger>* _messenger;
180212 NSString * _name;
181213 NSObject <FlutterMethodCodec>* _codec;
182214 FlutterBinaryMessengerConnection _connection;
215+ NSObject <FlutterTaskQueue>* _taskQueue;
183216}
184217
185218+ (instancetype )methodChannelWithName : (NSString *)name
@@ -198,18 +231,27 @@ + (instancetype)methodChannelWithName:(NSString*)name
198231- (instancetype )initWithName : (NSString *)name
199232 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
200233 codec : (NSObject <FlutterMethodCodec>*)codec {
234+ self = [self initWithName: name binaryMessenger: messenger codec: codec taskQueue: nil ];
235+ return self;
236+ }
237+ - (instancetype )initWithName : (NSString *)name
238+ binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
239+ codec : (NSObject <FlutterMethodCodec>*)codec
240+ taskQueue : (NSObject <FlutterTaskQueue>*)taskQueue {
201241 self = [super init ];
202242 NSAssert (self, @" Super init cannot be nil" );
203243 _name = [name retain ];
204244 _messenger = [messenger retain ];
205245 _codec = [codec retain ];
246+ _taskQueue = [taskQueue retain ];
206247 return self;
207248}
208249
209250- (void )dealloc {
210251 [_name release ];
211252 [_messenger release ];
212253 [_codec release ];
254+ [_taskQueue release ];
213255 [super dealloc ];
214256}
215257
@@ -256,7 +298,7 @@ - (void)setMethodCallHandler:(FlutterMethodCallHandler)handler {
256298 }
257299 });
258300 };
259- _connection = [ _messenger setMessageHandlerOnChannel: _name binaryMessageHandler: messageHandler] ;
301+ _connection = SetMessageHandler ( _messenger, _name, messageHandler, _taskQueue) ;
260302}
261303
262304- (void )resizeChannelBuffer : (NSInteger )newSize {
@@ -269,10 +311,13 @@ - (void)resizeChannelBuffer:(NSInteger)newSize {
269311
270312NSObject const * FlutterEndOfEventStream = [[NSObject alloc ] init ];
271313
314+ // //////////////////////////////////////////////////////////////////////////////
272315@implementation FlutterEventChannel {
273316 NSObject <FlutterBinaryMessenger>* _messenger;
274317 NSString * _name;
275318 NSObject <FlutterMethodCodec>* _codec;
319+ NSObject <FlutterTaskQueue>* _taskQueue;
320+ FlutterBinaryMessengerConnection _connection;
276321}
277322+ (instancetype )eventChannelWithName : (NSString *)name
278323 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger {
@@ -290,25 +335,36 @@ + (instancetype)eventChannelWithName:(NSString*)name
290335- (instancetype )initWithName : (NSString *)name
291336 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
292337 codec : (NSObject <FlutterMethodCodec>*)codec {
338+ return [self initWithName: name binaryMessenger: messenger codec: codec taskQueue: nil ];
339+ }
340+
341+ - (instancetype )initWithName : (NSString *)name
342+ binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
343+ codec : (NSObject <FlutterMethodCodec>*)codec
344+ taskQueue : (NSObject <FlutterTaskQueue>* _Nullable)taskQueue {
293345 self = [super init ];
294346 NSAssert (self, @" Super init cannot be nil" );
295347 _name = [name retain ];
296348 _messenger = [messenger retain ];
297349 _codec = [codec retain ];
350+ _taskQueue = [taskQueue retain ];
298351 return self;
299352}
300353
301354- (void )dealloc {
302355 [_name release ];
303356 [_codec release ];
304357 [_messenger release ];
358+ [_taskQueue release ];
305359 [super dealloc ];
306360}
307361
308- static void SetStreamHandlerMessageHandlerOnChannel (NSObject <FlutterStreamHandler>* handler,
309- NSString * name,
310- NSObject <FlutterBinaryMessenger>* messenger,
311- NSObject <FlutterMethodCodec>* codec) {
362+ static FlutterBinaryMessengerConnection SetStreamHandlerMessageHandlerOnChannel (
363+ NSObject <FlutterStreamHandler>* handler,
364+ NSString * name,
365+ NSObject <FlutterBinaryMessenger>* messenger,
366+ NSObject <FlutterMethodCodec>* codec,
367+ NSObject <FlutterTaskQueue>* taskQueue) {
312368 __block FlutterEventSink currentSink = nil ;
313369 FlutterBinaryMessageHandler messageHandler = ^(NSData * message, FlutterBinaryReply callback) {
314370 FlutterMethodCall* call = [codec decodeMethodCall: message];
@@ -354,14 +410,16 @@ static void SetStreamHandlerMessageHandlerOnChannel(NSObject<FlutterStreamHandle
354410 callback (nil );
355411 }
356412 };
357- [ messenger setMessageHandlerOnChannel: name binaryMessageHandler: messageHandler] ;
413+ return SetMessageHandler ( messenger, name, messageHandler, taskQueue) ;
358414}
359415
360416- (void )setStreamHandler : (NSObject <FlutterStreamHandler>*)handler {
361417 if (!handler) {
362- [_messenger setMessageHandlerOnChannel: _name binaryMessageHandler: nil ];
418+ [_messenger cleanUpConnection: _connection];
419+ _connection = 0 ;
363420 return ;
364421 }
365- SetStreamHandlerMessageHandlerOnChannel (handler, _name, _messenger, _codec);
422+ _connection =
423+ SetStreamHandlerMessageHandlerOnChannel (handler, _name, _messenger, _codec, _taskQueue);
366424}
367425@end
0 commit comments