將 Flutter 模組整合到您的 Android 專案中
瞭解如何將 Flutter 模組整合到您現有的 Android 專案中。
Flutter 可以作為原始碼 Gradle 子專案或 AAR(Android Archive)分步嵌入到您現有的 Android 應用程式中。
整合流程可以透過 Android Studio IDE 的 Flutter 外掛完成,也可以手動完成。
整合您的 Flutter 模組
#使用 Android Studio 整合
#Android Studio IDE 可以幫助整合您的 Flutter 模組。使用 Android Studio,您可以在同一個 IDE 中編輯 Android 和 Flutter 程式碼。
您還可以使用 IntelliJ Flutter 外掛的功能,例如 Dart 程式碼補全、熱過載和 Widget 檢查器。
為了構建您的應用,Android Studio 外掛會配置您的 Android 專案,將 Flutter 模組新增為依賴項。
在 Android Studio 中開啟您的 Android 專案。
-
轉到 File > New > New Project...。此時會顯示 New Project 對話方塊。
點選 Flutter。
-
如果提示提供 Flutter SDK path,請輸入路徑並點選 Next。
-
完成 Flutter 模組的配置。
如果您已有現有的專案
- 要選擇現有專案,請點選 Project location 框右側的 ...。
- 導航到您的 Flutter 專案目錄。
- 點選 Open。
如果您需要建立新的 Flutter 專案
- 完成配置對話方塊。
- 在 Project type 選單中,選擇 Module。
點選 Finish(完成)。
不使用 Android Studio 整合
#若要手動將 Flutter 模組整合到現有的 Android 應用中(不使用 Flutter 的 Android Studio 外掛),請按照以下步驟操作:
建立 Flutter 模組
#假設您已有一個位於 some/path/MyApp 的現有 Android 應用,並且您希望將 Flutter 專案作為其同級目錄,請執行以下操作:
cd some/path/
flutter create -t module --org com.example flutter_module
這將建立一個 some/path/flutter_module/ Flutter 模組專案,其中包含一些可供上手的 Dart 程式碼和一個 .android/ 隱藏子資料夾。.android 資料夾包含一個 Android 專案,它既可以幫助您透過 flutter run 執行 Flutter 模組的精簡獨立版本,也是一個幫助引導 Flutter 模組作為可嵌入 Android 庫的包裝器。
Java 版本要求
#Flutter 要求您的專案宣告與 Java 17 或更高版本相容。
在嘗試將 Flutter 模組專案連線到宿主 Android 應用之前,請確保您的宿主 Android 應用在其應用的 build.gradle 檔案中的 android { } 程式碼塊下聲明瞭以下源相容性。
android {
// ...
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17 // The minimum value
targetCompatibility = JavaVersion.VERSION_17 // The minimum value
}
// ...
}
集中管理倉庫設定
#從 Gradle 7 開始,Android 建議在 settings.gradle 中使用集中式倉庫宣告,而不是在 build.gradle 檔案中進行專案或模組級別的宣告。
在嘗試將 Flutter 模組專案連線到宿主 Android 應用之前,請對您的宿主應用進行以下更改:
-
移除所有應用
build.gradle檔案中的repositories程式碼塊。groovy// Remove the following block, starting on the next line repositories { google() mavenCentral() } // ...to the previous line -
將此步驟中顯示的
dependencyResolutionManagement新增到settings.gradle檔案中。
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
val storageUrl: String = System.getenv("FLUTTER_STORAGE_BASE_URL") ?: "https://storage.googleapis.com"
repositories {
google()
mavenCentral()
maven("$storageUrl/download.flutter.io")
}
}
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.PREFER_SETTINGS
String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
repositories {
google()
mavenCentral()
maven {
url = uri("$storageUrl/download.flutter.io")
}
}
}
將 Flutter 模組新增為依賴項
#在 Gradle 中將 Flutter 模組新增為現有應用的依賴項。您可以透過兩種方式實現這一點。
-
Android Archive (AAR):AAR 機制建立通用的 Android AAR 作為封裝您 Flutter 模組的中介軟體。當您的下游應用構建者不想安裝 Flutter SDK 時,此方法非常有效。但如果您頻繁構建,它會增加一個額外的構建步驟。
-
模組原始碼:原始碼子專案機制是一種便捷的一鍵構建過程,但需要安裝 Flutter SDK。這是 Android Studio IDE 外掛所使用的機制。
依賴 Android Archive (AAR)
#此選項將您的 Flutter 庫封裝為由 AAR 和 POM 工件組成的通用本地 Maven 倉庫。此選項允許您的團隊在不安裝 Flutter SDK 的情況下構建宿主應用。然後,您可以從本地或遠端倉庫分發這些工件。
假設您在 some/path/flutter_module 構建了一個 Flutter 模組,然後執行:
cd some/path/flutter_module
flutter build aar
然後,按照螢幕上的說明進行整合。
更具體地說,此命令(預設涵蓋所有 debug/profile/release 模式)會建立一個本地倉庫,包含以下檔案:
-
build/host/outputs/repo
com
example
flutter_module
flutter_release
1.0
- flutter_release-1.0.aar
- flutter_release-1.0.aar.md5
- flutter_release-1.0.aar.sha1
- flutter_release-1.0.pom
- flutter_release-1.0.pom.md5
- flutter_release-1.0.pom.sha1
- maven-metadata.xml
- maven-metadata.xml.md5
- maven-metadata.xml.sha1
flutter_profile
- …
flutter_debug
- …
為了依賴 AAR,宿主應用必須能夠找到這些檔案。
為此,請編輯宿主應用中的 settings.gradle,使其包含本地倉庫和依賴項:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
google()
mavenCentral()
maven("https://storage.googleapis.com/download.flutter.io")
maven(url = "<some/path/flutter_module>/build/host/outputs/repo")
}
}
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.PREFER_SETTINGS
repositories {
google()
mavenCentral()
// Add the new repositories starting on the next line...
maven {
url = uri("<some/path/flutter_module>/build/host/outputs/repo")
// This is relative to the location of the build.gradle file
// if using a relative path.
}
maven {
url = uri("https://storage.googleapis.com/download.flutter.io")
}
// ...to before this line
}
}
基於 Kotlin DSL 的 Android 專案
#在完成基於 Kotlin DSL 的 Android 專案的 aar 構建後,按照以下步驟新增 flutter_module。
在宿主應用的 app/build.gradle 檔案中將 Flutter 模組包含為依賴項。
android {
buildTypes {
release {
...
}
debug {
...
}
create("profile") {
initWith(getByName("debug"))
}
}
dependencies {
// ...
debugImplementation("com.example.flutter_module:flutter_debug:1.0")
releaseImplementation("com.example.flutter_module:flutter_release:1.0")
add("profileImplementation", "com.example.flutter_module:flutter_profile:1.0")
}
將自定義 profileImplementation 依賴配置新增到同一個應用級 build.gradle 檔案的末尾。
configurations {
getByName("profileImplementation") {
}
}
依賴模組原始碼
#此選項可同時為您的 Android 專案和 Flutter 專案實現一步構建。當您同時處理這兩部分並進行快速迭代時,此選項很方便,但您的團隊必須安裝 Flutter SDK 才能構建宿主應用。
更新 settings.gradle
#
將 Flutter 模組作為子專案包含在宿主應用的 settings.gradle 中。此示例假設 flutter_module 和 MyApp 存在於同一目錄中:
如果您正在使用 Kotlin,請應用以下更改:
// Include the host app project. Assumed existing content.
include(":app")
// Replace "flutter_module" with whatever package_name you supplied when you ran:
// `$ flutter create -t module [package_name]
val filePath = settingsDir.parentFile.toString() + "/flutter_module/.android/include_flutter.groovy"
apply(from = File(filePath))
如果您正在使用 Groovy,請應用以下更改:
// Include the host app project.
include(":app") // assumed existing content
setBinding(new Binding([gradle: this])) // new
def filePath = settingsDir.parentFile.toString() + "/flutter_module/.android/include_flutter.groovy" // new
apply from: filePath // new
繫結和指令碼評估允許 Flutter 模組在 settings.gradle 的評估上下文中將自身(作為 :flutter)以及模組使用的任何 Flutter 外掛(例如 :package_info 和 :video_player)包含進去。
更新 app/build.gradle
#
在您的應用中引入對 Flutter 模組的 implementation 依賴:
dependencies {
implementation(project(":flutter"))
}
現在,您的應用已將 Flutter 模組作為依賴項包含在內。
繼續閱讀將 Flutter 螢幕新增到 Android 應用指南。