Flutter與Android混合編碼配置筆記

學習Flutter一小段時間,對純Flutter項目有了一些基本的瞭解,但更趨近實際開發的應該是將Flutter模塊做爲一個依賴庫添加到原生的Android項目中。android

本文筆者將嘗試分享我的針對FlutterAndroid混編時的配置步驟,以及踩坑過程。git

1、初始化Flutter-Module

參考 官方文檔 ,首先須要確認Flutter-Module依賴庫文件夾的位置,簡單來講,這裏有兩種方式:github

  • 1.建立在項目的根目錄下(內部);
  • 2.建立和項目文件夾的同一層級(外部),這也是官方推薦的方式。

其實這些方式沒什麼區別,可是我的更傾向於第二種,咱們在項目文件夾的目錄層級下對Flutter-Module文件夾進行 建立初始化shell

$ flutter create -t module module_flutter
複製代碼

成功後,Flutter-ModuleAndroid項目自己應該是這樣的(紅框內的兩個項目):bootstrap

2、配置Android項目

接下來咱們須要將這個項目和剛剛建立的module-flutter進行依賴,咱們先打開Android原生項目,併爲項目根目錄下的settings.gradle文件中添加以下配置:api

setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.parentFile,
        'module_flutter/.android/include_flutter.groovy'
))
複製代碼

若是module-flutter模塊是建立在項目內部,那麼須要稍微改一改:bash

setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.path,
        'module_flutter/.android/include_flutter.groovy'
))
複製代碼

而後,咱們須要打開appbuild.gradle文件,添加對flutter的依賴:微信

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.annotation:annotation:1.0.0'

    ......

    implementation project(':flutter')
}
複製代碼

這樣,對於簡單的Android原生項目而言,Flutter已經配置成功了。app

3、AndroidX的遷移

因爲筆者的項目遷移了AndroidX, 可是低版本的Flutter命令生成的module默認依賴的是support包, 所以咱們須要將默認support的依賴手動遷移到AndroidXpost

截止筆者發文前,FlutterV1.7已經提供了對AndroidX的支持,當建立 Flutter 項目的時候,你能夠經過添加 --androidx 來確保生成的項目文件支持AndroidX,詳情參考這裏

手動遷移的方式有兩種:

  • 1.經過Android Studio 自動遷移 過去。

首先經過Android Studio打開flutter-module,這時候是不能直接遷移AndroidX的,須要經過flutter - Open Android module in AS 方式新打開一個窗口。

這樣編譯成功後,就能夠點擊Refactor - Migrate to AndroidX進行遷移了,後續步驟網上有不少,不贅述。

  • 2.手動配置過去,這個方式也很簡單,打開Flutter-build.gradle文件,對依賴進行更新:
android {
    //...
    defaultConfig {
      // ...
      testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }
   // ...
 }

dependencies {
    testImplementation 'junit:junit:4.12'
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.annotation:annotation:1.0.0'

    // ...
}
複製代碼

手動配置網上有不少博客,不贅述。

須要注意的是,必定要保證Flutter模塊中對AndroidX相關依賴的版本和實際原生項目中相關依賴的版本是一致的,不然可能會致使依賴衝突。

4、多模塊項目的配置

上文說到,簡單的項目已經配置完畢了,可是多模塊的項目來講則稍顯複雜,好比筆者的項目:

首先,須要在底層library(本文中是library-core)的build.gradle文件中添加對flutter的依賴:

dependencies {
    // ...
    api project(':flutter')
}
複製代碼

添加以後並進行同步,原生的項目就會對settings.gradle文件中指向的module-flutter文件夾進行依賴。

同步、編譯成功後,我運行了項目,但我很快遇到了問題:

[ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
[ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
[ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
[FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
複製代碼

這個問題糾結了好久,最後在 這個issue中 找到了答案:

@yk3372 大佬提示,原來是覺得項目中配置了ProductFlavors, 所以,Flutter模塊中對應的build.gradle文件也須要進行對應的配置,好比這樣:

buildTypes {
    release {}
    debug {}
}
flavorDimensions "environment"
productFlavors {
    dev {}
    qa {}
    prod {}
}
複製代碼

配置好以後,還須要手動將相關moduleProductFlavors配置相同,不然會提示一堆錯誤,好比個人一個原生的module依賴了fluttermodule,它們就必須都保持同一個狀態:

???這是否是意味着全部的modulebuild.gradle都配置相同的productFlavors信息?

實踐給予我答案,是的。

雖然折騰了好久,還好前人栽樹,後人乘涼,解決了問題仍是happy ending, Github大法好。

最後:更多Flutter混合開發姿式

本文提供了 官方文檔 提供混合開發的集成方式,實際上,國內不少大廠都分享過相關的技術文章,這裏也一併放出來:


關於我

Hello,我是卻把清梅嗅,若是您以爲文章對您有價值,歡迎 ❤️,也歡迎關注個人博客或者Github

若是您以爲文章還差了那麼點東西,也請經過關注督促我寫出更好的文章——萬一哪天我進步了呢?

相關文章
相關標籤/搜索