Flutter混合工程管理

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
  • 回到主工程重新编译即可

你可能感兴趣的:(Flutter混合工程管理)