Day10 Platform Channel - MethodChannel

MethodChannel

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物件,然後利用对应的 MethodCodecMethodCall 编码成 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 数据流

>>:  全端入门Day25_後端程序撰写之Python

摊平摊平,愈摊愈平

这也是很多输家最爱用的手段之一,进场时说是「成长型」投资,被套牢了,改口说是「价值型」投资,你真的懂...

Day02 WebRTC 简介

一场全球大流行的 COVID-19 疫情,以及 H264、H265、VP8、VP9等影音压缩技术加...

[Day13] Tableau 轻松学 - Rows 与 Columns

前言 不知道读者们在实作长条图工作表的时候,心里有没有冒出一些疑惑。「为什麽放在 Rows 的栏位显...

第49天-学习 crontab 工作排程 Part 2 - 认真学 crontab 表达式

今天进度藉由 Crontab.guru - The cron schedule expression...