Flutter混合工程管理的兩種模式
-
混合模式
將Flutter部分代碼作為一個module引入,該方案開發體驗好,但是耦合性高,所有團隊成員都要配置Flutter環境
-
產物模式
Android端將Flutter部分代碼編譯成aar,集成到主工程,該方案開發調試體驗差,耦合性低,不需要團隊其他成員配置Flutter環境
-
總結
混合模式 | 產物模式 | |
---|---|---|
優點 | 便于開發和調試 | 耦合度低,不需要開發Flutter需求則無需配置Flutter環境 |
缺點 | 耦合度高,所有項目成員都要配置Flutter環境 | 不利于開發調試 |
方案優化
-
問題
有沒有一種方案,既能夠同時兼顧Flutter開發人員的效率,又對主工程沒有侵入呢?
-
解決思路
我想到了gradle,這是Android項目打包和編譯的一個工具,基于Groovy的一種DSL的項目配置,如果通過全局開關,動態地讓開發人員選擇上面兩種模式,是否可行呢,試試就知道了
解決步驟
1. 在Android項目的主工程MyApp/下,新建一個config.gradle文件
ext {
compile = ['isBuildFlutter': true,]
}
2. 在MyApp/app/build.gradle文件中,區分產物和混合模式
repositories {
flatDir {
dirs 'libs'
}
//以aar方式集成
if (!rootProject.ext.compile['isBuildFlutter']) {
maven {
url '../../flutter_module/build/host/outputs/repo'
}
maven {
url 'http://download.flutter.io'
}
}
}
buildTypes {
if (!rootProject.ext.compile['isBuildFlutter']) {
profile {
matchingFallbacks = ['debug', 'release']
}
}
}
dependencies{
if (rootProject.ext.compile['isBuildFlutter']) {
implementation project(':flutter')
compile project(path: ':flutter_boost')
} else {
debugImplementation 'com.example.flutter_module:flutter_debug:1.0'
profileImplementation 'com.example.flutter_module:flutter_profile:1.0'
releaseImplementation 'com.example.flutter_module:flutter_release:1.0'
}
}
3. 在setting.gradle文件中,區分產物和混合模式
buildscript {
apply from: 'config.gradle'
if (ext.compile['isBuildFlutter']) {
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // new
'honey_flutter/.android/include_flutter.groovy' // new
))
include ':flutter_module'
project(':flutter_module').projectDir = new File('../flutter_module')
}
}
以上思路比較清晰,步驟看起來不多,但是在嘗試的時候還是有很多坑的
使用方式
1. 將Android主工程和Flutter模塊放在同一級目錄下,如下:
image.png
2. 產物模式(aar)接入
- 將config.gradle中的isBuildFlutter設置false
- 如果沒有aar產物,則到flutter_module下,執行flutter build aar
3. 混合模式接入
- 將config.gradle中的isBuildFlutter設置為true
- 到flutter_module下,執行flutter packages get
- 回到主工程重新編譯即可