學習Flutter
一小段時間,對純Flutter
項目有了一些基本的瞭解,但更趨近實際開發的應該是將Flutter
模塊做爲一個依賴庫添加到原生的Android
項目中。android
本文筆者將嘗試分享我的針對Flutter
與Android
混編時的配置步驟,以及踩坑過程。git
參考 官方文檔 ,首先須要確認Flutter-Module
依賴庫文件夾的位置,簡單來講,這裏有兩種方式:github
其實這些方式沒什麼區別,可是我的更傾向於第二種,咱們在項目文件夾的目錄層級下對Flutter-Module
文件夾進行 建立 並 初始化:shell
$ flutter create -t module module_flutter
複製代碼
成功後,Flutter-Module
和Android
項目自己應該是這樣的(紅框內的兩個項目):bootstrap
接下來咱們須要將這個項目和剛剛建立的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'
))
複製代碼
而後,咱們須要打開app
的build.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
因爲筆者的項目遷移了AndroidX
, 可是低版本的Flutter
命令生成的module
默認依賴的是support
包, 所以咱們須要將默認support
的依賴手動遷移到AndroidX
。post
截止筆者發文前,
Flutter
V1.7已經提供了對AndroidX
的支持,當建立Flutter
項目的時候,你能夠經過添加--androidx
來確保生成的項目文件支持AndroidX
,詳情參考這裏。
手動遷移的方式有兩種:
Android Studio
自動遷移 過去。首先經過Android Studio
打開flutter-module
,這時候是不能直接遷移AndroidX
的,須要經過flutter
- Open Android module in AS
方式新打開一個窗口。
這樣編譯成功後,就能夠點擊Refactor
- Migrate to AndroidX
進行遷移了,後續步驟網上有不少,不贅述。
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
相關依賴的版本和實際原生項目中相關依賴的版本是一致的,不然可能會致使依賴衝突。
上文說到,簡單的項目已經配置完畢了,可是多模塊的項目來講則稍顯複雜,好比筆者的項目:
首先,須要在底層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 {}
}
複製代碼
配置好以後,還須要手動將相關module
的ProductFlavors
配置相同,不然會提示一堆錯誤,好比個人一個原生的module
依賴了flutter
的module
,它們就必須都保持同一個狀態:
???這是否是意味着全部的module
的build.gradle
都配置相同的productFlavors
信息?
實踐給予我答案,是的。
雖然折騰了好久,還好前人栽樹,後人乘涼,解決了問題仍是happy ending
, Github
大法好。
本文提供了 官方文檔 提供混合開發的集成方式,實際上,國內不少大廠都分享過相關的技術文章,這裏也一併放出來:
Hello,我是卻把清梅嗅,若是您以爲文章對您有價值,歡迎 ❤️,也歡迎關注個人博客或者Github。
若是您以爲文章還差了那麼點東西,也請經過關注督促我寫出更好的文章——萬一哪天我進步了呢?