android工程引入model,Android原生项目集成Flutter Module方案

Android原生项目集成Flutter Module方案

一.使用Android Studio创建Flutter module

1.打开Android Studio选择“start a new Flutter project”

image.png

2.选择Flutter Module点击“Next”

image.png

3.点击“Next”,点击“finish”

image.png

二.打.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')

image.png

2.直接引入Module

在项目的setting.gradle加上如下代码:

setBinding(new Binding([gradle: this]))

evaluate(new File( settingsDir.parentFile, '/.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去使用的话,就是这样:

image.png

对应的Flutter的lib中main.dart文件内容是这样:

image.png

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

你可能感兴趣的:(android工程引入model,Android原生项目集成Flutter Module方案)