Flutter 可以逐個部分嵌入到您現有的 Android 應用程式中,作為原始碼 Gradle 子專案或作為 AAR。

可以使用 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. 轉到 **檔案** > **新建** > **新建專案...**。將顯示 **新建專案** 對話方塊。

  3. 點選 **Flutter**。

  4. 如果系統要求您提供 **Flutter SDK 路徑**,請填寫該路徑並點選 **下一步**。

  5. 完成 Flutter 模組的配置。

    • 如果您有現有專案

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

      1. 完成配置對話方塊。
      2. 在 **專案型別** 選單中,選擇 **模組**。
  6. 點選 Finish(完成)。

不使用 Android Studio 進行整合

#

要手動將 Flutter 模組整合到現有的 Android 應用中,而不使用 Flutter 的 Android Studio 外掛,請按照以下步驟操作:

建立 Flutter 模組

#

假設您有一個現有的 Android 應用位於 some/path/MyApp,並且您希望您的 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 11 或更高版本。

在嘗試將 Flutter 模組專案連線到宿主 Android 應用之前,請確保您的宿主 Android 應用在您的應用的 build.gradle 檔案中,位於 android { } 塊下,聲明瞭以下源相容性:

MyApp/app/build.gradle
groovy
android {
    // ...
    compileOptions {
        sourceCompatibility = 11 // The minimum value
        targetCompatibility = 11 // 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 模組新增為依賴項

#

將 Flutter 模組新增為您現有應用的 Gradle 依賴項。您可以透過兩種方式實現此目的。

  1. Android 存檔 AAR 機制建立通用的 Android AAR 作為中介軟體,用於打包您的 Flutter 模組。當您的下游應用程式構建者不想安裝 Flutter SDK 時,這非常有用。但它會增加一次構建步驟,如果您經常構建的話。

  2. 模組原始碼 原始碼子專案機制是一個方便的一鍵式構建過程,但需要 Flutter SDK。這是 Android Studio IDE 外掛使用的機制。

依賴 Android 存檔 (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")
    }
}
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。

在 Android 專案的 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 ID 是一個自定義 configuration,需要在宿主專案的 app/build.gradle 檔案中實現。

host-project/app/build.gradle.kts
kotlin
configurations {
    getByName("profileImplementation") {
    }
}
MyApp/settings.gradle.kts
kotlin
include(":app")

dependencyResolutionManagement {
    repositories {
        maven(url = "https://storage.googleapis.com/download.flutter.io")
        maven(url = "some/path/flutter_module_project/build/host/outputs/repo")
    }
}

依賴模組的原始碼

#

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

更新 settings.gradle

#

在宿主應用的 settings.gradle 中包含 Flutter 模組作為子專案。此示例假設 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 模組將其自身(作為 :flutter)以及模組使用的任何 Flutter 外掛(例如 :package_info:video_playerinclude 到您的 settings.gradle 的評估上下文中。

更新 app/build.gradle

#

在您的應用中引入對 Flutter 模組的 implementation 依賴項。

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

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

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