当前位置: 首页 > news >正文

【融云分析】基于原生代码开发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

融云IM商用版年中大促火爆进行中

从 7 月 1 日——8 月 31 日,融云年中大促正在火热进行中,IM 商用版预存最低享 7 折,更多详情可以点击登录融云官网活动页面查看。

相关文章:

  • 融云IM商用版冰点促销 助程序员的十二时辰躺赢
  • 程序员准点下班的小秘密
  • 融云观察:壳壳语音新玩法,深挖语音社交市场
  • 站在Z时代社交风口 融云打造语音聊天室新模式
  • 融云重磅推出”ALL IN”行动 率先提出服务品牌化
  • 融云微课堂第七讲 | 融云音视频SDK的实战进阶
  • 首届全球互联网通信云大会重磅来袭 融云邀您洞见通信未来
  • 大咖云集!2019全球互联网通信云大会讲师团曝光
  • 融云亮相GTC全球流量大会 荣膺鲸鸣奖2019年度优秀出海服务商
  • 转动“魔方” 探秘融云消息管理服务先进性
  • 剧透全球互联网通信云大会:融云核心技术首曝光
  • 中国 IM 企业的新机会?揭秘融云全球通信云网络背后的技术 | 对话 WICC
  • 融云服务全新升级 “双11”套餐最高可省55%
  • 抗击疫情 融云在行动
  • 疫情期间远程协同办公成刚需 融云助力拓维打造视频会议系统
  • [LeetCode] Wiggle Sort
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angular4 模板式表单用法以及验证
  • FineReport中如何实现自动滚屏效果
  • IDEA常用插件整理
  • Mocha测试初探
  • PHP面试之三:MySQL数据库
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 翻译--Thinking in React
  • 实习面试笔记
  • 原生Ajax
  • 怎么将电脑中的声音录制成WAV格式
  • Nginx实现动静分离
  • 阿里云服务器如何修改远程端口?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • (1)(1.9) MSP (version 4.2)
  • (1)STL算法之遍历容器
  • (Note)C++中的继承方式
  • (二)Linux——Linux常用指令
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四)linux文件内容查看
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *2 echo、printf、mkdir命令的应用
  • .NET Micro Framework初体验
  • .net 中viewstate的原理和使用
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .Net中ListT 泛型转成DataTable、DataSet
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [C++]AVL树怎么转
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [leetcode 189][轮转数组]
  • [Linux] 进程间通信基础
  • [mysql]错误解决之Failed to start MySQL Server