首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter 开发 (3)Flutter 与 Native 的交互

Flutter 开发 (3)Flutter 与 Native 的交互

作者头像
iOSSir
发布于 2023-03-19 03:56:07
发布于 2023-03-19 03:56:07
1.1K0
举报
Flutter 中 Channel 基本概念
1. Flutter 中 Channel 的概念
  • Channel 也就是通道的意思,主要是用于和原生Native之间进行交互 ,双方相互传递数据。
  • Channel 在Native的端就是一个类。
2. Flutter 中 Channel 有哪些

三种Channel之间互相独立,各有用途,但它们在设计上却非常相近。

  • BasicMessageChannel:用于传递字符串和半结构化的信息。
  • MethodChannel:用于传递方法调用(method invocation)。
  • EventChannel: 用于数据流(event streams)的通信(例如 NSData)。
Flutter 中 Channel 的详细介绍
1. Channel 的成员变量属性

每种Channel均有三个重要成员变量:

  • name:String类型,代表Channel的名字,也是其唯一标识符。
  • messager:BinaryMessenger类型,代表消息信使,是消息的发送与接收的工具。
  • codec: MessageCodec 类型 或MethodCodec类型,代表消息的编解码器。
2. Channel 的成员变量 - name
  • 一个Flutter应用中可能存在多个Channel,每个Channel在创建时必须指定一个独一无二的name,Channel之间使用 name 来区分彼此。
  • 当有消息从 Flutter端 发送到 Native端 时,会根据其传递过来的 channel name 找到该Channel对应的Handler(消息处理器)。
(1)Channel 的成员变量
- BinaryMessenger
  • BinaryMessenger是Platform端与Flutter端通信的工具,传递数据格式为二进制。
  • 当我们初始化一个Channel,并向该Channel注册处理消息的Handler时,实际上会生成一个与之对应的 BinaryMessageHandler ,并以 channel name 为 key,注册到BinaryMessenger 中。
  • 当Flutter端发送消息到BinaryMessenger时,BinaryMessenger会根据其入参channel找到对应的BinaryMessageHandler,并交由其处理。

Binarymessenger 在 iOSAndroid 上分别是什么? 在Android端是一个接口,其具体实现为FlutterNativeView。 在iOS端是一个协议,名称为FlutterBinaryMessenger,FlutterViewController 遵循了它。

(2) Channel 的成员变量
- codec (消息编解码器)
  • Codec主要用于将二进制格式的数据转化为Handler能够识别的数据。
抽象逻辑
  • (示例 StringCodec, BinaryCode, JSONMessageCodec)
如何解决数据传递编解码问题?
  • 由于Channel从BinaryMessageHandler接收到的消息是 二进制格式数据 ,无法直接使用,故Channel会将该二进制消息通过Codec(消息编解码器)解码为能识别的消息并传递给Handler进行处理。
  • 当Handler处理完消息之后,会通过回调函数返回result,并将result通过编解码器编码为二进制格式数据,通过BinaryMessenger发送回Flutter端。
Codec 的介绍

Flutter定义了两种Codec:MessageCodec 和 MethodCodec。

MessageCodec 有多种不同实现

BinaryCodec

  • BinaryCodec 在编解码过程中什么都没做,只是原封不动将二进制数据消息返回而已。
  • 其返回值类型和入参的类型相同,均为二进制格式(Android中为ByteBuffer,iOS中为NSData)

StringCodec

  • StringCodec 用于字符串与二进制数据之间的编解码,其编码格式为UTF-8。

JSONMessageCodec

  • JSONMessageCodec用于基础数据与二进制数据之间的编解码,其支持基础数据类型以及列表、字典。其在iOS端使用了NSJSONSerialization作为序列化的工具,而在Android端则使用了其自定义的JSONUtil与StringCodec作为序列化工具。

StandardMessageCodec (默认如果不指定)

  • StandardMessageCodec 是BasicMessageChannel的默认编解码器,其支持基础数据类型、二进制数据、列表、字典。
MethodCodec 有多种不同实现

JSONMethodCodec JSONMethodCodec的编解码依赖于JSONMessageCodec 当其在编码MethodCall时,会先将MethodCall转化为字典 {"method":method,"args":args}。 其在编码调用结果时,会将其转化为一个数组,调用成功为[result],调用失败为[code,message,detail]。再使用JSONMessageCodec将字典或数组转化为二进制数据。

StandardMethodCodec MethodCodec的默认实现,StandardMethodCodec的编解码依赖于StandardMessageCodec,当其编码MethodCall时,会将method和args依次使用StandardMessageCodec编码,写入二进制数据容器。其在编码方法的调用结果时,若调用成功,会先向二进制数据容器写入数值0(代表调用成功),再写入StandardMessageCodec编码后的result。而调用失败,则先向容器写入数据1(代表调用失败),再依次写入StandardMessageCodec编码后的code,message和detail。

抽象逻辑图
Flutter 中 Channel 具体实现
  • FlutterMethodChannel
  • FlutterBasicMessageChannel
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python课后小剧场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )
本博客与 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 BasicMessageChannel 通信 ) 博客相对应 , 该博客中开发 Flutter 的 Dart 端 ;
韩曙亮
2023/03/29
2.1K0
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )
Flutter与原生通信
这三种类型的Channel都是全双向通信,即A<=>B,flutter可以主动发送消息给Native端,并且Native接收到消息后可以做出回应,同样,Native端可以主动发送消息给flutter端,flutter端接收数据后给Native端。
愤怒的小鸟
2021/04/07
2.7K0
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
如 使用flutter_inappwebview插件,在 pubspec.lock 文件中配置:
少湖说
2024/10/22
3060
Channel的原理探究
在上一篇文章《Flutter引擎——下载、编译和调试》中,我们已经可以调试引擎代码了;而在《Flutter与原生工程的混合开发》中,我们使用到了FlutterMethodChannel。本文就通过Flutter引擎代码的调试来研究一下channel的原理。
拉维
2022/03/28
1.1K0
Channel的原理探究
有赞Flutter插件开发与发布
随着 Flutter 生态越来越完善,以及 Flutter 在性能上的高光表现,越来越多的模块将会通过 Flutter 来进行实现。为了更方便的与原生工程进行对接以及降低整体工程的耦合,Flutter 的开发模式也需要做成组件化的模式,拥有独立调试以及可拆卸的特性。原生工程在接入 Flutter 模块时,只需要在 gradle(pod) 中添加依赖,即可与 Flutter 模块进行交互。
有赞coder
2020/08/25
2.1K0
有赞Flutter插件开发与发布
【Flutter 混合开发】与原生通信-MethodChannel
Native 端主动发送数据给 Flutter时,Native 端代码需要在主线程中执行,Android 端从子线程跳转到主线程方式:
老孟Flutter
2020/11/03
1.7K0
【Flutter 混合开发】与原生通信-MethodChannel
Flutter 安卓 Platform 与 Dart 端消息通信方式 Channel 源码解析
本系列前面已经分析了 Flutter 的很多知识,这一篇我们来看下 Flutter 平台通信相关原理。Flutter 官方提供三种 Platform 与 Dart 端消息通信方式,他们分别是 MethodChannel、BasicMessageChannel、EventChannel,本文会继续延续前面系列对他们进行一个深度解析,源码依赖 Flutter 2.2.3 版本,Platform 选取熟悉的 Android 平台实现。
工匠若水
2021/08/25
2.7K3
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 BasicMessageChannel 通信 )
这是一个命名通道 , 用于 Flutter 端 与 Native 端的消息传递 ;
韩曙亮
2023/03/29
3K0
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 BasicMessageChannel 通信 )
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 MethodChannel 通信 )
本博客与 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 MethodChannel 通信 ) 博客相对应 , 该博客中开发 Flutter 的 Dart 端 ;
韩曙亮
2023/03/29
9090
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 MethodChannel 通信 )
MethodChannel 简介 : MethodChannel 通道用于方法调用 ;
韩曙亮
2023/03/29
1.1K0
Flutter 混合开发(Android)Flutter跟Native相互通信
Flutter 作为混合开发,跟native端做一些交互在所难免,比如说调用原生系统传感器、原生端的网络框架进行数据请求就会用到 Flutter 调用android 及android 原生调用 Flutter的方法,这里就涉及到Platform Channels(平台通道)
conanma
2022/01/10
9540
[-Flutter插件篇 -] 认识MethodChannel
上次从一个路径插件看来一下Flutter中如何调用iOS和Android中的方法以及平台如何返回值给Flutter框架。今天就来详细讲讲MethodChannel是如何连同另一个世界的。 ---- 1
张风捷特烈
2020/04/30
2.6K0
[-Flutter插件篇 -] 认识MethodChannel
Flutter Chanel通信流程
目录介绍 01.flutter和原生之间交互 02.MethodChanel流程 03.MethodChanel使用流程 04.MethodChanel代码实践 05.EventChannel流程 06.EventChannel基本流程 07.EventChannel代码实现 08.BasicMessageChannel流程 09.BasicMessageChannel基本流程 10.BasicMessageChannel代码实现 11.Channel编解码器说明 12.Channel通信可以子线程吗 13
杨充
2021/08/26
5.6K0
Flutter鸿蒙终端一体化—鹊桥相会
在鸿蒙中开发Flutter项目,一个最大的问题,就是「不太会写鸿蒙代码」,这对于一个Flutter开发者来说,虽然不是一件很麻烦的事,但由于现在鸿蒙的版本和文档还略有一些混乱,所以要写好还是有一些麻烦的,所以,秉着能用工具解决的问题就不要自己写的原则,我们参考Native的Flutter Channel的实现,也就是pigeon的方式,不熟悉的同学可以参考我之前的文章。
用户1907613
2024/03/18
8070
Flutter鸿蒙终端一体化—鹊桥相会
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 EventChannel 通信 )
EventChannel 一般用于持续的通信 , 如 : 将 Android 应用中采集的陀螺仪 , GPS 等信息 , 持续的发送给 Flutter 应用 ;
韩曙亮
2023/03/29
1.5K0
一篇看懂Android与Flutter之间的通信
Flutter作为一种跨平台解决方案,经常会作为一个模块嵌入到原生Android与iOS应用中,Flutter与Android原生端的通信必不可少。所以本文就来讲述一下Android如何与flutter进行通信。
Android技术干货分享
2019/06/25
4.2K0
一篇看懂Android与Flutter之间的通信
Flutter与Native通信 - PlatformChannel源码分析
Flutter是一个跨平台的方案,在UI、触控及基本的网络请求上已经基本做到平台无关,但是在某些平台特性的功能上,还是必须要对不同的平台做处理。这就涉及到与Native的通信。
DSoon
2018/11/22
3.6K0
Flutter如何与Native(Android)进行交互
上一篇文章Flutter混合开发:Android中如何启动Flutter中我们介绍了如何在Native(Android项目)中启动Flutter,展示Flutter页面。但是在开发过程中,很多时候并不是简单的展示一个页面即可,还会涉及到各种交互,比如传递一些消息。
BennuCTech
2021/12/10
1.1K0
Flutter如何与Native(Android)进行交互
# flutter之channel详解
channel是无状态通信,一次send/reply后调用就结束了,类似http的无状态通信
用户1175783
2019/09/17
2.9K2
# flutter之channel详解
【Flutter 混合开发】与原生通信-BasicMessageChannel
com.flutter.guide.BasicMessageChannel 是 BasicMessageChannel 的名称,原生端要与之对应。
老孟Flutter
2020/11/03
1.1K0
【Flutter 混合开发】与原生通信-BasicMessageChannel
推荐阅读
相关推荐
【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )
更多 >
LV.2
这个人很懒,什么都没有留下~
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档