创建 Flutter 应用的不同版本
- 什么是版本
- 环境设置
- 在 iOS 和 macOS 中创建版本
- 在 iOS 和 macOS 中使用版本
- 在 Android 中使用版本
- 设置启动配置
- 启动你的应用版本
- 在运行时检索你的应用版本
- 基于版本有条件地捆绑资源
- 更多信息
什么是版本
#你是否想过如何在你的 Flutter 应用中设置不同的环境?版本(在 iOS 和 macOS 中称为 构建配置 )允许你(开发者)使用相同的代码库为你的应用创建单独的环境。例如,你可能有一个版本用于你的成熟的生产应用,另一个版本是有限的“免费”应用,另一个版本用于测试实验性功能,等等。
假设你想制作你的 Flutter 应用的免费版和付费版。你可以使用版本来设置这两个应用版本,而无需编写两个单独的应用。例如,免费版应用具有基本功能和广告。相比之下,付费版具有基本应用功能、额外功能、付费用户的不同样式以及无广告。
你也可以使用版本进行功能开发。如果你已经构建了一个新功能并想尝试一下,你可以设置一个版本来测试它。你的生产代码保持不变,直到你准备好部署你的新功能。
版本允许你定义编译时配置并设置在运行时读取的参数,以自定义你的应用的行为。
本文档将指导你为 iOS、macOS 和 Android 设置 Flutter 版本。
环境设置
#先决条件:
- 已安装 Xcode
- 现有的 Flutter 项目
要在 iOS 和 macOS 中设置版本,你将在 Xcode 中定义构建配置。
在 iOS 和 macOS 中创建版本
#在 Xcode 中打开你的项目。
从菜单中选择 产品 >方案> 新建方案 以添加一个新的方案。
- 方案描述了 Xcode 如何运行不同的操作。对于本指南的目的,示例 版本 和_方案_名为
free
。free
方案中的构建配置具有-free
后缀。
- 方案描述了 Xcode 如何运行不同的操作。对于本指南的目的,示例 版本 和_方案_名为
复制构建配置以区分已经可用的默认配置和
free
方案的新配置。- 在 配置 下拉列表末尾的 信息 选项卡下,单击加号按钮并复制每个配置名称(调试、发布和概要文件)。为每个环境复制现有配置一次。
为了匹配 free 版本,在每个新配置名称的末尾添加
-free
。更改
free
方案以匹配已创建的构建配置。- 在Runner项目中,单击管理方案…,将打开一个弹出窗口。
- 双击 free 方案。在下一步(如屏幕截图所示),你将修改每个方案以匹配其 free 构建配置:
在 iOS 和 macOS 中使用版本
#现在你已经设置了你的 free 版本,例如,你可以为每个版本添加不同的产品捆绑包标识符。 捆绑包标识符 唯一标识你的应用程序。在此示例中,我们将Debug-free值设置为com.flavor-test.free
。
更改应用捆绑包标识符以区分方案。在 产品捆绑包标识符 中,将
.free
附加到每个 -free 方案值。在 构建设置 中,将 产品名称 值设置为与每个版本匹配。例如,添加 Debug Free。
将显示名称添加到Info.plist。将 捆绑包显示名称 值更新为
$(PRODUCT_NAME)
。
现在你已经通过在 Xcode 中创建一个free
方案并设置该方案的构建配置来设置你的版本。
有关更多信息,请跳至本文档末尾的启动你的应用版本部分。
插件配置
#如果你的应用使用 Flutter 插件,你需要更新ios/Podfile
(如果针对 iOS 开发)和macos/Podfile
(如果针对 macOS 开发)。
- 在
ios/Podfile
和macos/Podfile
中,将 调试 、概要文件 和 发布的默认值更改为与free
方案的 Xcode 构建配置匹配。
project 'Runner', {
'Debug-free' => :debug,
'Profile-free' => :release,
'Release-free' => :release,
}
在 Android 中使用版本
#可以在项目的build.gradle文件中设置 Android 版本。
在你的 Flutter 项目中,导航到android/app/build.gradle。
创建一个
flavorDimension
来分组你添加的产品版本。Gradle 不会组合共享相同dimension
的产品版本。添加一个包含所需版本的
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文件中,为每个版本添加一个配置对象。每个配置都有一个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 中设置一个运行配置。
启动你的应用版本
#- 设置版本后,修改lib/main.dart中的 Dart 代码以使用这些版本。
- 使用命令行中的
flutter run --flavor free
或在你的 IDE 中测试设置。
有关iOS、macOS和Android的构建版本的示例,请查看Flutter 仓库中的集成测试示例。
在运行时检索你的应用版本
#在你的 Dart 代码中,你可以使用appFlavor
API 来确定你的应用使用哪个版本构建。
基于版本有条件地捆绑资源
#如果你不熟悉如何将资源添加到你的应用中,请参阅添加资源和图像。
如果你的应用中只有特定版本中使用的资源,你可以将它们配置为仅在为该版本构建时才捆绑到你的应用中。这可以防止你的应用包大小因未使用的资源而膨胀。
这是一个示例:
flutter:
assets:
- assets/common/
- path: assets/free/
flavors:
- free
- path: assets/premium/
flavors:
- premium
在此示例中,当在flutter run
或flutter build
期间构建应用时,assets/common/
目录中的文件将始终被捆绑。assets/free/
目录中的文件 仅 在--flavor
选项设置为free
时才被捆绑。类似地,assets/premium
目录中的文件 仅 当--flavor
设置为premium
时才被捆绑。
更多信息
#有关创建和使用版本的更多信息,请查看以下资源:
- 在 Flutter(Android 和 iOS)中使用不同的 Firebase 项目构建版本 Flutter Ready to Go
- Flutter 应用程序的版本(Android 和 iOS)
- 如何使用 FlutterFire CLI 设置具有多个版本的 Flutter 和 Firebase
包
#对于支持创建版本的包,请查看以下内容:
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。