前言
最近在研究android和flutter的混合开发。插件模式调用原生的混合模式已经在项目中使用,也暴露出一些问题,
最突出的问题就是flutter中对webview的支持,会出现各种各样奇怪的问题还没办法解决(也许修改flutter源码可
解决)。所以考虑尝试用原生打开flutter页面的混合方式进行开发。咸鱼团队也推出了这种混合开发模式的框架
flutter boost。下面就是我在使用该框架中遇到的问题以及解决的方法,持续更新
环境说明
开发工具:Android Studio
Flutter版本:2.0.3
Flutter Boost版本:v3.0-hotfixes
集成过程
flutter boost项目地址
先吐槽下,项目介绍里提供的集成说明简陋的一批,按它的方法能成功集成才有鬼
-
创建一个安卓项目:DemoOne
-
给项目添加flutter module:flutter_module(可是使用命令行,也可以用IDE的插件完成,我这边是通过IDE的插件完成的,需要IDE安装flutter和dart两个插件)
添加完成后,settings.gradle和build.gradle会有以下变化
-
将flutter boost以插件的方式配置到flutter_module里
-
在build.gradle中添加flutter boost依赖,如下图
完成上面3步,在真机上运行安卓项目,如果能正常启动,恭喜你,可以继续集成之路了。我运行安卓项目的时候很诡异,第一次能正常启动,我按上面的步骤又搭了一遍项目,报错!!!各种搜不到解决方法,我就在真机上debug运行了flutter_module项目,再运行安卓项目,正常了!!!!!!
- 安卓项目中创建MyApplication类,继承自FlutterApplication(注意,不是原生的Application),然后在onCreate中初始化flutter boost
class MyApplication : FlutterApplication() { override fun onCreate() { super.onCreate() //初始化flutter boost /** * 1.使用ENGINE_ID初始化flutter engine,全局共享一个engine * 2.设置消息代理 */ FlutterBoost.instance().setup(this, MyFlutterBoostDelegate(), null) } }
- 点击按钮打开flutter页面
private lateinit var openFlutterBtn:Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) openFlutterBtn = findViewById(R.id.open_flutter_btn) openFlutterBtn.setOnClickListener { openFlutter() } } private fun openFlutter(){ val params = HashMap<String, Any>() params["test1"] = "v_test1" params["test2"] = "v_test2" val intent = FlutterBoostActivity.CachedEngineIntentBuilder( FlutterBoostActivity::class.java, FlutterBoost.ENGINE_ID ) .backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.opaque) .destroyEngineWithActivity(false) .url("flutterPage") .urlParams(params) .build(this) startActivity(intent) }
针对打开flutter页面,我大概整理了一下关键的几个类和大概的一个流程