Flutter与原生通讯的三种方式的异同

通讯方式

MethodChannel ) 这是 Flutter 与原生平台通信的主要方式。,让 Flutter 端的 Dart 代码可以调用原生平台的代码,原生平台的代码也可以调用Flutter的方法

BasicMessageChannel 信息通道 向原生平台传递各种类型的数据,从原生平台接收各种类型的数据

EventChannel 事件通道 (Event Channel) 事件通道允许原生平台向 Flutter 发送数据流。Flutter 端可以监听这个数据流并获取原生端发送的数据

异同

  1. 全局定义唯一的 Name 与原生平台对应。
  2. 使用codec编码解码器对要传递的信息进行编码解码
  3. binaryMessenger 实现消息的传递和接收

例:在 BasicMessageChannel send方法中codec.encodeMessage将要发送的数据进行编码传入binaryMessenger#send中 , codec.decodeMessage 用来解码 binaryMessenger#send 方法返回的值。

dart 复制代码
// BasicMessageChannel<T>

Future<T?> send(T message) async {
  return codec.decodeMessage(await binaryMessenger.send(name, codec.encodeMessage(message)));
}

  1. codec 不一样
  2. binaryMessenger 不一样

BasicMessageChannel

BasicMessageChannel 使用的 codec 类型是抽象类 MessageCodec类编码解码器 ,主要针对 String,double,int 等一些基础类型的数据进行编码解码。 在Flutter中有MessageCodec的四个实现类,分别对应不同情况下的数据解码编码的使用。

JSONMessageCodec

StandardMessageCodec

StringCodec

BinaryCodec

MethodChannel

MethodChannel 使用的 codec 类型是抽象类MethodCodec类编码解码器,在Flutter中有MethodCodec的两个实现类

StandardMethodCodec

JSONMethodCodec

MethodChannelcodec 默认为 StandardMethodCodec

MethodChannel#_invokeMethod 方法中

EventChannel

EventChannelMethodChannel 一样默认使用的是 StandardMethodCodec

EventChannel #receiveBroadcastStream 方法中

EventChannel的 本质是通过 MethodChannel#invokeMethod(方法通道调用listen ,通过setMessageHandler 监听回调把内容通过StreamController #添加返回一个Stream),完成原生单向向Flutter传递信息

BinaryMessenger

BinaryMessenger 是一个信使抽象类

在原生通讯的三种方式 用了 BinaryMessenger的三个实现类

_DefaultBinaryMessenger

_ProfiledBinaryMessenger

BackgroundIsolateBinaryMessenger

在 EventChannel的类中会通过 _findBinaryMessenger方法来为 _binaryMessenger 赋值 ,不是web平台会使用

BackgroundIsolateBinaryMessenger 作为信使 否则使用 _DefaultBinaryMessenger

javascript 复制代码
BinaryMessenger _findBinaryMessenger() {
  return !kIsWeb && ServicesBinding.rootIsolateToken == null
      ? BackgroundIsolateBinaryMessenger.instance
      : ServicesBinding.instance.defaultBinaryMessenger;
}

MethodChannelBasicMessageChannel 中 会在 _findBinaryMessenger方法得到一个BinaryMessenger

shouldProfilePlatformChannels 的判断来返回不同类型的 BinaryMessenger

_ProfiledBinaryMessenger 本质是不干活的 他功能的完成是通过传入的 BinaryMessenger 通过代理完成功能的实现。

BackgroundIsolateBinaryMessenger 类和 _DefaultBinaryMessenger类 都是一个单例 ,主要实现不同平台 BinaryMessenger (信使)的 send方法和 setMessageHandler 方法

根据平台的不同使用不同的 BinaryMessenger 单例模式保证全局只有一个实例,符合通道的唯一性的需求。

相关推荐
Gorit2 小时前
使用 AI + Flutter-OH 开发 HarmonyOS 应用
人工智能·flutter·harmonyos
啥都想学点2 小时前
从 Flutter 前端到 Spring Boot 后端:2026 年技术栈落地路线图(实战版)
前端·spring boot·flutter
西西学代码14 小时前
Flutter---回调函数
开发语言·javascript·flutter
圣光SG15 小时前
Vue.js 从入门到精通:技术成长之路
flutter
恋猫de小郭1 天前
Swift 6.3 正式发布支持 Android ,它能在跨平台发挥什么优势?
android·前端·flutter
i-阿松!1 天前
PCB板子+ flutter前端 + go后端
物联网·flutter·pcb工艺·go1.19
恋猫de小郭1 天前
Flutter 3.41.6 版本很重要,你大概率需要更新一下
android·前端·flutter
亚历克斯神2 天前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态2 天前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏2 天前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony