创建 Flutter 应用的 Flavors
- 什么是 Flavors
- 环境设置
- 在 iOS 和 macOS 中创建 Flavors
- 在 iOS 和 macOS 中使用 Flavors
- 在 Android 中使用 Flavors
- 设置启动配置
- 启动您的应用 Flavors
- 在运行时获取应用的 Flavor
- 根据 Flavor 有条件地打包资源
- 更多信息
什么是 Flavors
#您是否曾经想过如何在 Flutter 应用中设置不同的环境?Flavors(在 iOS 和 macOS 中称为构建配置)允许您(开发人员)使用相同的代码库为您的应用创建单独的环境。例如,您可能有一个用于完整生产应用的 Flavor,另一个用于有限的“免费”应用,另一个用于测试实验功能,等等。
假设您想制作 Flutter 应用的免费版和付费版。您可以使用 Flavors 设置这两个应用版本,而无需编写两个单独的应用。例如,应用的免费版具有基本功能和广告。相反,付费版具有基本应用功能、额外功能、付费用户的不同样式以及无广告。
您还可以将 Flavors 用于功能开发。如果您构建了一个新功能并想尝试一下,您可以设置一个 Flavor 来测试它。您的生产代码在您准备好部署新功能之前保持不受影响。
Flavors 允许您定义编译时配置并设置在运行时读取的参数,以自定义应用的行为。
本文档指导您为 iOS、macOS 和 Android 设置 Flutter Flavors。
环境设置
#先决条件
- 已安装 Xcode
- 一个现有的 Flutter 项目
要在 iOS 和 macOS 中设置 Flavors,您将在 Xcode 中定义构建配置。
在 iOS 和 macOS 中创建 Flavors
#在 Xcode 中打开您的项目。
从菜单中选择产品 > 方案 > 新建方案以添加新的
方案
。- 方案描述了 Xcode 如何运行不同的操作。在本指南中,示例Flavor和方案名为
free
。free
方案中的构建配置具有-free
后缀。
- 方案描述了 Xcode 如何运行不同的操作。在本指南中,示例Flavor和方案名为
复制构建配置以区分已有的默认配置和
free
方案的新配置。- 在配置下拉列表末尾的信息选项卡下,单击加号按钮并复制每个配置名称(调试、发布和概要分析)。为每个环境复制现有配置一次。
要匹配 free Flavor,请在每个新配置名称的末尾添加
-free
。更改
free
方案以匹配已创建的构建配置。- 在Runner项目中,单击管理方案…,然后会打开一个弹出窗口。
- 双击 free 方案。在下一步(如屏幕截图所示),您将修改每个方案以使其与 free 构建配置匹配。
在 iOS 和 macOS 中使用 Flavors
#现在您已设置了 free Flavor,例如,您可以为每个 Flavor 添加不同的产品包标识符。包标识符唯一标识您的应用程序。在此示例中,我们将Debug-free值设置为等于com.flavor-test.free
。
更改应用包标识符以区分方案。在产品包标识符中,将
.free
附加到每个 -free 方案值。在构建设置中,将产品名称值设置为与每个 Flavor 匹配。例如,添加调试免费。
将显示名称添加到Info.plist。将捆绑显示名称值更新为
$(PRODUCT_NAME)
。
现在您已通过在 Xcode 中创建free
方案并为该方案设置构建配置来设置了 Flavor。
有关更多信息,请跳至本文档末尾的启动您的应用 Flavors部分。
插件配置
#如果您的应用使用 Flutter 插件,则需要更新ios/Podfile
(如果开发用于 iOS)和macos/Podfile
(如果开发用于 macOS)。
- 在
ios/Podfile
和macos/Podfile
中,将Debug、Profile和Release的默认值更改为与free
方案的 Xcode 构建配置匹配。
project 'Runner', {
'Debug-free' => :debug,
'Profile-free' => :release,
'Release-free' => :release,
}
在 Android 中使用 Flavors
#可以在项目的build.gradle文件中设置 Android 的 Flavors。
在您的 Flutter 项目中,导航到android/app/build.gradle。
创建一个
flavorDimension
来对您添加的产品 Flavors 进行分组。Gradle 不会组合共享相同dimension
的产品 Flavors。添加一个带有所需 Flavors 的
productFlavors
对象,以及dimension、resValue和applicationId或applicationIdSuffix的值。- 每个构建的应用程序名称位于resValue中。
- 如果您指定了applicationIdSuffix而不是applicationId,则它将附加到“基本”应用程序 ID。
android {
// ...
flavorDimensions += "default"
productFlavors {
create("free") {
dimension = "default"
resValue(type = "string", name = "app_name", value = "free flavor example")
applicationIdSuffix = ".free"
}
}
}
android {
// ...
flavorDimensions "default"
productFlavors {
free {
dimension "default"
resValue "string", "app_name", "free flavor example"
applicationIdSuffix ".free"
}
}
}
设置启动配置
#接下来,添加一个launch.json文件;这允许您运行命令flutter run --flavor [环境名称]
。
在 VSCode 中,按如下方式设置启动配置
- 在项目的根目录中,添加一个名为.vscode的文件夹。
- 在.vscode文件夹中,创建一个名为launch.json的文件。
- 在launch.json文件中,为每个 Flavor 添加一个配置对象。每个配置都有一个name、request、type、program和args键。
{
"version": "0.2.0",
"configurations": [
{
"name": "free",
"request": "launch",
"type": "dart",
"program": "lib/main_development.dart",
"args": ["--flavor", "free", "--target", "lib/main_free.dart" ]
}
],
"compounds": []
}
您现在可以运行终端命令flutter run --flavor free
,也可以在 IDE 中设置运行配置。
启动您的应用 Flavors
#- 设置好 Flavors 后,修改lib / main.dart中的 Dart 代码以使用 Flavors。
- 使用命令行中的
flutter run --flavor free
或 IDE 中的命令测试设置。
有关iOS、macOS和Android的构建 Flavors 示例,请查看Flutter 仓库中的集成测试示例。
在运行时获取应用的 Flavor
#在您的 Dart 代码中,您可以使用appFlavor
API 来确定您的应用使用哪个 Flavor 构建。
根据 Flavor 有条件地打包资源
#如果您不熟悉如何在应用中添加资源,请参阅添加资源和图像。
如果您的应用中有一些仅在特定 Flavor 中使用的资源,您可以将它们配置为仅在为该 Flavor 构建应用时才捆绑到您的应用中。这可以防止您的应用包大小因未使用的资源而膨胀。
这是一个示例
flutter:
assets:
- assets/common/
- path: assets/free/
flavors:
- free
- path: assets/premium/
flavors:
- premium
在此示例中,assets/common/
目录中的文件将在flutter run
或flutter build
期间构建应用时始终被捆绑。assets/free/
目录中的文件仅在--flavor
选项设置为free
时才被捆绑。类似地,assets/premium
目录中的文件仅在--flavor
设置为premium
时才被捆绑。
更多信息
#有关创建和使用 Flavors 的更多信息,请查看以下资源
- 使用不同 Firebase 项目为每个 Flavor 创建 Flutter 的构建 Flavor(Android 和 iOS)Flutter 随时可用
- Flutter 应用的 Flavor(Android 和 iOS)
- 如何使用 FlutterFire CLI 设置 Flutter 和 Firebase 以及多个 Flavors
包
#对于支持创建 Flavors 的包,请查看以下内容
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-10-24。 查看源代码 或 报告问题.