Flutter

Flutter

Flutter Platform Channel深度解析

IM即时通讯admin 发表了文章 • 0 个评论 • 141 次浏览 • 2021-01-28 14:20 • 来自相关话题

一、简介Platform Channel 是 Flutter 端与 Platform 端制定的通信机制,由官方提供用于 Dart 和平台之间的相互通信。分为以下 3 种(1)BaseMessageChannel :用于传递字符串和半结构化的信息(在大内存数据块... ...查看全部

一、简介

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

分为下 3 种

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

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

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

 

二、消息传递与编码器

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

1.png

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

1.编码器分类

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

(2)MethodCodec:JSONMethodCodec、StandardMessageCodec

2.png

经过消息编码器处理后,消息就可以被 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 ,支持的数据类型如下:3.png

三、MethodChannel

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

4.png

如上图: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 名称

            dataByteData 类型,即之前封装的二进制数据

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

2.Native

Native 层后,window.cc 的 SendPlatformMessage 方法接受了来自 Dart 层的三个参数,并对它们做了一定的处理:Dart 层的回调 callback 封装为 Native 层的 PlatformMessageResponseDart 类型的 response;dart 层的二进制数据 data 转化为 std::vector<uint8t> 类型数据 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 方法在不同平台有不同的实现,但是其基本原理是相同的

5.png

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 发起的方法调用就完整结束了

五、具体使用

6.png

1.Flutter 端调用 Android 方法

2.Android 端代码

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

7.png2RCIMFlutterWrapper 类中处理, MethodCall Method,对应 Flutter 层调用 invokeMethod 方法的传入的第一个参数,两端需完全对应一致

8.png

9.png

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

3.关于 Android 回调 Flutter 的使用

10.png

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

 11.png

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



Flutter. 如何解决聊天页面加载聊天历史之后乱跳的问题 demo也有问题

IM即时通讯admin 回复了问题 • 1 人关注 • 1 个回复 • 232 次浏览 • 2020-12-02 16:54 • 来自相关话题

【融云分析】基于原生代码开发 Flutter 插件

科技创新融云那些事 发表了文章 • 0 个评论 • 54 次浏览 • 2020-06-16 18:15 • 来自相关话题

Flutter 是谷歌推出的移动 UI 框架,所使用的开发语言是 Dart,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作。在全世界,Flutter 正在被越来越多的开发者和组织使用,并且它是完全... ...查看全部

Flutter 是谷歌推出的移动 UI 框架,所使用的开发语言是 Dart,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作。在全世界,Flutter 正在被越来越多的开发者和组织使用,并且它是完全免费、开源的。


Flutter 的特点
1.快速开发
毫秒级的热重载,修改后,应用界面会立即更新。使用丰富的、完全可定制的 widget 在几分钟内构建原生界面。
2.富有表现力和灵活的 UI
快速发布聚焦于原生体验的功能。分层的架构允许完全自定义,从而实现难以置信的快速渲染和富有表现力、灵活的设计。
3.原生的性能
Flutter 包含了许多核心的 widget,如滚动、导航、图标和字体等,这些都可以在 iOS 和 Android 上达到原生应用一样的性能。

但还有一个现实的问题:假如我们有了 iOS 和 Android 的原生 SDK,如果需要 Flutter 版本的,需要我们从头开始再构建一遍吗?

答案是不需要,Flutter 可以和原生代码交互,支持基于原生代码开发插件,这样就可以通过 Flutter 调用原有 SDK 的接口。


基于原生代码开发 Flutter 插件
一、Flutter 跨平台原理介绍
下图是 Flutter 官网对于跨平台原理的描述,详情可点击了解。


通过该图我们可以看到,Flutter 会通过 MethodChannel 将数据传递给 iOS/ Android ,反之 iOS/ Android 也可以通过 MethodChannel 将数据传回给 Flutter 。

还有一个问题:Flutter 使用的是和 iOS、Android 不同的开发语言,相互能传递什么类型的数据呢?


上面这张表罗列了 Flutter 使用的 Dart 语言与 iOS/Android 可以传递的数据类型,从表中我们可以看到,它只能传递一些基本的数据类型,比如 bool,int,double,高级的就是 String,List,Map,而且表中指明了在各平台对应的数据类型转换:如 Dart 的 Map 对应 Android 的 HashMap,对应 iOS 的 NSDictionary 。

二、插件的基本结构介绍
在终端输入下面的命令,等待一分钟左右,Flutter 就会把整个项目框架搭建好。



Flutter Plugin 可简单理解为上图中的 Flutter wrapper , iOS wrapper , Android wrapper 三个绿色部分,图中的双向箭头表明了代码的调用逻辑,这就是为什么说 Flutter 的插件可以跨平台使用。

如何确定 Flutter wrapper 调用的是 iOS 的接口还是 Android 的接口?答案是由运行的设备决定,即运行 iOS 设备,Flutter wrapper 自动调用 iOS wrapper 的接口,Android 也是这样。

当执行完创建 Plugin 的命令之后,Flutter 会负责在当前目录创建一个 Plugin项目,具体的目录含义如下:
android/ : Android wrapper
ios/ :iOS wrapper
lib/ :Flutter wrapper
example/ :demo 根目录
example/android/ :Android project
example/ios/ :iOS project
example/lib/ :Flutter app

第一次运行需要使用终端进入 Plugin 项目路径下执行下面命令获取 Flutter 的依赖。


三、代码层面的交互演示
MethodChannel 的创建

Flutter 通过 MethodChannel 与 iOS/Android 进行交互,下面的代码展示了三个平台如何创建 MethodChannel 对象。


通过相同字符串创建的 MethodChannel 就可以进行跨平台的数据交互。

当 Flutter 调用接口触发原生代码的时候:
iOS 会触发的方法


Android 会触发的方法


两个平台一样,都会获取 MethodCall 对象 和 FlutterResult 对象。
MethodCall 对象保存了方法名和参数,通过方法名确定调用具体的方法,通过参数获取具体的数据。

FlutterResult 对象可以将数据返回给 Flutter,下面会讲解该对象的使用。

Flutter 与 iOS/Android 数据交互总共三种方式:
1.iOS/Android 不给 Flutter 返回数据


2.iOS/Android 通过 FlutterResult 给 Flutter 返回数据



3.iOS/Android 通过 MethodChannel 给 Flutter 返回数据



通过 FlutterResult 和 MethodChannel 都可以给 Flutter 返回数据,但是两者有所区别:
FlutterResult 适用于能够快速返回数据的接口,比如说 IM 连接的回调或者连接服务器的回调。
MethodChannel 适用于不确定什么时间响应数据的接口,比如说收到消息的回调。
MethodChannel 可以替代 FlutterResult 返回数据,但是 FlutterResult 无法替代 MethodChannel。

为了让开发者和更多平台便捷的使用融云IM 功能,融云 IM Flutter 已经开源,欢迎大家体验使用。
GitHub 地址:https://github.com/rongcloud/rongcloud-im-flutter-sdk
Flutter 仓库地址:https://pub.dev/packages/rongcloud_im_plugin

Flutter. 如何解决聊天页面加载聊天历史之后乱跳的问题 demo也有问题

回复

IM即时通讯admin 回复了问题 • 1 人关注 • 1 个回复 • 232 次浏览 • 2020-12-02 16:54 • 来自相关话题

Flutter Platform Channel深度解析

IM即时通讯admin 发表了文章 • 0 个评论 • 141 次浏览 • 2021-01-28 14:20 • 来自相关话题

一、简介Platform Channel 是 Flutter 端与 Platform 端制定的通信机制,由官方提供用于 Dart 和平台之间的相互通信。分为以下 3 种(1)BaseMessageChannel :用于传递字符串和半结构化的信息(在大内存数据块... ...查看全部

一、简介

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

分为下 3 种

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

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

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

 

二、消息传递与编码器

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

1.png

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

1.编码器分类

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

(2)MethodCodec:JSONMethodCodec、StandardMessageCodec

2.png

经过消息编码器处理后,消息就可以被 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 ,支持的数据类型如下:3.png

三、MethodChannel

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

4.png

如上图: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 名称

            dataByteData 类型,即之前封装的二进制数据

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

2.Native

Native 层后,window.cc 的 SendPlatformMessage 方法接受了来自 Dart 层的三个参数,并对它们做了一定的处理:Dart 层的回调 callback 封装为 Native 层的 PlatformMessageResponseDart 类型的 response;dart 层的二进制数据 data 转化为 std::vector<uint8t> 类型数据 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 方法在不同平台有不同的实现,但是其基本原理是相同的

5.png

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 发起的方法调用就完整结束了

五、具体使用

6.png

1.Flutter 端调用 Android 方法

2.Android 端代码

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

7.png2RCIMFlutterWrapper 类中处理, MethodCall Method,对应 Flutter 层调用 invokeMethod 方法的传入的第一个参数,两端需完全对应一致

8.png

9.png

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

3.关于 Android 回调 Flutter 的使用

10.png

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

 11.png

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



【融云分析】基于原生代码开发 Flutter 插件

科技创新融云那些事 发表了文章 • 0 个评论 • 54 次浏览 • 2020-06-16 18:15 • 来自相关话题

Flutter 是谷歌推出的移动 UI 框架,所使用的开发语言是 Dart,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作。在全世界,Flutter 正在被越来越多的开发者和组织使用,并且它是完全... ...查看全部

Flutter 是谷歌推出的移动 UI 框架,所使用的开发语言是 Dart,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作。在全世界,Flutter 正在被越来越多的开发者和组织使用,并且它是完全免费、开源的。


Flutter 的特点
1.快速开发
毫秒级的热重载,修改后,应用界面会立即更新。使用丰富的、完全可定制的 widget 在几分钟内构建原生界面。
2.富有表现力和灵活的 UI
快速发布聚焦于原生体验的功能。分层的架构允许完全自定义,从而实现难以置信的快速渲染和富有表现力、灵活的设计。
3.原生的性能
Flutter 包含了许多核心的 widget,如滚动、导航、图标和字体等,这些都可以在 iOS 和 Android 上达到原生应用一样的性能。

但还有一个现实的问题:假如我们有了 iOS 和 Android 的原生 SDK,如果需要 Flutter 版本的,需要我们从头开始再构建一遍吗?

答案是不需要,Flutter 可以和原生代码交互,支持基于原生代码开发插件,这样就可以通过 Flutter 调用原有 SDK 的接口。


基于原生代码开发 Flutter 插件
一、Flutter 跨平台原理介绍
下图是 Flutter 官网对于跨平台原理的描述,详情可点击了解。


通过该图我们可以看到,Flutter 会通过 MethodChannel 将数据传递给 iOS/ Android ,反之 iOS/ Android 也可以通过 MethodChannel 将数据传回给 Flutter 。

还有一个问题:Flutter 使用的是和 iOS、Android 不同的开发语言,相互能传递什么类型的数据呢?


上面这张表罗列了 Flutter 使用的 Dart 语言与 iOS/Android 可以传递的数据类型,从表中我们可以看到,它只能传递一些基本的数据类型,比如 bool,int,double,高级的就是 String,List,Map,而且表中指明了在各平台对应的数据类型转换:如 Dart 的 Map 对应 Android 的 HashMap,对应 iOS 的 NSDictionary 。

二、插件的基本结构介绍
在终端输入下面的命令,等待一分钟左右,Flutter 就会把整个项目框架搭建好。



Flutter Plugin 可简单理解为上图中的 Flutter wrapper , iOS wrapper , Android wrapper 三个绿色部分,图中的双向箭头表明了代码的调用逻辑,这就是为什么说 Flutter 的插件可以跨平台使用。

如何确定 Flutter wrapper 调用的是 iOS 的接口还是 Android 的接口?答案是由运行的设备决定,即运行 iOS 设备,Flutter wrapper 自动调用 iOS wrapper 的接口,Android 也是这样。

当执行完创建 Plugin 的命令之后,Flutter 会负责在当前目录创建一个 Plugin项目,具体的目录含义如下:
android/ : Android wrapper
ios/ :iOS wrapper
lib/ :Flutter wrapper
example/ :demo 根目录
example/android/ :Android project
example/ios/ :iOS project
example/lib/ :Flutter app

第一次运行需要使用终端进入 Plugin 项目路径下执行下面命令获取 Flutter 的依赖。


三、代码层面的交互演示
MethodChannel 的创建

Flutter 通过 MethodChannel 与 iOS/Android 进行交互,下面的代码展示了三个平台如何创建 MethodChannel 对象。


通过相同字符串创建的 MethodChannel 就可以进行跨平台的数据交互。

当 Flutter 调用接口触发原生代码的时候:
iOS 会触发的方法


Android 会触发的方法


两个平台一样,都会获取 MethodCall 对象 和 FlutterResult 对象。
MethodCall 对象保存了方法名和参数,通过方法名确定调用具体的方法,通过参数获取具体的数据。

FlutterResult 对象可以将数据返回给 Flutter,下面会讲解该对象的使用。

Flutter 与 iOS/Android 数据交互总共三种方式:
1.iOS/Android 不给 Flutter 返回数据


2.iOS/Android 通过 FlutterResult 给 Flutter 返回数据



3.iOS/Android 通过 MethodChannel 给 Flutter 返回数据



通过 FlutterResult 和 MethodChannel 都可以给 Flutter 返回数据,但是两者有所区别:
FlutterResult 适用于能够快速返回数据的接口,比如说 IM 连接的回调或者连接服务器的回调。
MethodChannel 适用于不确定什么时间响应数据的接口,比如说收到消息的回调。
MethodChannel 可以替代 FlutterResult 返回数据,但是 FlutterResult 无法替代 MethodChannel。

为了让开发者和更多平台便捷的使用融云IM 功能,融云 IM Flutter 已经开源,欢迎大家体验使用。
GitHub 地址:https://github.com/rongcloud/rongcloud-im-flutter-sdk
Flutter 仓库地址:https://pub.dev/packages/rongcloud_im_plugin