🍉 加载中...


Flutter 3.7 中一种定义编译时变量的新方法

3 minute read

前言

Dart Defines 是在 1.17 版本中引入的。它允许为 Dart 和原生层(native layers)定义变量,方法是将它们作为参数传递,如下所示:

1flutter run --dart-define=someVariable=someValue

这是一个很酷的改进,但它有一些缺陷。首先,如果你想传递多个变量,你的执行命令可能会变得很长。其二,如果想要在原生层使用这些变量,将不得不自己编写并执行一些 Gradle 和 shell 脚本,以便为 Android 和 iOS 正确解析它们。

介绍

从 Flutter 3.7 开始,您将可以把所有变量放入到一个 JSON 文件中,并像下面这样传递将其传递给 Flutter:

1flutter run --dart-define-from-file=<use-define-config.json>

Flutter 会解析并分别定义每个变量!同时,可以直接在原生层,即 Android 和 IOS 的构建过程中使用这些变量,而无需其他额外操作!

最小示例

下面是一个简单的 JSON 文件示例(config.json):

1{
2 "DEFINEEXAMPLE_APP_NAME": "awesomeApp1",
3 "DEFINEEXAMPLE_APP_SUFFIX": ".dev"
4}

使用如下命令构建应用程序:

1flutter run --dart-define-from-file=config.json

使用方法

Dart 中使用

Dart 中的使用方法与之前的 Dart Defines 相同。

1const APP_NAME = String.fromEnvironment('DEFINEEXAMPLE_APP_NAME');
2const APP_SUFFIX = String.fromEnvironment('DEFINEEXAMPLE_APP_SUFFIX');

Android 构建中使用

下面示例中,我们定义了一个 String 资源,稍后可以在 android/app/src/main/AndroidManifest.xml 中使用它来指定应用程序名称。

1defaultConfig { 
2    applicationId "com.example.defineexample"
3    applicationIdSuffix dartEnvironmentVariables.DEFINEEXAMPLE_APP_SUFFIX 
4
5    ...
6
7    resValue "string" , "app_name" , dartEnvironmentVariables.DEFINEEXAMPLE_APP_NAME 
8}

IOS 构建中使用

在 iOS 构建期间,Flutter Tool 会创建几个文件,包括 Generated.xcconfigflutter_export_environment.sh,它们可以在 ios/Flutter 中找到。

我们可以在 Info.plist 文件中使用这些变量来指定 Bundle NameBundle Identifier

Info.plist

番外

键名约束

键名可以完全自定义,只要不与 Flutter 内置或系统变量名冲突。

默认值

Android

对于 Android,可以在 app/build.gradle 文件中为这些变量提供一些默认值。

1def dartEnvironmentVariables = [
2   DEFINEEXAMPLE_APP_NAME: project.hasProperty('DEFINEEXAMPLE_APP_NAME')
3           ? DEFINEEXAMPLE_APP_NAME
4           : 'awesomeApp',
5   DEFINEEXAMPLE_APP_SUFFIX: project.hasProperty('DEFINEEXAMPLE_APP_SUFFIX')
6           ? DEFINEEXAMPLE_APP_SUFFIX
7           : null
8];

IOS

对于 IOS,可以创建一个 Defineexample-defaults.xcconfig 文件,并在其中为这些变量提供一些默认值。之后,将此文件导入到 Release.xcconfigDebug.xcconfig 文件中即可。注意确保它在 Generated.xcconfig 之前导入。

以下为示例 Defineexample-defaults.xcconfig 文件内容:

DEFINEEXAMPLE_APP_NAME=awesomeApp1
DEFINEEXAMPLE_APP_SUFFIX=.dev

参考资料