跳至主要内容

创建 Flutter 应用的 Flavors

什么是 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

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

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

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

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

    Step 3 Xcode image

  4. 要匹配 free Flavor,请在每个新配置名称的末尾添加-free

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

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

    Step 5 Xcode image

在 iOS 和 macOS 中使用 Flavors

#

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

  1. 更改应用包标识符以区分方案。在产品包标识符中,将.free附加到每个 -free 方案值。

    Step 1 using flavors image.

  2. 构建设置中,将产品名称值设置为与每个 Flavor 匹配。例如,添加调试免费。

    Step 2 using flavors image.

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

    Step 3 using flavors image.

现在您已通过在 Xcode 中创建free方案并为该方案设置构建配置来设置了 Flavor。

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

插件配置

#

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

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

在 Android 中使用 Flavors

#

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

  1. 在您的 Flutter 项目中,导航到android/app/build.gradle

  2. 创建一个flavorDimension来对您添加的产品 Flavors 进行分组。Gradle 不会组合共享相同dimension的产品 Flavors。

  3. 添加一个带有所需 Flavors 的productFlavors对象,以及dimensionresValueapplicationIdapplicationIdSuffix的值。

    • 每个构建的应用程序名称位于resValue中。
    • 如果您指定了applicationIdSuffix而不是applicationId,则它将附加到“基本”应用程序 ID。
build.gradle.kts
kotlin
android {
    // ...
    flavorDimensions += "default"

    productFlavors {
        create("free") {
            dimension = "default"
            resValue(type = "string", name = "app_name", value = "free flavor example")
            applicationIdSuffix = ".free"
        }
    }
}
build.gradle
groovy
android {
    // ...
    flavorDimensions "default"

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

设置启动配置

#

接下来,添加一个launch.json文件;这允许您运行命令flutter run --flavor [环境名称]

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

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

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

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

在运行时获取应用的 Flavor

#

在您的 Dart 代码中,您可以使用appFlavor API 来确定您的应用使用哪个 Flavor 构建。

根据 Flavor 有条件地打包资源

#

如果您不熟悉如何在应用中添加资源,请参阅添加资源和图像

如果您的应用中有一些仅在特定 Flavor 中使用的资源,您可以将它们配置为仅在为该 Flavor 构建应用时才捆绑到您的应用中。这可以防止您的应用包大小因未使用的资源而膨胀。

这是一个示例

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

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

更多信息

#

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

#

对于支持创建 Flavors 的包,请查看以下内容