创建 Flutter 应用的版本

什么是版本

您是否曾想过如何在 Flutter 应用中设置不同的环境?风味(在 iOS 和 macOS 中称为“构建配置”)允许您(开发者)使用相同的代码库为您的应用创建单独的环境。例如,您可能为您的成熟的生产应用设置一个风味,另一个作为受限的“免费”应用,另一个用于测试实验性功能,等等。

假设您想制作 Flutter 应用的免费版和付费版。您可以使用风味来设置两个应用版本,而无需编写两个单独的应用。例如,该应用的免费版具有基本功能和广告。相比之下,付费版具有基本应用功能、额外功能、付费用户的不同样式,并且没有广告。

您还可以将风味用于功能开发。如果您构建了一个新功能并想试用它,您可以设置一个风味来对其进行测试。在您准备好部署新功能之前,您的生产代码将保持不受影响。

风味允许您定义编译时配置并设置在运行时读取以自定义您的应用行为的参数。

本文档将指导您完成为 iOS、macOS 和 Android 设置 Flutter 风味。

环境设置

先决条件

  • 已安装 Xcode
  • 一个现有的 Flutter 项目

要在 iOS 和 macOS 中设置风味,您将在 Xcode 中定义构建配置。

在 iOS 和 macOS 中创建风味

  1. 在 Xcode 中打开您的项目。

  2. 从菜单中选择产品 > 方案 > 新方案以添加一个新的 方案

    • 方案描述了 Xcode 如何运行不同的操作。出于本指南的目的,示例风味方案被命名为 freefree 方案中的构建配置具有 -free 后缀。
  3. 复制构建配置以区分已有的默认配置和 free 方案的新配置。

    • 配置下拉列表末尾的 信息选项卡下,单击加号按钮并复制每个配置名称(调试、发布和个人资料)。为每个环境复制现有配置一次。

    Step 3 Xcode image

  4. 要匹配免费版本,在每个新配置名称的末尾添加 -free

  5. 更改 free 架构以匹配已创建的构建配置。

    • Runner 项目中,单击 管理架构…,然后会弹出一个窗口。
    • 双击 free 架构。在下一步(如屏幕截图所示),您将修改每个架构以匹配其免费构建配置。

    Step 5 Xcode image

在 iOS 和 macOS 中使用版本

现在您已经设置了免费版本,例如,您可以为每个版本添加不同的产品包标识符。包标识符唯一标识您的应用程序。在此示例中,我们将 Debug-free 值设置为等于 com.flavor-test.free

  1. 更改应用包标识符以区分不同的架构。在 产品包标识符 中,为每个 -free 架构值追加 .free

    Step 1 using flavors image.

  2. 构建设置 中,将 产品名称 值设置为与每个版本匹配。例如,添加 Debug Free。

    Step 2 using flavors image.

  3. 将显示名称添加到 Info.plist。将 包显示名称 值更新为 $(PRODUCT_NAME)

    Step 3 using flavors image.

现在,您已经通过在 Xcode 中制作 free 架构并为此架构设置构建配置来设置您的版本。

有关更多信息,请跳至本文档末尾的 启动您的应用版本 部分。

插件配置

如果您的应用使用 Flutter 插件,则需要更新 ios/Podfile(如果为 iOS 开发)和 macos/Podfile(如果为 macOS 开发)。

  1. ios/Podfilemacos/Podfile 中,将 DebugProfileRelease 的默认值更改为与 free 架构的 Xcode 构建配置匹配。
project 'Runner', {
  'Debug-free' => :debug,
  'Profile-free' => :release,
  'Release-free' => :release,
}

在 Android 中使用版本

可以在项目的build.gradle文件中设置 Android 中的版本。

  1. 在 Flutter 项目中,导航至android/app/build.gradle

  2. 创建 flavorDimension 来对添加的产品版本进行分组。Gradle 不会合并具有相同 dimension 的产品版本。

  3. 添加 productFlavors 对象,其中包含所需版本以及 dimensionresValueapplicationIdapplicationIdSuffix 的值。

    • 每个版本的应用程序名称位于 resValue 中。
    • 如果你指定 applicationIdSuffix 而不是 applicationId,则它将附加到“基本”应用程序 ID。
flavorDimensions "default"

productFlavors {
    free {
        dimension "default"
        resValue "string", "app_name", "free flavor example"
        applicationIdSuffix ".free"
    }
}

设置启动配置

接下来,添加一个 launch.json 文件;这允许你运行命令 flutter run --flavor [environment name]

在 VSCode 中,按如下方式设置启动配置

  1. 在项目的根目录中,添加一个名为 .vscode 的文件夹。
  2. .vscode 文件夹中,创建一个名为 launch.json 的文件。
  3. launch.json 文件中,为每个版本添加一个配置对象。每个配置都有 namerequesttypeprogramargs 键。
{
  "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 中设置运行配置。

启动你的应用版本

  1. 设置版本后,修改 lib / main.dart 中的 Dart 代码以使用版本。
  2. 使用命令行中的 flutter run --flavor free 或在你的 IDE 中测试设置。

有关 iOSmacOSAndroid 的构建版本的示例,请查看 Flutter 仓库中的集成测试示例。

在运行时检索应用的版本

在 Dart 代码中,可以使用 appFlavor API 来确定应用构建时使用的版本。

根据版本有条件地捆绑资源

如果不熟悉如何向应用添加资源,请参阅 添加资源和图片

如果应用中仅在特定版本中使用资源,可以将其配置为仅在针对该版本构建时捆绑到应用中。这可以防止未使用的资源增加应用包大小。

以下是一个示例

flutter:
  assets:
    - assets/common/
    - path: assets/free/
      flavors:
        - free
    - path: assets/premium/
      flavors:
        - premium

在此示例中,assets/common/ 目录中的文件将在 flutter runflutter build 期间构建应用时始终捆绑。仅当 --flavor 选项设置为 free 时,才会捆绑 assets/free/ 目录中的文件。同样,仅当 --flavor 设置为 premium 时,才会捆绑 assets/premium 目录中的文件。

更多信息

有关创建和使用版本的更多信息,请查看以下资源

软件包

有关支持创建版本的软件包,请查看以下内容