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

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

Pub Version

关于

此库是 java-james/flutter_dotenv Dart 库的一个分支,最初修改以确保与 Flutter 兼容。

一个 环境 包含由进程识别的变量(如 PATHPORT 等)。在开发过程中(包括测试和预生产阶段),通过从文件读取这些值来复制生产环境是有益的。

该库解析文件并将其中的值与内置的 <a href="https://api.dart.dev/stable/3.4.4/dart-io/Platform-class.html#id_environment"><code>Platform.environment</code></a> 映射集成在一起。

使用

  1. 在项目的根目录下创建一个名为 local.json 的文件,内容如下所示:
{
  "api_url": "https://api.local.dev.com",
  "foo": "foo",
  "bar": "bar"
}
  1. pubspec.yaml 文件中添加 local.json 文件到资源包中。确保路径与 local.json 文件的位置匹配!
assets:
  - local.json
  1. main.dart 中加载 local.json 文件。
import 'package:flutter_dot_json_env/flutter_dot_json_env.dart';

Future<void> main() async {
  await dotjsonenv.load(fileName: "local.json");
  //...runapp
}
  1. 在整个应用程序中访问 local.json 中的对象键值。
import 'package:flutter_dot_json_env/flutter_dot_json_env.dart';

String variable_name = dotjsonenv.env['key_value'] ?? 'default fallback value';

使用 --dart-define 选择环境 JSON 文件

  1. 创建一个名为 [envFileName].json 的文件,包含相同的对象键,例如以下示例内容:
{
  "api_url": "https://api.local.dev.com",
  "foo": "foo",
  "bar": "bar"
}
  1. pubspec.yaml 文件中将环境 JSON 文件添加到资源包中。确保路径与 local.json 文件的位置匹配!
assets:
  - assets/env/local.json
  - assets/env/dev.json
  - assets/env/test.json
  - assets/env/prelive.json
  - assets/env/live.json
  1. 创建一个新的类,例如 Environment 类。
class Environment {
  static const env = String.fromEnvironment('ENV');

  String get envFileName {
    switch (env) {
      case 'dev': // flutter run --dart-define=ENV=dev
        return 'assets/env/dev.json';
      case 'test': // flutter run --dart-define=ENV=test
        return 'assets/env/test.json';
      case 'prelive': // flutter run --dart-define=ENV=prelive
        return 'assets/env/prelive.json';
      case 'live': // flutter run --dart-define=ENV=live
        return 'assets/env/live.json';
      default: // flutter run
        return 'assets/env/local.json';
    }
  }

  static String get environmentName {
    return env.isNotEmpty ? env : "Environment name not found";
  }

  static String get apiUrl =>
      dotjsonenv.get('api_url', fallback: 'api url default fallback value');
  static String get foo =>
      dotjsonenv.env['foo'] ?? 'foo default fallback value';
  static String get bar =>
      dotjsonenv.env['bar'] ?? 'bar default fallback value';
}
  1. 在整个应用程序中访问 Environment 类中的值。
Future<void> main() async {
  // await dotjsonenv.load(fileName: "assets/env/local.json"); // load as static json
  await dotjsonenv.load(fileName: Environment().envFileName);
  print('appURL::: ${Environment.apiUrl}'); // appURL::: https://api.local.com
  print('Foo::: ${Environment.foo}'); // Foo::: prelive foo
  print('Bar::: ${Environment.bar}'); // Bar::: prelive bar
  //...runapp
}
  1. 运行应用程序或构建时:
flutter run --dart-define=ENV=<envFileName>
// flutter run --dart-define=ENV=dev
flutter build web --dart-define=ENV=<envFileName>
// flutter build web --dart-define=ENV=dev

零安全

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

Future<void> main() async {
  await dotjsonenv.load(fileName: "local.json");

  String foo = dotjsonenv.get('key_value');

  // 或者使用回退。
  String bar = dotjsonenv.get('missing_key_value', fallback: 'default fallback value');

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

讨论

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

欢迎提交拉取请求。

前置工作

许可证

许可证: MIT


完整示例 Demo

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

Future<void> main() async {
  // await dotjsonenv.load(fileName: "assets/env/local.json"); // load as static json
  await dotjsonenv.load(fileName: Environment().envFileName);

  print(
      'app URL::: ${dotjsonenv.env['api_url'] ?? 'api url default fallback value'}');
  print('appURL::: ${Environment.apiUrl}');
  print('Foo::: ${Environment.foo}');
  print('Bar::: ${Environment.bar}');

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('DotJSONEnv Demo'),
          backgroundColor: Colors.teal,
        ),
        body: SingleChildScrollView(
          child: FutureBuilder<String>(
            future: rootBundle.loadString('assets/env/local.json'),
            initialData: '',
            builder: (context, snapshot) => Container(
              padding: const EdgeInsets.all(50),
              child: Center(
                child: Column(
                  children: [
                    Text(
                      'Env map: ${dotjsonenv.env.toString()}',
                    ),
                    Text(dotjsonenv.get('api_url',
                        fallback: 'api url default fallback value')),
                    Text(dotjsonenv.get('foo',
                        fallback: 'foo default fallback value')),
                    Text(dotjsonenv.get('bar',
                        fallback: 'bar default fallback value')),
                    const Text("Environment class values"),
                    Text('appURL::: ${Environment.apiUrl}'),
                    Text('Foo::: ${Environment.foo}'),
                    Text('Bar::: ${Environment.bar}'),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class Environment {
  static const env = String.fromEnvironment('ENV');

  String get envFileName {
    switch (env) {
      case 'dev': // flutter run --dart-define=ENV=dev
        return 'assets/env/dev.json';
      case 'test': // flutter run --dart-define=ENV=test
        return 'assets/env/test.json';
      case 'prelive': // flutter run --dart-define=ENV=prelive
        return 'assets/env/prelive.json';
      case 'live': // flutter run --dart-define=ENV=live
        return 'assets/env/live.json';
      default: // flutter run
        return 'assets/env/local.json';
    }
  }

  static String get environmentName {
    return env.isNotEmpty ? env : "Environment name not found";
  }

  static String get apiUrl =>
      dotjsonenv.get('api_url', fallback: 'api url default fallback value');
  static String get foo =>
      dotjsonenv.env['foo'] ?? 'foo default fallback value';
  static String get bar =>
      dotjsonenv.env['bar'] ?? 'bar default fallback value';
}

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

1 回复

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


flutter_dot_json_env 是一个用于在 Flutter 项目中管理环境变量的插件。它允许你从 JSON 文件中加载环境变量,并在应用程序中使用这些变量。以下是如何使用 flutter_dot_json_env 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_dot_json_env: ^1.0.0  # 请检查最新版本

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

2. 创建 JSON 配置文件

在项目的根目录下创建一个 JSON 文件来存储你的环境变量。例如,你可以创建一个 env.json 文件:

{
  "API_URL": "https://api.example.com",
  "API_KEY": "your_api_key_here",
  "DEBUG_MODE": true
}

3. 加载环境变量

在你的 Dart 代码中,使用 DotJsonEnv 来加载 JSON 文件中的环境变量。通常,你可以在 main.dart 文件中的 main 函数中加载这些变量:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 加载环境变量
  await DotJsonEnv.load('env.json');

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 使用环境变量
    String apiUrl = DotJsonEnv.env['API_URL'];
    String apiKey = DotJsonEnv.env['API_KEY'];
    bool debugMode = DotJsonEnv.env['DEBUG_MODE'];

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter DotJsonEnv Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('API URL: $apiUrl'),
            Text('API Key: $apiKey'),
            Text('Debug Mode: $debugMode'),
          ],
        ),
      ),
    );
  }
}

4. 使用环境变量

在加载环境变量后,你可以通过 DotJsonEnv.env 来访问这些变量。例如:

String apiUrl = DotJsonEnv.env['API_URL'];
String apiKey = DotJsonEnv.env['API_KEY'];
bool debugMode = DotJsonEnv.env['DEBUG_MODE'];

5. 支持多环境(可选)

如果你需要支持多个环境(如开发环境、测试环境、生产环境),你可以创建多个 JSON 文件,例如 env.dev.json, env.test.json, env.prod.json,并根据当前环境加载相应的文件。

String envFile = 'env.dev.json'; // 根据当前环境选择文件
await DotJsonEnv.load(envFile);
回到顶部