官方推薦插件輔助工具 - pigeon
參考文章:Flutter學(xué)習(xí)-Channel詳解
一劳淆、通道channel分類
1、BasicMessageChannel
用于支持MessageCodec
編解碼器的類型消息的異步傳遞通道劫谅。
2谦屑、MethodChannel
用于支持MethodCodec
編解碼器的方法的異步調(diào)用通道谤碳。
3、OptionalMethodChannel
在MethodChannel
基礎(chǔ)上,支持了當(dāng)invokeMethod
沒有找到平臺插件時染簇,不會拋出異常而返回null
。
4强岸、EventChannel
用于事件流的傳遞锻弓,但是事件值必須支持MethodCodec
編解碼器。
二蝌箍、通道channel
結(jié)構(gòu)
1青灼、結(jié)構(gòu)
每個channel
都有3個參數(shù):name
、MessageCodec
/MethodCodec
妓盲、BinaryMessenger
name
:用通道名稱來標(biāo)識通道的唯一杂拨。
MessageCodec
/MethodCodec
:通道數(shù)據(jù)的編解碼器。
BinaryMessenger
:二進(jìn)制消息數(shù)據(jù)的發(fā)送和接收信使悯衬。
2弹沽、BinaryMessenger
信使
Flutter中定義為抽象類abstract class BinaryMessenger
,其中定義了幾個接口:
Future<void> handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback);
Future<ByteData?> send(String channel, ByteData? message);
void setMessageHandler(String channel, MessageHandler? handler);
bool checkMessageHandler(String channel, MessageHandler? handler);
void setMockMessageHandler(String channel, MessageHandler? handler);
bool checkMockMessageHandler(String channel, MessageHandler? handler);
iOS
中則對應(yīng)為:
@protocol FlutterBinaryMessenger <NSObject>
/**
* Sends a binary message to the Flutter side on the specified channel, expecting
* no reply.
*
* @param channel The channel name.
* @param message The message.
*/
- (void)sendOnChannel:(NSString*)channel message:(NSData* _Nullable)message;
/**
* Sends a binary message to the Flutter side on the specified channel, expecting
* an asynchronous reply.
*
* @param channel The channel name.
* @param message The message.
* @param callback A callback for receiving a reply.
*/
- (void)sendOnChannel:(NSString*)channel
message:(NSData* _Nullable)message
binaryReply:(FlutterBinaryReply _Nullable)callback;
/**
* Registers a message handler for incoming binary messages from the Flutter side
* on the specified channel.
*
* Replaces any existing handler. Use a `nil` handler for unregistering the
* existing handler.
*
* @param channel The channel name.
* @param handler The message handler.
* @return An identifier that represents the connection that was just created to the channel.
*/
- (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channel
binaryMessageHandler:
(FlutterBinaryMessageHandler _Nullable)handler;
/**
* Clears out a channel's message handler if that handler is still the one that
* was created as a result of
* `setMessageHandlerOnChannel:binaryMessageHandler:`.
*
* @param connection The result from `setMessageHandlerOnChannel:binaryMessageHandler:`.
*/
- (void)cleanupConnection:(FlutterBinaryMessengerConnection)connection;
@end
在iOS
端筋粗,binaryMessenger
為FlutterViewController
的一個屬性策橘,通過繼承來獲取binaryMessenger
。
具體在創(chuàng)建channel的時候使用:
let aliPayMethodChannel = FlutterMethodChannel(name: "aliPay", binaryMessenger: binaryMessenger)
三亏狰、數(shù)據(jù)類型對應(yīng)
Flutter
役纹、Android
、iOS
各個平臺數(shù)據(jù)類型對應(yīng)關(guān)系如下:
在進(jìn)行數(shù)據(jù)傳遞的時候暇唾,通過轉(zhuǎn)為字節(jié)byte
進(jìn)行轉(zhuǎn)換促脉。
四、消息的編碼解碼器
1策州、 MessageCodec
包括:BinaryCodec
瘸味、StringCodec
、JSONMessageCodec
够挂、StandardMessageCodec
// 直接使用二進(jìn)制數(shù)據(jù)
class BinaryCodec implements MessageCodec<ByteData?>
// 字符串與二進(jìn)制數(shù)據(jù)之間的轉(zhuǎn)換
class StringCodec implements MessageCodec<String?>
// utf8編碼的json數(shù)據(jù)與二進(jìn)制數(shù)據(jù)的轉(zhuǎn)換 - 用于大部分場景
class JSONMessageCodec implements MessageCodec<dynamic>
class StandardMessageCodec implements MessageCodec<dynamic>
2旁仿、 MethodCodec
包括:JSONMethodCodec
、StandardMethodCodec
class JSONMethodCodec implements MethodCodec
class StandardMethodCodec implements MethodCodec
五、給channel
設(shè)置回調(diào)Handler
每一種channel
對應(yīng)一種回調(diào)枯冈,包含有以下3種:
typedef void (^FlutterMessageHandler)(id _Nullable message, FlutterReply callback);
typedef void (^FlutterMethodCallHandler)(FlutterMethodCall* call, FlutterResult result);
@protocol FlutterStreamHandler
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
eventSink:(FlutterEventSink)events;
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments;
@end
六毅贮、線程
Flutter
中的線程
共有4個線程:
1、Platform thread
(平臺線程):plugin
的代碼運行在這里尘奏,對應(yīng)安卓和iOS
的main
主線程
2滩褥、UI thread
(UI
線程):執(zhí)行Dart
代碼的線程,包括項目代碼和Flutter
框架的代碼炫加。UI
線程會生成一個圖層樹瑰煎,發(fā)送到GPU
線程渲染到設(shè)備。
3俗孝、Raster thread
(光柵線程):拿到圖層樹后酒甸,交給GPU
渲染處理。
4赋铝、I/O
線程:執(zhí)行I/O
輸入和輸出操作插勤。
由此可知,channel
在原生側(cè)運行在Platform thread
(平臺線程)里柬甥,即原生的主線程里饮六。