Flutter环境变量管理插件flutter_envify的使用
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"
安装
在依赖项中添加envify
和envify_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
文件到资源并在应用程序运行时加载文件来实现这一点。
但我注意到这种方法有一些问题,
- 资源目录可以通过解压APK直接访问,从而容易暴露环境变量,
- 环境变量的加载需要时间, 这在Dart进程中是可以接受的,因为它只会在进程生命周期的第一次加载,但在这种情况下,每次打开应用程序时都会加载。
- 因为变量是在运行时加载的,你不能将它们用作常量表达式进行源代码生成,
例如,你将无法使用它们与像
json_serializable
和retrofit
这样的工具,这些工具需要通过注解进行常量值配置。
Envify通过使用代码生成解决了这些问题。
功能
- Envify将为用户定义的一组键生成代码,这些键的值来自环境变量文件,默认为
.env
。由于生成的代码是源代码的一部分,它将在编译期间通过混淆/编译过程,使其更难被反向工程。 - Envify只会为用户传递的字段生成代码,使其便于在多个项目之间共享环境变量。
- 在多个环境文件如
.env.production
和.env.development
之间切换也更容易,因为用户可以通过@Envify
注解配置从哪个文件加载环境变量。 - 用户还可以在定义期间传递可选的字段类型,Envify将使用这些类型对生成的字段值进行类型转换。但由于除了字符串外不建议存储大值在
.env
文件中,因此只有字面类型如int
、double
、num
、bool
和String
可以解析。如果类型是可选的或未指定,则默认使用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
更多关于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
插件来管理不同环境的配置了。