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

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

env_flutter 插件用于在运行时从 .env 文件加载配置,并可以在整个应用程序中使用这些配置。

关于

该库是 java-james/flutter_dotenv 的一个分支,稍作修改以支持不同阶段的 .env 文件读取。

环境变量是在进程中已知的一组变量(如 PATHPORT 等)。通过从文件中读取这些值,可以模拟生产环境进行开发(测试、预发布等)。

此库解析该文件,并将其值与内置的 Platform.environment 映射合并。

使用

1. 创建 .env 文件

在项目的根目录下创建一个 .env 文件,包含示例内容:

FOO=foo
BAR=bar
FOOBAR=$FOO$BAR
ESCAPED_DOLLAR_SIGN='$1000'
# 这是一个注释

注意:如果部署到 Web 服务器,请确保配置文件已上传且未被忽略。(在服务器上将配置文件列入白名单,或者将配置文件命名为不带前导 . 的名称。)

2. 将 .env 文件添加到资源包中

pubspec.yaml 文件中添加所有 .env 文件到资源包:

assets:
  - .env
  - .env.development
  - .env.production
  - .env.test
  - .env.local
  - .env.development.local
  - .env.production.local
  - .env.test.local

确保路径与步骤1和步骤2中的路径相对应。

3. 将 .env 文件添加到 .gitignore

.gitignore 文件中添加以下内容以防止将 .env 文件纳入版本控制:

*.env

4. 在 main.dart 中加载 .env 文件

main.dart 文件中导入并加载 .env 文件:

import 'package:env_flutter/env_flutter.dart';

Future<void> main() async {
  // 加载 .env 文件内容到 env。
  // 注意:fileName 默认为 .env,可以在此省略。
  // 确保文件名与第1步和第2步中的路径相对应。
  await dotenv.load(fileName: 'assets/.env');
  
  runApp(MyApp());
}

你可以通过以下方式在整个应用中访问 .env 文件中的变量:

import 'package:env_flutter/env_flutter.dart';

String foo = dotenv.env['FOO'];

你也可以将 env 映射到一个配置模型来按类型访问配置。

其他可使用的 .env 文件

  • .env: 默认。
  • .env.local: 本地覆盖。此文件在所有环境中加载,除了测试。
  • .env.development, .env.test, .env.production: 环境特定设置。
  • .env.development.local, .env.test.local, .env.production.local: 环境特定设置的本地覆盖。

文件优先级:

  • flutter run: .env.development.local, .env.local, .env.development, .env
  • npm build: .env.production.local, .env.local, .env.production, .env
  • flutter test: .env.test.local, .env.test, .env (注意 .env.local 被忽略了)

高级用法

引用

你可以在 .env 文件中引用其他定义的变量:

FOO=foo
BAR=bar
FOOBAR=$FOO$BAR

可以通过包裹值在单引号中来转义引用:

ESCAPED_DOLLAR_SIGN='$1000'

合并

你可以在加载时合并一个映射:

await DotEnv.load(mergeWith: { "FOO": "foo", "BAR": "bar" });

你也可以在 .env 文件中引用这些合并的变量:

FOOBAR=$FOO$BAR

测试中使用

有一个 testLoad 方法可以用来加载静态变量集用于测试:

// 从静态字符串加载。
dotenv.testLoad(fileInput: '''FOO=foo
BAR=bar
''');

// 从文件同步加载。
dotenv.testLoad(fileInput: File('test/.env').readAsStringSync());

防止空安全检查

为了避免对不存在的变量进行空安全检查,可以使用 get() 方法,该方法会在变量未定义时抛出异常。你还可以指定一个默认回退值,当变量在 .env 文件中未定义时使用:

Future<void> main() async {
  await dotenv.load();

  String foo = dotenv.get('VAR_NAME');

  // 或者使用回退值。
  String bar = dotenv.get('MISSING_VAR_NAME', fallback: 'sane-default');

  // 这将返回 null。
  String? baz = dotenv.maybeGet('MISSING_VAR_NAME', fallback: null);
}

使用平台环境

你可以将 Platform.environment 映射合并到 env 中:

// 例如使用包含 CLIENT_ID 条目的 Platform.environment
await DotEnv.load(mergeWith: Platform.environment);
print(env["CLIENT_ID"]);

像上面描述的其他合并条目一样,.env 条目可以引用这些合并的 Platform.Environment 条目:

CLIENT_URL=https://$CLIENT_ID.dev.domain.com

讨论

使用 问题跟踪器 报告错误和功能请求。

欢迎提交拉取请求。

许可证

MIT许可证

完整示例代码

import 'package:env_flutter/env_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

Future<void> main() async {
  await dotenv.load(
    fileNames: [
      'assets/.env',
      'assets/.env.production',
      'assets/.env.production.europe-stage',
    ],
    mergeWith: {
      'TEST_VAR': '5',
    },
  ); // mergeWith 可选,你可以包括 Platform.environment 供移动/桌面应用使用

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dotenv Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Dotenv Demo'),
        ),
        body: SingleChildScrollView(
          child: FutureBuilder<String>(
            future: rootBundle.loadString('assets/.env'),
            initialData: '',
            builder: (context, snapshot) => Container(
              padding: EdgeInsets.all(50),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('Env map:'),
                  Divider(thickness: 1),
                  _buildEnvEntries(),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildEnvEntries() {
    return Column(
      children: dotenv.env.entries
          .map(
            (entry) => Padding(
              padding: const EdgeInsets.all(2),
              child: Row(
                children: [
                  Container(
                    padding: const EdgeInsets.all(2),
                    child: Text('${entry.key} = '),
                  ),
                  Container(
                    padding: const EdgeInsets.all(2),
                    color: Colors.amberAccent,
                    child: Text(entry.value),
                  ),
                ],
              ),
            ),
          )
          .toList(),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用env_flutter插件来管理环境变量的详细代码案例。

步骤 1: 添加依赖

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

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

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

步骤 2: 创建环境文件

在项目的根目录下创建多个环境文件,例如.env.development.env.production。这些文件将包含不同环境下的变量。

.env.development

API_BASE_URL=https://dev.example.com/api
FEATURE_FLAG_A=true

.env.production

API_BASE_URL=https://example.com/api
FEATURE_FLAG_A=false

步骤 3: 配置env_flutter

在你的main.dart或任何初始化文件中配置env_flutter以加载正确的环境文件。

import 'package:flutter/material.dart';
import 'package:env_flutter/env_flutter.dart';

void main() async {
  // 加载开发环境的配置文件(根据需要替换为production等)
  await EnvFlutter.loadEnv('.env.development');

  // 你可以通过EnvFlutter.getString来获取环境变量值
  String apiBaseUrl = EnvFlutter.getString('API_BASE_URL') ?? 'https://default.url';
  bool featureFlagA = EnvFlutter.getBool('FEATURE_FLAG_A') ?? false;

  runApp(MyApp(apiBaseUrl: apiBaseUrl, featureFlagA: featureFlagA));
}

class MyApp extends StatelessWidget {
  final String apiBaseUrl;
  final bool featureFlagA;

  MyApp({required this.apiBaseUrl, required this.featureFlagA});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Env Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Env Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('API Base URL: $apiBaseUrl'),
              Text('Feature Flag A: $featureFlagA'),
            ],
          ),
        ),
      ),
    );
  }
}

步骤 4: 运行项目

确保你选择了正确的Flutter环境(开发或生产),然后运行项目。

flutter run --flavor development  # 或者使用其他方式指定运行环境

注意事项

  1. 环境文件命名:确保.env文件命名符合约定(例如.env.development.env.production),并在代码中正确加载。
  2. 类型安全EnvFlutter.getStringEnvFlutter.getBool等方法会返回相应的类型,如果变量不存在,则返回null。你可以提供默认值以避免null
  3. 多环境支持:如果你有多个环境(如测试、预发布等),可以创建相应的.env文件并在代码中加载。

通过上述步骤,你可以在Flutter项目中有效地管理不同环境下的变量。

回到顶部