Flutter编译时定义常量插件dart_define的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter编译时定义常量插件 dart_define 的使用

dart_define 是一个用于处理Flutter应用中编译时常量和配置的工具。它可以帮助你在本地开发环境和CI/CD管道中轻松管理秘密和配置变量,而无需使用繁琐且容易出错的.env文件或其他方法。

动机 🔥

Flutter支持通过--dart-define选项添加编译时常量,并在Dart代码和原生配置中使用这些常量。然而,当变量数量增多时,命令行会变得冗长复杂。为了解决这个问题,可以创建自定义启动脚本或使用JSON文件与--dart-define-from-file选项结合使用。但这种方法在CI/CD管道中会带来其他问题,例如需要忽略包含敏感信息的配置文件以防止泄露。

dart_define 提供了一种更简单的方式来处理这些情况,确保你的应用在缺少必要值时不会在运行时崩溃,而是直接在构建阶段报错。

快速开始 🚀

1. 安装CLI工具或添加依赖

你可以选择全局安装CLI工具:

dart pub global activate dart_define

或者将其作为开发依赖添加到项目中:

flutter pub add --dev dart_define

注意:如果选择第二种方式,你需要在所有dart_define命令前加上pub run,例如pub run dart_define generate

2. 在 pubspec.yaml 中定义变量

以下是一个示例配置:

dart_define:
  dart: true
  json: true
  json_path: dart_define.json
  dart_path: lib/dart_define.gen.dart
  class_name: DartDefine
  variables:
    - name: STRING_VALUE
      description: An example String value
      default: hello world!
      required: false
    - name: INT_VALUE
      description: An example int value
      default: 3
      required: false
    - name: BOOL_VALUE
      description: An example bool value
      required: true
  flavors:
    - name: production
      description: The production flavor
    - name: staging
      description: The staging flavor
    - name: development
      description: The development flavor

3. 生成模板代码

运行以下命令生成模板代码:

dart_define generate

注意:这将生成一个包含敏感信息的JSON文件,建议将其加入.gitignore

使用配置 ⚙️

1. 在Dart代码中使用变量

生成的模板类允许你非常方便地访问这些变量:

class DartDefine {
  static const stringValue = String.fromEnvironment('STRING_VALUE');
  static const intValue = int.fromEnvironment('INT_VALUE');
  static const boolValue = bool.fromEnvironment('BOOL_VALUE');
}

String testValue = DartDefine.stringValue;

2. 在平台原生配置中使用变量

Android:

app/build.gradle中:

defaultConfig {
    applicationId STRING_VALUE
    resValue "string", "STRING_VALUE", STRING_VALUE
}

AndroidManifest.xml中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="@string/STRING_VALUE">
</manifest>

iOS:

在Xcode配置文件中:

$(STRING_VALUE)

3. 从配置文件运行应用

flutter run --dart-define-from-file=dart_define.json

配置CI/CD管道 ✔️

1. 将变量添加到管道密钥中

由于dart_define从环境密钥中读取值,因此你只需将它们添加到环境密钥中即可。

2. 运行生成器

dart run dart_define generate --force --BOOL_VALUE=${BOOL_VALUE} --STRING_VALUE=${STRING_VALUE} --INT_VALUE=${INT_VALUE}

注意:如果CI/CD管道缓存了代码库,请务必添加--force标志。

3. 在实际构建命令中使用配置

flutter build apk --dart-define-from-file=dart_define.json
flutter build ios --dart-define-from-file=dart_define.json

设置Flavors 🍬

dart_define 支持为不同的环境或白标应用程序创建多个配置。以下是设置步骤:

1. 在 pubspec.yaml 中添加Flavors

dart_define:
  variables:
    - name: APP_NAME
      description: The apps name
      default: My App
      required: false
    - name: APP_ID
      description: The apps unique id
      default: com.my.app
      required: false
  flavors:
    - name: production
      description: The production flavor
    - name: staging
      description: The staging flavor
    - name: development
      description: The development flavor

2. 为所有Flavor生成配置文件

dart_define generate --json_path=config/production.json --FLAVOR=production
dart_define generate --json_path=config/staging.json --FLAVOR=staging
dart_define generate --json_path=config/development.json --FLAVOR=development

3. 在应用中使用Flavor

enum Flavor {
  production,
  staging,
  development,
}

4. 从特定Flavor运行应用

flutter run --dart-define-from-file=config/development.json

更多关于Flutter编译时定义常量插件dart_define的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter编译时定义常量插件dart_define的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,dart_define 是一个在编译时定义常量的机制,常用于根据不同的构建环境(如开发、测试、生产环境)来设置不同的配置。下面是如何在Flutter项目中使用 dart_define 的具体步骤和代码示例。

步骤 1: 在 pubspec.yaml 中定义构建配置

首先,在 pubspec.yaml 文件中定义不同的构建配置。虽然 pubspec.yaml 本身不直接支持 dart_define,但你可以通过 flutter 命令来指定这些定义。不过,这里只是为了说明可以在 pubspec.yaml 中列出不同的构建配置概念。

# pubspec.yaml
flutter:
  # 其他配置...

步骤 2: 使用 flutter build 命令指定 dart_define

在实际构建项目时,你可以通过命令行参数来指定 dart_define。例如,你可以为开发环境和生产环境分别定义不同的常量。

开发环境

flutter build apk --dart-define=FLUTTER_ENV=development

生产环境

flutter build apk --dart-define=FLUTTER_ENV=production

步骤 3: 在 Dart 代码中读取 dart_define 定义的常量

在 Dart 代码中,你可以使用 String.fromEnvironment 方法来读取通过 dart_define 定义的常量。这个方法在编译时解析,因此不能在运行时改变其值。

// main.dart

// 定义常量
const String flutterEnv = String.fromEnvironment('FLUTTER_ENV', defaultValue: 'unknown');

void main() {
  print('当前 Flutter 环境: $flutterEnv');

  // 根据环境执行不同的逻辑
  if (flutterEnv == 'development') {
    // 开发环境的逻辑
    print('开发环境特定逻辑');
  } else if (flutterEnv == 'production') {
    // 生产环境的逻辑
    print('生产环境特定逻辑');
  } else {
    // 未知环境的逻辑
    print('未知环境');
  }

  // 运行应用
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 环境示例'),
        ),
        body: Center(
          child: Text('查看控制台输出以了解当前环境'),
        ),
      ),
    );
  }
}

注意事项

  1. 编译时解析String.fromEnvironment 在编译时解析其值,这意味着你不能在运行时改变这些值。
  2. 大小写敏感dart_define 的键是大小写敏感的,确保在命令行和 Dart 代码中使用相同的大小写。
  3. 默认值String.fromEnvironment 方法接受一个 defaultValue 参数,当未通过 dart_define 定义指定的键时,将使用该默认值。

通过上述步骤和代码示例,你可以在 Flutter 项目中有效地使用 dart_define 来定义编译时常量,并根据不同的构建环境执行不同的逻辑。

回到顶部