Android原生項(xiàng)目集成Flutter Module方案
一.使用Android Studio創(chuàng)建Flutter module
1.打開Android Studio選擇“start a new Flutter project”

2.選擇Flutter Module點(diǎn)擊“Next”

3.點(diǎn)擊“Next”,點(diǎn)擊“finish”

二.打.aar文件
$cd .android
$./gradlew flutter:assembleDebug (Debug測(cè)試包)
$./gradlew flutter:assembleRelease (Release正式包)
成功執(zhí)行后,會(huì)在.android/Flutter/build/outputs/aar/目錄下,創(chuàng)建一個(gè)flutter-debug.aar的包文件
三.項(xiàng)目中引入Flutter Model
1. aar文件引入
implementation(name: 'flutter-debug', ext: 'aar')

2.直接引入Module
在項(xiàng)目的setting.gradle加上如下代碼:
setBinding(new Binding([gradle: this]))
evaluate(new File( settingsDir.parentFile, '<module_name>/.android/include_flutter.groovy' ))
然后需要在build.gradle(app)中加入如下依賴:
implementation project(':flutter')
四.項(xiàng)目中使用Flutter
Flutter中的widget等控件or布局,對(duì)于android或iOS來說是透明的,平臺(tái)只會(huì)認(rèn)為整個(gè)Flutter展示的內(nèi)容是一個(gè)view。
所以在android中的用Flutter,就是用一個(gè)view去承載Flutter項(xiàng)目。
其實(shí)可以理解為flutter就是一個(gè)提供了各種繪制方法的view,在Flutter里面的操作就是對(duì)view的onDraw方法的控制(還有touch事件)
所以直接當(dāng)做view去使用的話,就是這樣:

對(duì)應(yīng)的Flutter的lib中main.dart文件內(nèi)容是這樣:

window.defaultRouteName會(huì)接受到主項(xiàng)目中傳入的路由路徑,然后返回對(duì)應(yīng)的widget的,之后這個(gè)view就完全可以當(dāng)做一整個(gè)Flutter app去對(duì)待了。但它的生命周期是由Activity管理的,所以Flutter也可以用Fragment去承載:
FragmentTransaction tx = fragmentActivity.getSupportFragmentManager().beginTransaction();
tx.replace(R.id.someContainer, Flutter.createFragment("route1"));
tx.commit();
補(bǔ)充
集成到項(xiàng)目工程中時(shí)遇到兩個(gè)問題。
1.一個(gè)是Flutter不支持armeabi,而我們項(xiàng)目中庫都是armeabi的,只能通過將armeab-v7a強(qiáng)行打入armeabi來處理,這樣帶來的問題是某些不支持armeabi-v7a的cpu設(shè)備會(huì)無法運(yùn)行。(打包只配置armeab-v7a可以減少包的小大)
2.另一個(gè)就是編譯時(shí)出現(xiàn)錯(cuò)誤:沒有初始化虛擬機(jī),嘗試了各種方法,后來發(fā)現(xiàn)前面的編譯指令應(yīng)該去掉flutter:,否則不會(huì)打包flutter_assets,
$ ./gradlew assembleDebug