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.png2. 产物模式(aar)接入
- 将config.gradle中的isBuildFlutter设置false
- 如果没有aar产物,则到flutter_module下,执行flutter build aar
3. 混合模式接入
- 将config.gradle中的isBuildFlutter设置为true
- 到flutter_module下,执行flutter packages get
- 回到主工程重新编译即可
网友评论