做者:腾讯 - 小德(koudleren 任晓帅)java
前面讲了Flutter和Native的混合开发模式,Flutter做为Native工程的一个Module存在,这样能够有效的将Flutter和Native进行物理隔离,但随着Flutter承载的业务愈来愈多,与Native交互的接口变的愈来愈多,带来了不少管理问题,所以咱们迫切须要采用新的开发模式,本文将介绍Flutter的组件化开发方案。web
采用组件化开发Flutter,将会有以下的优点:shell
下面介绍Flutter组件化开发的具体内容。数据库
Platform Channel为Dart和平台之间提供了相互通讯的机制,将Flutter、Android、iOS链接起来。
复制代码
在移动H5开发中,webview自身提供的功能每每不够用,为了解决这个问题,引入了jsbridge,即web与native之间进行数据交互的一种方法,能够方便的将native的功能扩展给webview使用,从而能够快速开发。在Flutter中,也存在和jsbridge同样的用法,那就是Platform Channel,咱们能够经过Platform Channel,将Flutter和Native方便的链接在一块儿,架构图以下:bash
在Channel中网络
并且在Flutter中实现一个Channel也很是简单,假如Flutter做为client,Native做为Host,只须要:架构
static const platform = const MethodChannel(‘samples.flutter.io/battery');
int result = await platform.invokeMethod('getBatteryLevel');
复制代码
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也具备以下的几个优点:异步
Platform Channel做为链接Flutter和Native的部分,在混合开发模式中很是重要,是做为底层重要架构的存在,所以能够将Platform Channel单独做为一个模块,将Flutter工程中的Plaform Channel和UI代码分开,那么如何将Platform Channel模块化呢?这里就要讲到一个新的概念:Flutter plugin.ide
一个在Android、iOS、Dart上实现Platform Channel代码的软件包
复制代码
所以一个完整的Flutter Plugin 包含三种平台的代码:模块化
因此Platform Channel可使用Flutter plugin来实现模块化,这意味着能够将一些通用的功能在不一样的APP上使用,例如:登陆模块、图片库模块、网络库模块、数据库模块等。
建立Flutter Plugin的方法也很简单:
在Android Studio上安装Flutter的插件后,能够经过:
File
-> New
-> New Flutter Project...
-> Flutter Pulgin
$ flutter create --org com.example --template=plugin hello
复制代码
在建立完工程后,咱们就能够实现咱们想要的Platform Channel功能。那咱们又如何共享咱们的Flutter Plugin呢?熟悉Android开发的同窗,都知道Maven仓库,Flutter也有相似的软件包仓库,就是Pub.
Pub是Dart语言的包管理器,包含Flutter、AngularDart和通常Dart程序。
复制代码
咱们能够在pub.dartlang.org/上面查找咱们想要用的软件包,例如protobuf:
在搜索结果页,找到咱们想要的包:
使用的时候只要将包名和版本号加入到工程的pubspec.yaml
里:
dependencies:
protobuf: ^0.10.4
复制代码
并运行命令行安装包:
$ flutter packages get
复制代码
就能够在工程使用了。说完使用,那如何将咱们本身的Flutter Plugin的包提供给别人使用呢?就须要咱们将包上传到Pub。
将一个包上传到Pub,须要三个步骤:
确保pubspec.yaml
里面的相关配置填写正确,README.md
和CHANGELOG.md
最好也补充完整。
在上传前,先运行dry-run命令查看是否全部内容能够经过检测
$ flutter pacakges pub publish --dry-run
复制代码
3.上传
$ flutter packages pub publish
复制代码
上传成功后,就能够在别的工程里使用,在pubspec.yaml
里的dependencies添加,以下:
dependencies:
包名: 版本号
复制代码
在将本身团队的库上传到Pub中后,还存在一个问题,那就是由于Pub是一个公共仓库,上传上去以后全部人都看的到,这样就很是很差,由于团队内的项目是不想让其余人看到的。这时候咱们就须要一个Private Pub,即私有Pub来管理本身团队的库。
我在公司内搭建了一个私有Pub,地址为:
******(由于是公司内部地址,就不公布了)
若是想要使用Private Pub,须要以下的设置:
$ export PUB_HOSTED_URL=******
复制代码
设置完成后就可使用Private Pub了,Pub其余的使用都不变。
最后咱们Flutter的工程结构以下:
最后咱们的开发流程以下:
单一功能的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的开发,也有利于咱们的组件重用和提升开发效率!