前言
《Flutter混合开发专题一》中我们介绍了Flutter官方提供的混合开发解决方案,但是其存在着一些问题并没有解决,比如原生和Flutter页面叠加跳转由于Flutter Engine重复创建而导致内存暴增的问题、Flutter应用中全局变量在各独立页面不能共享的问题、iOS平台内存泄露的问题等等,目前官方在混合开发解决方案上并没有花太多的时间去改进优化。
国内很多大厂在去年已经开始研究Flutter,并在现有项目中完成了集成,其中阿里闲鱼团队研究比较早且投入精力比较大,闲鱼APP在2018年就已经集成了Flutter,且最初用在了打开最多的商品详情页面,前期闲鱼为了解决混合开发的问题开发了一套混合开发插件hybridstackmanager,项目开源地址为https://github.com/alibaba-flutter/hybridstackmanager,该方案的一个特点是具有侵入性,需要修改Flutter框架的源码,且在复杂的页面场景中有一定局限性,因此,闲鱼团队接下来开发了新一代混合开发技术方案FlutterBoost,并在今年3月初进行了开源。
FlutterBoost介绍
点击查看闲鱼团队的文章了解FlutterBoost详细介绍
https://mp.weixin.qq.com/s/v-wwruadJntX1n-YuMPC7g
FlutterBoost集成
由于FlutterBoost封装成了插件,所以集成是非常简单的,只需要对工程进行少量代码接入即可。下面以一个Demo工程为例详细了解一下接入方式。
例子工程
我们有一个原生Android项目FBDemo
,需要基于此项目引入Flutter开发新的页面,我们可以在FBDemo同级目录创建一个Flutter module项目,取名为flutter_boost_module
,将Flutter module项目引入集成到原生项目中,集成方式参考《Flutter混合开发专题一》。这时我们就可以在Flutter module项目中开发新的Flutter页面了。下面就集成FlutterBoost的方式分步说明
Flutter module项目集成FlutterBoost
在flutter_boost_module
项目的pubspec.yaml文件中添加依赖插件配置
dependencies:
flutter_boost: ^0.0.411
配置完成后执行flutter packages get
命令下载依赖插件到本地。
安卓原生项目中集成FlutterBoost
Flutter module项目引入FlutterBoost插件后,在Android studio中同步原生工程,同步完成后项目结构如下
然后我们就可以引入FlutterBoost的安卓工程代码了,在app目录下的build.gradle中添加以下项目依赖
dependencies {
...
implementation project(':flutter_boost')
}
Flutter module项目使用FlutterBoost
假设我们使用Flutter创建两个页面Widget:FirstPage
和SecondPage
。
首先我们需要在main方法中运行的rootWidget中注册这两个页面。
@override
void initState() {
super.initState();
FlutterBoost.singleton.registerPageBuilders({
'flutterbus://flutterFirstPage': (pageName, params, _) {
print("first flutterPage params:$params");
...
return FirstPage();
},
'flutterbus://flutterSecondPage': (pageName, params, _) {
print("second flutterPage params:$params");
...
return SecondPage();
},
});
FlutterBoost.handleOnStartPage();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Boost example',
builder: FlutterBoost.init(),
home: Container());
}
安卓原生项目中使用FlutterBoost
Flutter引擎加载及FlutterBoostPlugin初始化
首先,根据FlutterBoost给的例子我们原生项目的Application需要继承FlutterApplication
,其实这个不是必须的,FlutterApplication
中主要是在onCreate方法中初始化加载flutter.so库,该操作我们可以在适当的地方自己来加即可。
其次,FlutterBoost的example中在自定义的Application的onCreate方法中初始化FlutterBoostPlugin,这个我们可以提取出来放到一个单独的类里。
基于以上两点我实现了一个工具类用来执行FlutterBoost的初始化
public class FlutterMediator {
public static void init(final Application app) {
//此处必须启动初始化,主要是载入Flutter引擎文件
FlutterMain.startInitialization(app);
FlutterBoostPlugin.init(new IPlatform() {