作者:腾讯NOW直播 -koudleren(任晓帅)

前言

前面讲了Flutter和Native的混合开发模式,Flutter作为Native工程的一个Module存在,这样可以有效的将Flutter和Native进行物理隔离,但随着Flutter承载的业务越来越多,与Native交互的接口变的越来越多,带来了很多管理问题,因此我们迫切需要采用新的开发模式,本文将介绍NOW直播是如何做的。

1.存在的问题

  1. 因为交互接口涉及Flutter、Android、iOS多端,随着接口变的越来越多,使得工程越来越复杂,代码也越来越多,导致维护成本变高,不好管理。
  2. 众多的接口写在一起,逻辑耦合,修改一处可能会影响其他的逻辑,也不好复用。
  3. 不方便单元测试

2.改进点

采用组件化开发Flutter,将会有如下的优势:

  1. 将功能模块化,相互独立,方便管理
  2. 模块之间互不影响,耦合低,一些与业务无关的模块可以开源出来,供其他APP使用,提供代码的复用。
  3. 采用组件化开发,开发时互不影响,可以提高开发效率。
  4. 方便单元测试

下面介绍Flutter组件化开发的具体内容。

3.从Platform Channel说起

  • 定义
Platform Channel为Dart和平台之间提供了相互通信的机制,将Flutter、Android、iOS连接起来。
复制代码

在移动H5开发中,webview自身提供的功能往往不够用,为了解决这个问题,引入了jsbridge,即web与native之间进行数据交互的一种方法,可以方便的将native的功能扩展给webview使用,从而可以快速开发。在Flutter中,也存在和jsbridge一样的用法,那就是Platform Channel,我们可以通过Platform Channel,将Flutter和Native方便的连接在一起,架构图如下:

在Channel中

  1. client发送信息
  2. host接受信息并返回结果
  3. 而且消息和响应是以异步方式传递的
  4. Flutter和Natvie可以互为client和host,信息传递是双向的

而且在Flutter中实现一个Channel也非常简单,假如Flutter作为client,Native作为Host,只需要:

  1. 在Flutter层声明一个Channel,发送消息到Native,等待Native结果返回
static const platform = const MethodChannel(‘samples.flutter.io/battery');
int result = await platform.invokeMethod('getBatteryLevel');
复制代码
  1. 在Native层注册Channel的监听,当收到从Flutter层发送过来的消息时,将结果返回给Flutter
new MethodChannel(getFlutterView(),"samples.flutter.io/battery").setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getBatteryLevel")) {
return batteryLevel;
}
}}
);
复制代码

从中我们可以发现,写一个Flutter的Platform Channel非常简洁而且轻量。而且相较于H5的jsbridge,Platform Channel也具有如下的几个优势:

  1. Platform Channel是Flutter自带的功能,不需要额外的开发,接口简洁,调用方便。
  2. Platform Channel比jsbridge有更好的性能表现
  3. 更重要的是Platform Channel底层实现统一,更聚焦于数据之间的传递,不像jsbridge,如果使采用不同方法实现的jsbridge,代码是无法通用的,而Platform Channel却可以做到更通用,

Platform Channel作为连接Flutter和Native的部分,在混合开发模式中非常重要,是作为底层重要架构的存在,因此可以将Platform Channel单独作为一个模块,将Flutter工程中的Plaform Channel和UI代码分开,那么如何将Platform Channel模块化呢?这里就要讲到一个新的概念:Flutter plugin.

4.Flutter Plugin

  • 定义
一个在Android、iOS、Dart上实现Platform Channel代码的软件包
复制代码

因此一个完整的Flutter Plugin 包含三种平台的代码:

  1. Android平台的Java或Kotlin
  2. iOS平台的ObjC或者Swift
  3. Flutter平台的Dart

所以Platform Channel可以使用Flutter plugin来实现模块化,这意味着可以将一些通用的功能在不同的APP上使用,例如:登录模块、图片库模块、网络库模块、数据库模块等。

创建Flutter Plugin的方法也很简单:

  1. Android Studio

在Android Studio上安装Flutter的插件后,可以通过:

File -> New -> New Flutter Project... -> Flutter Pulgin

  1. 命令行
$ flutter create --org com.example --template=plugin hello
复制代码

在创建完工程后,我们就可以实现我们想要的Platform Channel功能。那我们又如何共享我们的Flutter Plugin呢?熟悉Android开发的同学,都知道Maven仓库,Flutter也有类似的软件包仓库,就是Pub.

5.Pub

  • 定义
Pub是Dart语言的包管理器,包含Flutter、AngularDart和一般Dart程序。
复制代码
  • 使用

我们可以在pub.dartlang.org/上面查找我们想要用的软件包,例如protobuf:

​ 在搜索结果页,找到我们想要的包:

​ 使用的时候只要将包名和版本号加入到工程的pubspec.yaml里:

dependencies:
protobuf: ^0.10.4
复制代码

​ 并运行命令行安装包:

$ flutter packages get
复制代码

​ 就可以在工程使用了。说完使用,那如何将我们自己的Flutter Plugin的包提供给别人使用呢?就需要我们将包上传到Pub。

  • 上传

将一个包上传到Pub,需要三个步骤:

  1. 确保pubspec.yaml里面的相关配置填写正确,README.mdCHANGELOG.md最好也补充完整。

  2. 在上传前,先运行dry-run命令查看是否所有内容可以通过检测

$ flutter pacakges pub publish --dry-run
复制代码

3.上传

$ flutter packages pub publish
复制代码

上传成功后,就可以在别的工程里使用,在pubspec.yaml里的dependencies添加,如下:

dependencies:包名: 版本号
复制代码

6.Private Pub

在将自己团队的库上传到Pub中后,还存在一个问题,那就是因为Pub是一个公共仓库,上传上去之后所有人都看的到,这样就非常不好,因为团队内的项目是不想让其他人看到的。这时候我们就需要一个Private Pub,即私有Pub来管理自己团队的库。

我在公司内搭建了一个私有Pub,地址为:

******(因为是公司内部地址,就不公布了)

如果想要使用Private Pub,需要如下的设置:

$ export PUB_HOSTED_URL=******
复制代码

设置完成后就可以使用Private Pub了,Pub其他的使用都不变。

7.Flutter 工程结构

最后我们Flutter的工程结构如下:

在Platform Channel中,将独立的功能都抽取出来打包成plugin,在将多个plugin组合成Flutter的基础组件,从而快速支持Flutter UI业务代码的开发。

8.开发流程

最后我们的开发流程如下:

单一功能的Platform Channel以Project的形式存在,经过开发、测试、验证无误之后再上传到Private Pub,不管是纯Flutter工程还是Flutter、Native混合工程都可以各取所需,使用需要的Flutter Plugin。

总结

通过分析Flutter的工程结构,我们将Flutter拆分成Platform Channel和Flutter UI两个相互独立的模块,明晰了Flutter的工程结构,同时进一步细化Platform Channel,将单一功能的Platform Channel打包成Flutter Plugin,同时搭建自己的私有Pub,方便的管理Flutter Plugin,极大的方便了Flutter的开发,也有利于我们的组件重用和提高开发效率!

NOW直播——Flutter组件化开发方案相关推荐

  1. android组件化架构 书,Android MVVM组件化架构方案

    MVVMHabitComponent 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少.结合自身的调研和探索,在此分享一篇基 ...

  2. 组件化开发与资源管理

    前端,是一种GUI软件 现如今前端可谓包罗万象,产品形态五花八门,涉猎极广,什么高大上的基础库/框架,拽炫酷的宣传页面,还有屌炸天的小游戏--不过这些一两个文件的小项目并非是前端技术的主要应用场景,更 ...

  3. 降本增效的利器——组件化开发

    随着SPA,前后端分离的技术架构在业界越来越流行,前端需要管理的内容,承担的职责也越来越多.再加上移动互联网的火爆,各大公司也开始在前端投入更多的资源. 在传统的开发模式中,不仅会有大量的资源冗余,而 ...

  4. iOS 的组件化开发

    2019独角兽企业重金招聘Python工程师标准>>> 在一个APP开发过程中,如果项目较小且团队人数较少,使用最基本的MVC.MVVM开发就已经足够了,因为维护成本比较低. 但是当 ...

  5. 组件化开发和模块化开发概念辨析

    网上有许多讲组件化开发.模块化开发的文章,但大家一般都是将这两个概念混为一谈的,并没有加以区分.而且实际上许多人对于组件.模块的区别也不甚明了,甚至于许多博客文章专门解说这几个概念都有些谬误. 想分清 ...

  6. android组件化开发视频教程,教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...

  7. Vue.js组件化开发实践

    Vue.js组件化开发实践 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了一下的内容.首先会对使用Vue进行开发的一 ...

  8. mysql组件化_组件化开发和模块化开发概念辨析

    网上有许多讲组件化开发.模块化开发的文章,但大家一般都是将这两个概念混为一谈的,并没有加以区分.而且实际上许多人对于组件.模块的区别也不甚明了,甚至于许多博客文章专门解说这几个概念都有些谬误. 想分清 ...

  9. VUE.JS 组件化开发实践

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模 ...

最新文章

  1. 解决计算机名修改或作业移植导致的服务器名问题.sql
  2. Linux多个端口组合,iptables使用multiport 添加多个不连续端口
  3. loadrunner—事务、TPS
  4. P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】
  5. 去超市一定要存包吗_去东京一定要去的富士河口湖
  6. simulink和c语言开发,Simulink之嵌入式C代码生成-应用层和底层的接口
  7. HTTP笔记-浏览器是如何识别点击的链接是下载文件还是展示页面
  8. 泛型接口(C# 编程指南)
  9. 数据分析系统DIY1/3:CentOS7+MariaDB安装纪实
  10. 计算机中编码器的作用,电机编码器的作用-与非网
  11. 高中英语计算机辅助教学例子,计算机辅助教学在英语听力中的运用
  12. JavaScript——this与箭头函数
  13. 详解linux netstat输出的网络连接状态信息
  14. Dan 计划:重新定义人生的10000个小时
  15. 电阻的组成、分类及读数方法
  16. linux系统下 USB 摄像头1080分辨率采集帧率低问题的解决方法
  17. Linux下常见错误码
  18. html文件如何创建文件,怎么创建html文件
  19. error: src refspec master does not match any. 错误的解决办法
  20. “企业上云”计划出炉,三年内河北万家企业要上云!|中机智库

热门文章

  1. The Sandbox 与 TOWER 团队共同发起塔防游戏创作大赛
  2. AI 建模师 素养手冊(1)
  3. rand-C语言随机数范围
  4. 《android开发艺术探索》读书笔记(二)--IPC机制
  5. 【ROS】使用自己的USB单目摄像头测试ORBSLAM2
  6. Python绘制热力图
  7. php制作白色背景图加字,PHP实现水印类,支持添加图片、文字、填充颜色区域
  8. 【FTP工具】- Win10下免费的FTP服务器搭建 - FileZilla 的下载、安装、使用
  9. 详解为什么OpenCV的直方图计算函数calcHist()计算出的灰度值为255的像素个数为0
  10. 微盛·企微管家携手企业微信参加2021第六届中国抗衰老医学(官方)大会