Skip to main content

创建 Flutter 应用的不同版本

什么是版本

#

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

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

你也可以使用版本进行功能开发。如果你已经构建了一个新功能并想尝试一下,你可以设置一个版本来测试它。你的生产代码保持不变,直到你准备好部署你的新功能。

版本允许你定义编译时配置并设置在运行时读取的参数,以自定义你的应用的行为。

本文档将指导你为 iOS、macOS 和 Android 设置 Flutter 版本。

环境设置

#

先决条件:

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

要在 iOS 和 macOS 中设置版本,你将在 Xcode 中定义构建配置。

在 iOS 和 macOS 中创建版本

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

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

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

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

    步骤 3 Xcode 图片

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

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

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

    步骤 5 Xcode 图片

在 iOS 和 macOS 中使用版本

#

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

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

    步骤 1 使用版本图片

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

    步骤 2 使用版本图片

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

    步骤 3 使用版本图片

现在你已经通过在 Xcode 中创建一个free方案并设置该方案的构建配置来设置你的版本。

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

插件配置

#

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

  1. ios/Podfilemacos/Podfile中,将 调试概要文件 发布的默认值更改为与free方案的 Xcode 构建配置匹配。
ruby
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对象,以及dimensionresValue applicationId applicationIdSuffix的值。

    • 每个构建的应用程序名称位于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文件中,为每个版本添加一个配置对象。每个配置都有一个namerequesttypeprogram args键。
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 中设置一个运行配置。

启动你的应用版本

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

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

在运行时检索你的应用版本

#

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

基于版本有条件地捆绑资源

#

如果你不熟悉如何将资源添加到你的应用中,请参阅添加资源和图像

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

这是一个示例:

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

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

更多信息

#

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

#

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