将 Flutter 模块集成到您的 Android 项目中
了解如何将 Flutter 模块集成到您现有的 Android 项目中。
Flutter 可以作为源代码 Gradle 子项目或 AAR 包嵌入到您现有的 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 项目。
-
转到 文件 > 新建 > 新项目...。将显示 新项目 对话框。
点击 Flutter。
-
如果要求您提供 Flutter SDK 路径,请提供并点击 下一步。
-
完成 Flutter 模块的配置。
如果您已有现有项目
- 要选择现有项目,请点击 项目位置 框右侧的 ...。
- 导航到您的 Flutter 项目目录。
- 点击 Open。
如果您需要创建新的 Flutter 项目
- 完成配置对话框。
- 在 项目类型 菜单中,选择 模块。
点击 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 模块的精简独立版本,并使用 flutter run,同时它也是一个有助于引导 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 模块作为依赖项
#将 Flutter 模块作为 Gradle 中现有应用程序的依赖项添加。您可以通过两种方式实现这一点。
-
Android 归档文件 AAR 机制创建通用的 Android AAR 作为中间件,对您的 Flutter 模块进行打包。当您的下游应用程序构建者不希望安装 Flutter SDK 时,这很有用。但是,如果您经常构建,它会增加一个额外的构建步骤。
-
模块源代码 源代码子项目机制是一个便捷的一键构建过程,但需要 Flutter SDK。这是 Android Studio IDE 插件使用的机制。
依赖于 Android 归档文件 (AAR)
#此选项将您的 Flutter 库打包为通用的本地 Maven 存储库,该存储库由 AAR 和 POM 工件组成。此选项允许您的团队构建主机应用程序,而无需安装 Flutter SDK。然后,您可以从本地或远程存储库分发工件。
假设您在 some/path/flutter_module 处构建了一个 Flutter 模块,然后运行
cd some/path/flutter_module
flutter build aar
然后,按照屏幕上的说明进行集成。
更具体地说,此命令创建(默认情况下,所有调试/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。
将 flutter 模块作为主机应用程序的依赖项包含在 app/build.gradle 文件中。
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 依赖项配置添加到同一级别的 app-level 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 的评估上下文中 include 自身(作为 :flutter)以及模块使用的任何 Flutter 插件(例如 :package_info 和 :video_player)。
更新 app/build.gradle
#
从您的应用程序中引入对 Flutter 模块的 implementation 依赖项
dependencies {
implementation(project(":flutter"))
}
您的应用程序现在将 Flutter 模块作为依赖项包含。
继续阅读 将 Flutter 屏幕添加到 Android 应用程序 指南。