Flutter笔记--envied

Flutter开发中,envied是Flutter编译期环境变量代码生成库。它将".env"配置文件转为Dart静态常量,类型安全,编译期校验.简单总结如下:

API:

envied:注解库

envied_generator:代码生成器

build_runner:dart 代码生成工具

场景:

1 多环境配置:开发、测试、生产环境的`baseUrl`、接口域名、开关配置。

2 存储API Key、第三方 SDK密钥。

3 功能开关、全局常量配置。

栗子:

Dart 复制代码
pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  envied: ^1.3.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.4.13
  envied_generator: ^1.1.1
Dart 复制代码
根目录新建.env文件:

BASE_URL=https://dev-api.test.com
APP_NAME=测试APP
DEBUG_MODE=true
API_SECRET=abc123456secret

新建 app_env.dart

Dart 复制代码
import 'package:envied/envied.dart';

part 'app_env.g.dart';

/// path指向根目录.env文件
@Envied(path: '.env')
abstract class AppEnv {

  @EnviedField(varName: 'BASE_URL')
  static const String baseUrl = _AppEnv.baseUrl;

  @EnviedField(varName: 'APP_NAME')
  static const String appName = _AppEnv.appName;

  @EnviedField(varName: 'DEBUG_MODE')
  static const bool debugMode = _AppEnv.debugMode;


  @EnviedField(varName: 'API_SECRET', obfuscate: true)
  static final String apiSecret = _AppEnv.apiSecret;


  @EnviedField(defaultValue: "10000")
  static const int connectTimeout = _AppEnv.connectTimeout;
}

执行生成命令

bash 复制代码
flutter pub run build_runner build --delete-conflicting-outputs
Dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:test_251117/env/app_env.dart';

void main() {
  runApp(const EnvTestApp());
}

class  EnvTestApp extends StatelessWidget {
  const EnvTestApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: AppEnv.appName,
      home: Scaffold(
        appBar: AppBar(title: Text(AppEnv.appName),),
        body: Center(
          child: Column(mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("baseUrl:${AppEnv.baseUrl}"),
            Text("debugMode:${AppEnv.debugMode}"),
            Text("connectTimeout: ${AppEnv.connectTimeout}"),
            Text("apiSecret: ${AppEnv.apiSecret}"),

          ],),
        ),
      ),
    );
  }

}

根目录新建

.env.dev

bash 复制代码
BASE_URL=https://dev-api.test.com
DEBUG_MODE=true
SENTRY_DSN=dev_sentry_xxxx

.env.prod

Dart 复制代码
BASE_URL=https://api.online.com
DEBUG_MODE=false
SENTRY_DSN=prod_sentry_yyyy
Dart 复制代码
import 'package:envied/envied.dart';

part 'config.g.dart';

// ============开发环境配置,使用.env.dev===========
@Envied(path: ".env.dev")
abstract class DevConfig {
  @EnviedField(varName: "BASE_URL")
  static const String baseUrl = _DevConfig.baseUrl;

  @EnviedField(varName: "DEBUG_MODE")
  static const bool debugMode = _DevConfig.debugMode;

  @EnviedField(varName: "SENTRY_DSN", obfuscate: true)
  static final String sentryDsn = _DevConfig.sentryDsn;
}

// ============生产环境配置,使用.env.prod===========
@Envied(path: ".env.prod")
abstract class ProdConfig {
  @EnviedField(varName: "BASE_URL")
  static const String baseUrl = _ProdConfig.baseUrl;

  @EnviedField(varName: "DEBUG_MODE")
  static const bool debugMode = _ProdConfig.debugMode;

  @EnviedField(varName: "SENTRY_DSN", obfuscate: true)
  static final String sentryDsn = _ProdConfig.sentryDsn;
}

执行生成命令

bash 复制代码
flutter pub run build_runner build --delete-conflicting-outputs
Dart 复制代码
import 'package:flutter/material.dart';
import '../env/config.dart';

// 编译期选择使用哪一套配置
typedef AppConfig = DevConfig;
// typedef AppConfig = ProdConfig; //切生产环境,切换这里,重新build_runner

void main() {
  runApp(const EnvNewApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("多环境envied Demo")),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text("baseUrl: ${AppConfig.baseUrl}"),
              Text("debug: ${AppConfig.debugMode}"),
              Text("sentryDsn: ${AppConfig.sentryDsn}"),
            ],
          ),
        ),
      ),
    );
  }
}

注意:

1 修改".env"文件后,必须重新执行 build_runner,否则配置不会更新

2 ".env"、生成的".g.dart"文件加入".gitignore",不要提交密钥到git仓库。

相关推荐
Flynt32 分钟前
React Router v8 升了之后,我花了两天才把项目跑起来
前端·typescript·preact
疯狂打码的少年6 小时前
【数据库技术】关系模型基本概念(关系/属性/元组/键)
java·服务器·数据库·笔记
泯泷7 小时前
手搓JSVMM第 8 篇:函数调用:参数、返回值与调用帧
前端·javascript·前端框架
Sherotree7 小时前
Google Antigravity——Agent 被提到主界面
前端·ide·后端·edge浏览器
加农炮手Jinx8 小时前
Flutter for OpenHarmony 实战:flutter_animate 声明式动画让 UI 灵动如原生
flutter·ui·华为·harmonyos·鸿蒙
里欧跑得慢8 小时前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
有梦想的骇客8 小时前
PyTorch学习笔记
pytorch·笔记·学习
里欧跑得慢8 小时前
Flutter 三方库 function_tree — 鸿蒙应用开发中的动态数学公式解析与计算神器,实现鸿蒙深度适配下的复杂函数逻辑运行时求值实战(适配鸿蒙 HarmonyOS Next ohos)
android·前端·安全·flutter·华为·harmonyos
Capricorn19888 小时前
个人知识库接入大模型频现“幻觉引用”?排查 RAG 溯源失效问题,解析知芽构建可信第三大脑的底层架构
大数据·论文阅读·人工智能·笔记·架构·论文笔记