Flutter enven 是一个用于在编译时从 .env 文件生成环境变量的Flutter插件

发布于 1周前 作者 eggper 最后一次编辑是 5天前 来自 Flutter

Flutter enven 是一个用于在编译时从 .env 文件生成环境变量的Flutter插件

(注:由于“enven”并非一个真实存在或广泛认知的Flutter插件名称,且介绍为“undefined”,以下推测仅供参考,并可能不符合实际情况。)

Flutter特定功能插件enven的潜在用途探索

描述

enven 是一个用于在编译时从 .env 文件生成环境变量的Flutter插件,支持可选的混淆功能。它旨在解决将敏感信息嵌入应用中的问题,同时避免这些信息以明文形式暴露。

动机

有时,我们需要在应用程序中嵌入一些秘密信息(如API密钥),以防止API被滥用。虽然 flutter_dotenv 插件很好用,但它会将环境变量存储在assets文件夹中,容易被反向工程。而 envied 插件则需要编写冗长的 env.dart 文件,不够简洁。enven 的优势在于只需编写 .env 文件并运行命令即可生成 env.g.dart 文件。

目录


开始使用

第一步:添加依赖

pubspec.yaml 文件中添加 enven 依赖:

dev_dependencies:
  enven: ^1.0.0 # 请根据实际情况替换版本号
  build_runner: ^2.3.0 # 可选

第二步:编写 .env 文件

在项目根目录下创建 .env 文件,并添加环境变量:

API_KEY=1234567890
API_ENDPOINT=https://example.com

第三步:生成 Dart 文件

运行以下命令生成 env.g.dart 文件:

dart run enven

如果你刚克隆了项目,也可以使用 build_runner 来构建:

dart run build_runner build -d

注意:build_runner 只能工作一次,后续更改不会被检测到。

第四步:访问环境变量

在代码中导入生成的文件并使用环境变量:

import 'package:your_package/gen/env.g.dart';

void main() {
  print('API endpoint: ${Env.apiEndpoint}');
  print('API key: ${Env.apiKey}');
}

配置

可以在 .env 文件中使用 #enven: 注释来配置生成行为:

#enven:output=lib/gen/env.g.dart

#enven:obfuscate
#enven:type=String
API_KEY=1234567890

#enven:obfuscate
#enven:name=endpoint
API_ENDPOINT=https://example.com
Key Applies to Type Usage Default
output file String 指定输出文件路径 lib/gen/env.g.dart
seed file String 指定混淆种子 (随机)
obfuscate variable bool 混淆环境变量 false
const variable bool 生成常量 false
type variable String, int, double, bool 指定确切类型 (推断)
name variable String 指定变量名 (推断)

类型

enven 会自动推断变量类型,你也可以通过注释覆盖默认类型:

A=1 # int
B=1.0 # double
C=true # bool
D=string # String
E='string' # String (with quotes)
F="hello
world" # String (multiline)

#enven:type=String
G=1 # String (override)

覆盖

可以通过创建不同的 .env 文件来覆盖默认值:

# File: .env
API_KEY=abcdefg
API_ENDPOINT=https://dev.example.com
APP_NAME=My App
# File: .env.prod
API_KEY=my-secret-key
API_ENDPOINT=https://prod.example.com
// Production
String apiKey = Env.apiKey; // my-secret-key
String apiEndpoint = Env.apiEndpoint; // https://prod.example.com
String appName = Env.appName; // My App <-- from .env

优先级如下:

  1. .env.production
  2. .env.prod
  3. .env.development
  4. .env.dev
  5. .env

模拟

可以通过设置 Env.instance 来模拟环境变量:

import 'package:your_package/gen/env.g.dart';

class MockEnvData extends EnvData {
  String get apiKey => 'I am mocked';
}

void main() {
  print(Env.apiKey); // "abcdefg"
  Env.instance = MockEnvData();
  print(Env.apiKey); // "I am mocked"
}

也可以使用 implements EnvData 强制实现所有变量。注意,带有 #enven:const 注解的变量不能被覆盖。


许可证

MIT License

Copyright © 2023-2025 Tien Do Nam

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


希望这段内容能够帮助你更好地理解如何使用 `enven` 插件。如果有任何问题或需要进一步的帮助,请随时提问!

更多关于Flutter enven 是一个用于在编译时从 .env 文件生成环境变量的Flutter插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter enven 是一个用于在编译时从 .env 文件生成环境变量的Flutter插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


尽管“enven”并非一个真实存在或广泛认知的Flutter插件名称,但基于Flutter插件开发的一般模式和假设“enven”可能提供某种特定功能,我们可以推测并构建一个类似的Flutter插件使用示例。请注意,以下代码完全是基于假设创建的,并不代表任何真实插件的实现。

假设“enven”插件可能用于某种环境变量管理或配置加载功能,我们可以模拟这样一个插件的使用。以下是一个假设的enven插件的基本用法示例,包括插件的声明、配置和使用:

1. 插件声明(pubspec.yaml)

首先,我们需要在pubspec.yaml文件中声明这个假设的插件:

dependencies:
  flutter:
    sdk: flutter
  enven: ^0.0.1  # 假设的版本号

2. 插件配置(假设的配置文件config.json)

假设enven插件需要读取一个配置文件,比如config.json

{
  "api_url": "https://api.example.com",
  "feature_flag_a": true,
  "feature_flag_b": false
}

3. 插件使用(main.dart)

然后,在main.dart文件中,我们可以模拟如何使用这个假设的enven插件来加载配置并应用它们:

import 'package:flutter/material.dart';
import 'package:enven/enven.dart'; // 假设的导入路径
import 'dart:convert';

void main() {
  runApp(MyApp());
}

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

class ConfigLoader extends StatefulWidget {
  @override
  _ConfigLoaderState createState() => _ConfigLoaderState();
}

class _ConfigLoaderState extends State<ConfigLoader> {
  Map<String, dynamic>? config;

  @override
  void initState() {
    super.initState();
    _loadConfig();
  }

  Future<void> _loadConfig() async {
    // 假设enven插件提供了一个loadConfigFromAsset方法
    String configJson = await Enven.loadConfigFromAsset('config.json');
    config = jsonDecode(configJson);
    
    // 更新UI
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Config Loader Demo'),
      ),
      body: Center(
        child: config != null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('API URL: ${config!['api_url']}'),
                  Text('Feature Flag A: ${config!['feature_flag_a'].toString()}'),
                  Text('Feature Flag B: ${config!['feature_flag_b'].toString()}'),
                ],
              )
            : CircularProgressIndicator(),
      ),
    );
  }
}

// 假设的Enven类和方法(在实际中,这将是插件提供的)
class Enven {
  static Future<String> loadConfigFromAsset(String assetName) async {
    // 这里应该有一个实际的文件读取实现,但为简化起见,我们返回一个硬编码的字符串
    return '''
    {
      "api_url": "https://api.example.com",
      "feature_flag_a": true,
      "feature_flag_b": false
    }
    ''';
  }
}

注意:

  1. 插件声明:在pubspec.yaml中声明的enven插件及其版本号完全是假设的。
  2. 配置文件config.json文件模拟了插件可能读取的配置。
  3. 插件使用:在main.dart中,我们模拟了如何使用这个假设的插件来加载配置并显示它们。实际上,Enven类和方法应该是插件提供的,而不是我们手动编写的。

由于“enven”并非真实存在的插件,因此上述代码仅用于演示如何假设并模拟一个Flutter插件的使用。在实际开发中,你需要根据真实插件的文档和API来实现相应的功能。

回到顶部