跳到主內容

將 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 模組新增為依賴項。

  1. 在 Android Studio 中開啟您的 Android 專案。

  2. 轉到 File > New > New Project...。此時會顯示 New Project 對話方塊。

  3. 點選 Flutter

  4. 如果提示提供 Flutter SDK path,請輸入路徑並點選 Next

  5. 完成 Flutter 模組的配置。

    • 如果您已有現有的專案

      1. 要選擇現有專案,請點選 Project location 框右側的 ...
      2. 導航到您的 Flutter 專案目錄。
      3. 點選 Open
    • 如果您需要建立新的 Flutter 專案

      1. 完成配置對話方塊。
      2. Project type 選單中,選擇 Module
  6. 點選 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 { } 程式碼塊下聲明瞭以下源相容性。

MyApp/app/build.gradle
groovy
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 應用之前,請對您的宿主應用進行以下更改:

  1. 移除所有應用 build.gradle 檔案中的 repositories 程式碼塊。

    groovy
    // Remove the following block, starting on the next line
        repositories {
            google()
            mavenCentral()
        }
    // ...to the previous line
    
  2. 將此步驟中顯示的 dependencyResolutionManagement 新增到 settings.gradle 檔案中。

settings.gradle.kts
kotlin
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")
    }
}
settings.gradle
groovy
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 模組新增為現有應用的依賴項。您可以透過兩種方式實現這一點。

  1. Android Archive (AAR):AAR 機制建立通用的 Android AAR 作為封裝您 Flutter 模組的中介軟體。當您的下游應用構建者不想安裝 Flutter SDK 時,此方法非常有效。但如果您頻繁構建,它會增加一個額外的構建步驟。

  2. 模組原始碼:原始碼子專案機制是一種便捷的一鍵構建過程,但需要安裝 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,使其包含本地倉庫和依賴項:

settings.gradle.kts
kotlin
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")
    }
}
settings.gradle
groovy
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 模組包含為依賴項。

MyApp/app/build.gradle.kts
kotlin
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 檔案的末尾。

MyApp/app/build.gradle.kts
kotlin
configurations {
    getByName("profileImplementation") {
    }
}

依賴模組原始碼

#

此選項可同時為您的 Android 專案和 Flutter 專案實現一步構建。當您同時處理這兩部分並進行快速迭代時,此選項很方便,但您的團隊必須安裝 Flutter SDK 才能構建宿主應用。

更新 settings.gradle

#

將 Flutter 模組作為子專案包含在宿主應用的 settings.gradle 中。此示例假設 flutter_moduleMyApp 存在於同一目錄中:

如果您正在使用 Kotlin,請應用以下更改:

MyApp/settings.gradle.kts
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,請應用以下更改:

MyApp/settings.gradle
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 依賴:

MyApp/app/build.gradle
groovy
dependencies {
    implementation(project(":flutter"))
}

現在,您的應用已將 Flutter 模組作為依賴項包含在內。

繼續閱讀將 Flutter 螢幕新增到 Android 應用指南。