网易首页 > 网易号 > 正文 申请入驻

Flutter Platform Channel深度解析

0
分享至

一、简介

Platform Channel 是 Flutter 端与 Platform 端制定的通信机制,由官方提供用于 Dart 和平台之间的相互通信。

分为以下 3 种

(1)BaseMessageChannel :用于传递字符串和半结构化的信息(在大内存数据块传递的情况下使用)

(2)MethodChannel:用于传递方法调用(Method Invocation)

(3)EventChannel: 用于数据流(Event Streams)的通信

二、消息传递与编码器

Flutter 的消息传递工具是 BinaryMessager ,通过它与 Platform 建立起通信关系,消息以二进制的格式进行传递。

如图所示 BinaryMessager 的传递需要经过 BinaryMessageHandler,BinaryMessagerHandler 是以 Channel Name 作为键值生成出来再被注册到 BinaryMessager 上的,BinaryMessageHandler 和 BinaryMessager 是一一对应的,二进制格式的消息通过消息编码器(Codec)解码为可识别的信息,并传递给 Handler 进行处理。Handler 处理完后,会把结果编码为二进制格式,再通过回调函数返回结果并发送回 Flutter 端。

1.编码器分类

(1)MessageCodec:BinaryCodec、StringCodec、JSONMessageCodec、StandardMessageCodec

(2)MethodCodec:JSONMethodCodec、StandardMessageCodec

经过消息编码器处理后,消息就可以被 Handler 进行处理了。

2.消息编码过程

Android 端的返回值是 java.lang.Integer 类型的,而 iOS 端返回值则是一个 NSNumber 类型的(通过 NSNumber numberWithInt:获取)。而到了 Flutter 端时,这个返回值自动“变成 ”了 Dart 语言的 Int 类型。

standard platform channels 使用 standard messsage codec 对 message 和 response 进行序列化和反序列化,message与 response 可以是 booleans, numbers, Strings, byte buffers,List, Maps 等等,而序列化后得到的则是二进制格式的数据。

Flutter 默认的消息编码器是 StandardMessageCodec ,支持的数据类型如下:

三、MethodChannel

MethodChannel 是 Flutter 与 Platform 之间传递信息的一种,其传递过程是:BinaryMessager > BinaryMessagerHandler > MethodChannel。

如上图:Native 端(iOS 和 Android)为宿主端(host),Flutter 则是客户端(client),Flutter 调用 Native 方法时,需要传递的信息是通过平台通道传递到宿主端的,Native 收到调用的信息后方可执行指定的操作。如有返回的数据,则 Native 会将数据再通过平台通道一并传递给 Flutter,其中数据传递是异步的,这样就能确保消息传递时用户界面不会被阻塞。

1.Flutter 层(Dart 层)

Flutter 端使用 MethodChannel 的 invokeMethod 方法发起一次方法调用时,开始了消息传递流程。invokeMethod 方法会将其入参 message 和 arguments 封装成一个 MethodCall 对象,并使用 MethodCodec 将其编码为二进制格式数据,再通过 BinaryMessages 将消息发出。(注意,此处提到的类名与方法名均为 Dart 层的实现)

上述过程最终会调用到 ui.Window 的 _sendPlatformMessage 方法,该方法是一个Native 方法,其实现在 Native 层,这与 Java 的 JNI 技术非常类似。我们向 Native 层发送了三个参数:

• name,String 类型,代表 Channel 名称

• data,ByteData 类型,即之前封装的二进制数据

• callback,Function 类型,用于结果回调

2.Native 层

到 Native 层后,window.cc 的 SendPlatformMessage 方法接受了来自 Dart 层的三个参数,并对它们做了一定的处理:Dart 层的回调 callback 封装为 Native 层的 PlatformMessageResponseDart 类型的 response;dart 层的二进制数据 data 转化为 std::vector

类型数据 data;根据 response, data 以及 Channel 名称 name 创建一个 PlatformMessage 对象,并通过dartstate->window()->client()->HandlePlatformMessage 方法处理 PlatformMessage 对象。

dart_state->window()->client()是一个 WindowClient,而其具体的实现为 RuntimeController,RuntimeController 会将消息交给其代理 RuntimeDelegate 处理。

RuntimeDelegate 的实现为 Engine,Engine 在处理 Message 时,会判断该消息是否是为了获取资源(channel 等于"flutter/assets"),如果是,则走获取资源逻辑,否则调用 Engine::Delegate 的 OnEngineHandlePlatformMessage 方法。

Engine::Delegate 的具体实现为 Shell,其 OnEngineHandlePlatformMessage 接收到消息后,会向 PlatformTaskRunner 添加一个 Task,该 Task 会调用 PlatformView 的 HandlePlatformMessage 方法。值得注意的是,Task 中的代码执行在 Platform Task Runner 中,而之前的代码均执行在 UI Task Runner 中。

四、消息处理

PlatformView 的 HandlePlatformMessage 方法在不同平台有不同的实现,但是其基本原理是相同的。

1.PlatformView

AndroidPlatformViewAndroid 是 Platformview 的子类,也是其在 Android 端的具体实现。当 PlatformViewAndroid 接收到 PlatformMessage 类型的消息时,如果消息中有 response(类型为 PlatformMessageResponseDart),则生成一个自增长的 responseid,并以 responseid 为key,response 为 value 存入字典 pendingresponses 中。接着,将 channel 和 data 均转化为 Java 可识别的数据,通过 JNI 向 Java 层发起调用,将 response_id、channel 和 data 传递过去。

Java 层中,被调用的代码为 FlutterNativeView (BinaryMessager 的具体实现)的 handlePlatformMessage ,该方法会根据 channel 找到对应的 BinaryMessageHandler 并将消息传递给它处理。

BinaryMessageHandler 处理完成后,FlutterNativeView 会通过 JNI 调用 native 的方法,将 responsedata 和 responseid 传递到 native 层。

Native 层,PlatformViewAndroid 的 InvokePlatformMessageResponseCallback 接收到了 respondid 和 responsedata。其先将 responsedata 转化为二进制结果,并根据 responseid,从 pandingresponses 中找到对应的 PlatformMessageResponseDart 对象,调用其 Complete 方法将二进制结果返回。

2.PlatformViewIOS

PlatformViewIOS 是 PlatformView 的子类,也是其在 iOS 端的具体实现,当 PlatformViewIOS 接收到 message 时会交给 PlatformMessageRouter 处理。

PlatformMessageRouter通过 PlatformMessage 中的 channel 找到对应的 FlutterBinaryMessageHandler,并将二进制消息其处理,消息处理完成后,直接调用 PlatformMessage 对象中的 PlatformMessageResponseDart 对象的 Complete 方法将二进制结果返回。

3.结果回传

PlatformMessageResponseDart 的 Complete 方法向 UI Task Runner 添加了一个新的 Task,这个 Task 的作用是将二进制结果从 native 的二进制数据类型转化为 Dart 的二进制数据类型 response,并调用 Dart 的 callback 将 response 传递到 Dart 层。

Dart 层接收到二进制数据后,使用 MethodCodec 将数据解码,并返回给业务层。至此,一次从 Flutter 发起的方法调用就完整结束了。

五、具体使用

1.Flutter 端调用 Android 方法

2.Android 端代码

(1)继承 MethodCallHandler 并设置 Handler ,MethodChannel 需要保存在对象一会调用回调时需要使用,onMethodCall 为 Flutter 层回调的方法这边用 RCIMFlutterWrapper 承接处理。

(2)RCIMFlutterWrapper 类中处理, MethodCall 的 Method,对应 Flutter 层调用 invokeMethod 方法的传入的第一个参数,两端需完全对应一致。

(3)直接通过 result 对象回调回去,这样就能将结果回调。

3.关于 Android 回调 Flutter 的使用

(1)Flutter 端回调监听,设置监听 Key 两端对应。

(2)Android 端代码回调,mChannel.invokeMethod 方法将数据回调给 Flutter 层。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
5000万砸懵乒坛!张本一家全入编,国乒根基被抄了?

5000万砸懵乒坛!张本一家全入编,国乒根基被抄了?

八卦阿弥
2026-06-11 12:09:42
好消息!网约车车等人时间改了,等满3分钟就能取消订单

好消息!网约车车等人时间改了,等满3分钟就能取消订单

呼呼历史论
2026-06-13 01:00:48
墙倒众人扶!被人民日报点名的李维刚,再次证明真诚才是必杀技

墙倒众人扶!被人民日报点名的李维刚,再次证明真诚才是必杀技

舊事別提
2026-06-12 07:09:01
“墨西哥吴镇宇”比肩梅西C罗 奥乔亚六战世界杯

“墨西哥吴镇宇”比肩梅西C罗 奥乔亚六战世界杯

大象新闻
2026-06-12 08:33:18
新一轮人事调整!涉及福建多家医院领导岗位

新一轮人事调整!涉及福建多家医院领导岗位

福建卫生报
2026-06-10 12:14:49
中学生深夜看色情网站 上千部隐晦内容已吸引上亿次观看!

中学生深夜看色情网站 上千部隐晦内容已吸引上亿次观看!

闪电新闻
2026-06-12 07:10:35
王守业贪污1.6亿,2005年“双规”后却被放出,他叫嚣:我摆平了

王守业贪污1.6亿,2005年“双规”后却被放出,他叫嚣:我摆平了

帝哥说史
2026-06-02 21:40:03
生育率的“回旋镖”还是呼啦啦来了

生育率的“回旋镖”还是呼啦啦来了

新浪财经
2026-05-18 07:42:35
贵州女子刚生产完,丈夫冲到产房将其脑袋砍下:她死有余辜

贵州女子刚生产完,丈夫冲到产房将其脑袋砍下:她死有余辜

莫地方
2026-06-04 01:45:03
日媒:赴日留学生人数突破40万人!中国大陆占近1/3

日媒:赴日留学生人数突破40万人!中国大陆占近1/3

随波荡漾的漂流瓶
2026-06-12 12:08:35
周末风雨上线,下周雨日增多,梅雨倒计时了?

周末风雨上线,下周雨日增多,梅雨倒计时了?

上海预警发布
2026-06-12 17:14:05
央媒发声:4400万电车或将开征养路费

央媒发声:4400万电车或将开征养路费

月下守候
2026-06-12 15:54:55
为什么在世界杯的广告牌上,你几乎看不到汽车品牌?

为什么在世界杯的广告牌上,你几乎看不到汽车品牌?

电科技网
2026-06-10 18:14:17
借钱创业的深圳4人组,干出个全球第一

借钱创业的深圳4人组,干出个全球第一

最商业Plus
2026-06-12 12:14:45
前TVB女星官宣儿子出生,正式成为妈妈,嫁给富商后淡出娱乐圈

前TVB女星官宣儿子出生,正式成为妈妈,嫁给富商后淡出娱乐圈

看尽落尘花q
2026-06-13 03:34:34
这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

宇宙时空
2026-05-26 18:20:10
电讯报:韩国vs捷克官宣上座率98.5%,但大片空位让FIFA尴尬

电讯报:韩国vs捷克官宣上座率98.5%,但大片空位让FIFA尴尬

懂球帝
2026-06-12 17:20:12
一语成谶是一种怎样的体验?网友:她的儿子永远停留在了十七岁

一语成谶是一种怎样的体验?网友:她的儿子永远停留在了十七岁

夜深爱杂谈
2026-06-11 22:23:29
南通数十米长“巨无霸”预制件运输中移位,砸坏两车并截断马路,警方:致1人受伤

南通数十米长“巨无霸”预制件运输中移位,砸坏两车并截断马路,警方:致1人受伤

极目新闻
2026-06-12 21:59:05
79岁林子祥和老婆上海购物,叶蒨文打扮贵气,脖子上挂着几串珍珠

79岁林子祥和老婆上海购物,叶蒨文打扮贵气,脖子上挂着几串珍珠

一盅情怀
2026-06-12 19:26:34
2026-06-13 06:15:00
融云全球智能通信云
融云全球智能通信云
专业、简单、稳定的全球互联网通信云服务商
447文章数 25关注度
往期回顾 全部

科技要闻

刚刚,人类历史上首位万亿美元富豪诞生!

头条要闻

SpaceX上市首日收涨19% 总市值报2.1万亿美元

头条要闻

SpaceX上市首日收涨19% 总市值报2.1万亿美元

体育要闻

欧洲恐韩?肉德维德?

娱乐要闻

一天4个瓜,肖战热巴最意外

财经要闻

万亿美元顺差背后,透露这些信号

汽车要闻

标配激光雷达/双动力可选 昊铂S600限时售17.99万起

态度原创

数码
教育
手机
公开课
军事航空

数码要闻

英国监管机构警告:亚马逊、eBay仍在售可能致命的假冒手机充电器

教育要闻

唐尚珺第17次写高考作文:不后悔放弃中国政法大学,为救治父亲

手机要闻

vivo X Fold6再预热:天玑9500超能版+OriginOS 6 Fold

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

伊朗媒体:已故最高领袖葬礼推迟举行

无障碍浏览 进入关怀版