MethodChannel:用於双向的方法呼叫,包括呼叫另一端的方法、响应另一端的呼叫,流程与 BasicMessageChannel
类似,只是资料转换上略有不同,呼叫另一端的方法使用invokeMethod
函式,setMethodCallHandler
用於注册一个MessageHandler
来供 Native 端呼叫
Future<T> invokeMethod<T>(String method, [ dynamic arguments ]) async {
assert(method != null);
final ByteData result = await binaryMessenger.send(
name,
codec.encodeMethodCall(MethodCall(method, arguments)),
);
if (result == null) {
throw MissingPluginException('No implementation found for method $method on channel $name');
}
final T typedResult = codec.decodeEnvelope(result);
return typedResult;
}
invokeMethod
有两个引数,方法名和方法要代入的引数,在 MethodCannel
中这两个引数会被封装成 MethodCall
物件,然後利用对应的 MethodCodec
将 MethodCall
编码成 ByteData 传递到 binaryMessenger
,并得到 ByteData 型别的返回值,後面再利用 MethodCodec
将其解码成泛型 T 类型资料
MethodCodec
相对於MessageCode
多了两个函式,分别用於编解码MethodCall
和编解码方法呼叫的返回值
setMethodCallHandler
用於向 binaryMessenger 用於注册一个MessageHandler
来供 Native 端呼叫
void setMethodCallHandler(Future<dynamic> handler(MethodCall call)) {
binaryMessenger.setMessageHandler(
name,
handler == null ? null : (ByteData message) => _handleAsMethodCall(message, handler),
);
}
Future<ByteData> _handleAsMethodCall(ByteData message, Future<dynamic> handler(MethodCall call)) async {
final MethodCall call = codec.decodeMethodCall(message);
try {
return codec.encodeSuccessEnvelope(await handler(call));
} on PlatformException catch (e) {
return codec.encodeErrorEnvelope(
code: e.code,
message: e.message,
details: e.details,
);
} on MissingPluginException {
return null;
} catch (e) {
return codec.encodeErrorEnvelope(code: 'error', message: e.toString(), details: null);
}
}
它会将 handler 封装到 callback 函式中,在 _handleAsMethodCall
中进行协调,也就是先把 message 转成 MethodCall
物件之後,再交给 handler 处理,处理完的结果再由 codec 转成 ByteData 并返回,接着 binaryMessenger 再拿着这个资料回传到 Native 端
<<: Day10 SwiftUI 03 - SwiftUI 数据流
这也是很多输家最爱用的手段之一,进场时说是「成长型」投资,被套牢了,改口说是「价值型」投资,你真的懂...
一场全球大流行的 COVID-19 疫情,以及 H264、H265、VP8、VP9等影音压缩技术加...
前言 不知道读者们在实作长条图工作表的时候,心里有没有冒出一些疑惑。「为什麽放在 Rows 的栏位显...
今天进度藉由 Crontab.guru - The cron schedule expression...
Azure machine learning: deploy service and inferen...