Flutter环境变量管理插件flutter_envify的使用

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

Flutter环境变量管理插件flutter_envify的使用

这个包基于envify。 这是在Flutter中处理环境变量的一种更佳且可能更安全的方法。

要详细了解为什么这更好/更安全,请跳转到动机部分。

目录

概述

对于一个这样的.env文件,

KEY=VALUE

以及一个这样的类,

part 'env.g.dart';

@Envify()
abstract class Env {
    static const key = _Env.key;
}

envify将生成包含从.env文件加载的KEY值的_Env类的部分文件。

现在你可以使用Env.key

print(Env.key); // "VALUE"

安装

在依赖项中添加envifyenvify_generator

dependencies:
  flutter_envify: any

dev_dependencies:
  flutter_envify_generator: any
  build_runner: any

如果你还没有添加build_runner,你也需要添加它。

使用

在项目的根目录下添加一个.env文件。该文件的语法和规则可以在dotenv规则查看。 在lib/env/env.dart定义API用于生成(你可以在任何路径下的任何文件中使用,但我建议使用这个文件,以免忘记稍后将其添加到.gitignore)。

不要忘记将.env文件和env.g.dart添加到.gitignore!否则,你可能会暴露你的环境变量。

// lib/env/env.dart

import 'package:flutter_envify/flutter_envify.dart';
part 'env.g.dart';

@Envify()
abstract class Env {
    static const key = _Env.key;
}

然后运行生成器,

# dart
pub run build_runner build
# flutter
flutter pub run build_runner build

API文档

更改.env文件路径

你可以在@Envify注解中更改获取数据以生成的文件。通过此API,还可以为多个场合生成多个环境变量类。

@Envify(path: '.env.development')
abstract class DevEnv {}

@Envify(path: '.env.production')
abstract class ProdEnv {}

更改生成类名

默认情况下,生成的类名称将是带前缀_的注解类名称。你可以使用name字段来更改它。请注意,前缀_始终会存在。

@Envify(name: 'Secrets')
abstract class Env {
   static const key = _Secrets.key;
}

动机

在最近的一个Flutter项目中,我需要使用环境变量,可用的选择是flutter_dotenv,这是一个基于dotenv包修改的包。因为dotenv包只能在进程期间处理环境变量,所以flutter_dotenv包通过导出.env文件到资源并在应用程序运行时加载文件来实现这一点。

但我注意到这种方法有一些问题,

  1. 资源目录可以通过解压APK直接访问,从而容易暴露环境变量
  2. 环境变量的加载需要时间, 这在Dart进程中是可以接受的,因为它只会在进程生命周期的第一次加载,但在这种情况下,每次打开应用程序时都会加载。
  3. 因为变量是在运行时加载的,你不能将它们用作常量表达式进行源代码生成, 例如,你将无法使用它们与像json_serializableretrofit这样的工具,这些工具需要通过注解进行常量值配置。

Envify通过使用代码生成解决了这些问题。

功能

  • Envify将为用户定义的一组键生成代码,这些键的值来自环境变量文件,默认为.env。由于生成的代码是源代码的一部分,它将在编译期间通过混淆/编译过程,使其更难被反向工程。
  • Envify只会为用户传递的字段生成代码,使其便于在多个项目之间共享环境变量。
  • 在多个环境文件如.env.production.env.development之间切换也更容易,因为用户可以通过@Envify注解配置从哪个文件加载环境变量。
  • 用户还可以在定义期间传递可选的字段类型,Envify将使用这些类型对生成的字段值进行类型转换。但由于除了字符串外不建议存储大值在.env文件中,因此只有字面类型如intdoublenumboolString可以解析。如果类型是可选的或未指定,则默认使用String
  • 生成的字段将是常量表达式,可以在源代码生成和其他用户需要的地方使用。

致谢

为了使这个项目成为可能,我必须学习关于代码生成的知识,这是我之前一无所知的。为了学习,我不得不阅读大型代码生成项目的源代码,如json_serializable等。因此,某些部分如测试是如何编写以及API是如何结构化的受到了这些项目的影响。生成器中使用的解析器来自dotenv包。

此外,使用一个类作为抽象层而不是直接访问生成的代码是一个设计决策,这样当env.g.dart部分文件未生成时,错误不会传播到整个项目。现在即使部分文件尚未生成,错误仅限于env.dart文件中。

许可证

MIT © Frenco Jobs


示例代码

import 'package:example/env/env.dart';

void main() {
  print('''
    name: ${Env.name}
    age: ${Env.age}
    height: ${Env.height}cm
    isStudent: ${Env.isStudent}
    race: ${Env.race}
  ''');
}

更多关于Flutter环境变量管理插件flutter_envify的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter环境变量管理插件flutter_envify的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter环境变量管理插件flutter_envify的代码案例。这个插件允许你在Flutter应用中管理不同环境(如开发、测试、生产)的配置。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_envify依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_envify: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

步骤 2: 创建环境文件

在你的项目根目录下创建.env文件(以及任何你需要的特定环境文件,如.env.development.env.production)。

例如,创建一个.env文件:

API_URL=https://api.example.com
FEATURE_FLAG_A=true

创建一个.env.development文件:

API_URL=https://dev-api.example.com
FEATURE_FLAG_A=false

步骤 3: 配置flutter_envify

在你的pubspec.yaml文件中,添加一个构建配置来指定要使用的环境文件。假设你使用的是build_runner

flutter:
  # 其他配置...

dev_dependencies:
  build_runner: ^x.y.z  # 确保安装了build_runner
  flutter_envify: ^x.y.z  # 重复列出是为了确保可见性,实际安装只需一次

dependency_overrides:
  flutter_envify:
    path: ../path/to/flutter_envify  # 如果你是从本地路径引用的

# 添加一个构建脚本部分
scripts:
  envify: flutter pub run build_runner build --delete-conflicting-outputs

注意:通常你不需要dependency_overrides部分,除非你有特殊需求。

步骤 4: 生成环境变量文件

在你的项目根目录下运行以下命令来生成环境变量文件:

flutter pub run build_runner build --delete-conflicting-outputs

这将在你的lib目录下生成一个generated文件夹,里面包含了一个env.dart文件。

步骤 5: 在你的Flutter应用中使用环境变量

现在你可以在你的Flutter代码中导入并使用这些环境变量。例如:

import 'package:your_app/generated/env.dart';

void main() {
  print('API URL: ${env.API_URL}');
  print('Feature Flag A: ${env.FEATURE_FLAG_A}');

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Envify Example'),
        ),
        body: Center(
          child: Text('API URL: ${env.API_URL}'),
        ),
      ),
    );
  }
}

步骤 6: 配置不同的构建环境

你可以通过修改你的构建脚本来指定不同的环境文件。例如,在package.json中添加一个脚本:

"scripts": {
  "build:dev": "flutter pub run build_runner build --delete-conflicting-outputs -e .env.development",
  "build:prod": "flutter pub run build_runner build --delete-conflicting-outputs -e .env.production"
}

然后你可以运行:

npm run build:dev

或者

npm run build:prod

来构建你的应用,并使用相应的环境变量。

通过上述步骤,你就可以在Flutter应用中使用flutter_envify插件来管理不同环境的配置了。

回到顶部