Android原生项目集成Flutter Module方案
一.使用Android Studio创建Flutter module
1.打开Android Studio选择“start a new Flutter project”
2.选择Flutter Module点击“Next”
3.点击“Next”,点击“finish”
二.打.aar文件
$cd .android
$./gradlew flutter:assembleDebug (Debug测试包)
$./gradlew flutter:assembleRelease (Release正式包)
成功执行后,会在.android/Flutter/build/outputs/aar/目录下,创建一个flutter-debug.aar的包文件
三.项目中引入Flutter Model
1. aar文件引入
implementation(name: 'flutter-debug', ext: 'aar')
2.直接引入Module
在项目的setting.gradle加上如下代码:
setBinding(new Binding([gradle: this]))
evaluate(new File( settingsDir.parentFile, '<module_name>/.android/include_flutter.groovy' ))
然后需要在build.gradle(app)中加入如下依赖:
implementation project(':flutter')
四.项目中使用Flutter
Flutter中的widget等控件or布局,对于android或iOS来说是透明的,平台只会认为整个Flutter展示的内容是一个view。
所以在android中的用Flutter,就是用一个view去承载Flutter项目。
其实可以理解为flutter就是一个提供了各种绘制方法的view,在Flutter里面的操作就是对view的onDraw方法的控制(还有touch事件)
所以直接当做view去使用的话,就是这样:
对应的Flutter的lib中main.dart文件内容是这样:
window.defaultRouteName会接受到主项目中传入的路由路径,然后返回对应的widget的,之后这个view就完全可以当做一整个Flutter app去对待了。但它的生命周期是由Activity管理的,所以Flutter也可以用Fragment去承载:
FragmentTransaction tx = fragmentActivity.getSupportFragmentManager().beginTransaction();
tx.replace(R.id.someContainer, Flutter.createFragment("route1"));
tx.commit();
补充
集成到项目工程中时遇到两个问题。
1.一个是Flutter不支持armeabi,而我们项目中库都是armeabi的,只能通过将armeab-v7a强行打入armeabi来处理,这样带来的问题是某些不支持armeabi-v7a的cpu设备会无法运行。(打包只配置armeab-v7a可以减少包的小大)
2.另一个就是编译时出现错误:没有初始化虚拟机,尝试了各种方法,后来发现前面的编译指令应该去掉flutter:,否则不会打包flutter_assets,
$ ./gradlew assembleDebug