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
  • 回到主工程重新編譯即可
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。