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 应用 指南。