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

发布于 1周前 作者 yibo5220 来自 Flutter

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

简介

flutter_env_native 是一个用于在Flutter项目中为原生平台提供编译时变量的插件/工具。它使得通过 --dart-define--dart-define-from-file 设置的环境变量可以被原生平台访问。

pub package

安装

pubspec.yaml文件中添加依赖:

dev_dependencies:
  flutter_env_native: ^0.1.0

设置指南

定义.env文件

创建一个.env文件,用于定义环境变量:

APP_NAME=batcave
APP_SUFFIX=.dev
MAPS_API_KEY=someKeyString

通过命令行参数传递给Flutter运行或构建命令:

flutter run --dart-define-from-file=.env

Android安装

修改android/app/build.gradle

确保包含以下内容:

// flutter_env_native
Project flutter_env_native = project(':flutter_env_native')
apply from: "${flutter_env_native.projectDir}/envConfig.gradle"

在AndroidManifest.xml中使用

defaultConfig {
    applicationId = "tech.mastersam.flutter_env_example"
    minSdk = flutter.minSdkVersion
    targetSdk = flutter.targetSdkVersion
    versionCode = flutterVersionCode.toInteger()
    versionName = flutterVersionName

    resValue "string", "app_name", APP_NAME ?: 'default_name'
}

<application
    android:label="flutter_env_example"
    android:name="@string/app_name"
    android:icon="@mipmap/ic_launcher">
</application>

在Kotlin文件中使用

修改build.gradle中的defaultConfig部分以创建BuildConfig字段:

buildConfigField "String", "APP_NAME", "\"${APP_NAME ?: 'default_name'}\""

然后可以在MainActivity.kt中访问这些值:

class MainActivity : FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val appName = BuildConfig.APP_NAME
        Toast.makeText(this, "APP_NAME: $appName", Toast.LENGTH_LONG).show()
    }
}

iOS安装

修改ios/Podfile

添加以下代码段:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end

  flutter_env_plugin_path = File.join(Dir.pwd, '.symlinks', 'plugins', 'flutter_env_native', 'ios', 'setup_env.sh')
  root_dir = File.expand_path('..', Dir.pwd)
  
  system("sh \"#{flutter_env_plugin_path}\" \"#{root_dir}\"")
end

在Info.plist中使用

直接引用.env文件中定义的环境变量:

<key>CFBundleDisplayName</key>
<string>$(APP_NAME)</string>

在Swift文件中使用

例如,在AppDelegate.swift或其他Swift文件中:

var app_name: String = Bundle.main.infoDictionary?["APP_NAME"] as? String ?? ""
NSLog("\nHere's your app name -> \(app_name)")

示例代码

以下是使用flutter_env_native读取环境变量并在Flutter应用中显示的完整示例:

import 'package:flutter/material.dart';

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 使用const构造函数从环境变量中获取字符串值
  String name = const String.fromEnvironment("APP_NAME");
  String suffix = const String.fromEnvironment("APP_SUFFIX");

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('name: $name\n'),
              Text('suffix: $suffix\n'),
            ],
          ),
        ),
      ),
    );
  }
}

以上就是flutter_env_native插件的基本使用方法和一个完整的示例演示。希望这能帮助你更好地理解和使用这个有用的工具!


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

1 回复

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


当然,下面是一个关于如何使用 flutter_env_native 插件来管理 Flutter 应用中的环境变量的代码案例。flutter_env_native 插件允许你根据不同的构建变体(如开发、测试、生产)来管理不同的环境变量。

1. 添加依赖

首先,在你的 Flutter 项目的 pubspec.yaml 文件中添加 flutter_env_native 依赖:

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

然后在项目根目录下运行 flutter pub get 来获取依赖。

2. 配置环境变量

接下来,你需要在项目根目录下创建一个 .env 文件来定义你的环境变量。例如:

# .env (开发环境)
API_BASE_URL=https://dev.api.example.com
FEATURE_FLAG_A=true

你还可以为不同的构建变体创建不同的 .env 文件,比如 .env.production

# .env.production (生产环境)
API_BASE_URL=https://api.example.com
FEATURE_FLAG_A=false

3. 更新 build.gradle 文件

在 Android 的 app/build.gradle 文件中,你需要配置任务来根据构建变体复制相应的 .env 文件。以下是一个示例配置:

android {
    ...
    applicationVariants.all { variant ->
        def buildType = variant.buildType.name
        def isRelease = buildType == 'release'

        def envFile = isRelease ? ".env.production" : ".env"
        def envFilePath = file(envFile)

        if (envFilePath.exists()) {
            def properties = new Properties()
            properties.load(new FileInputStream(envFilePath))

            variant.mergedFlavor.extraInfo.putAll(properties as Map<String, Object>)

            // 将环境变量写入一个生成的文件中,供 Flutter 读取
            def outputFile = file("${buildDir}/generated/res/raw/env_${variant.name}.properties")
            outputFile.parentFile.mkdirs()
            properties.store(outputFile.newWriter(), null)

            variant.mergeResources.doLast {
                copy {
                    from outputFile
                    into "${buildDir}/intermediates/merged_assets/${variant.dirName}/out/flutter_assets"
                    rename { "env.properties" }
                }
            }
        }
    }
}

4. 在 Flutter 中读取环境变量

在 Flutter 代码中,你可以使用 flutter_env_native 插件来读取这些环境变量。首先,确保你已经导入了插件:

import 'package:flutter_env_native/flutter_env_native.dart';

然后,你可以在任何地方读取环境变量,例如:

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

  // 初始化插件并加载环境变量
  await FlutterEnvNative.init();

  // 读取环境变量
  String apiBaseUrl = FlutterEnvNative.env['API_BASE_URL'] ?? 'https://default.api.example.com';
  bool featureFlagA = FlutterEnvNative.env['FEATURE_FLAG_A'] == 'true';

  print('API Base URL: $apiBaseUrl');
  print('Feature Flag A: $featureFlagA');

  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(
      // ...
    );
  }
}

5. 构建和运行

现在,你可以使用不同的构建命令来构建你的 Flutter 应用,例如:

flutter run --release  # 使用生产环境变量
flutter run            # 使用开发环境变量(默认)

这样,flutter_env_native 插件就会根据构建变体加载相应的 .env 文件,并在 Flutter 应用中提供这些环境变量。

回到顶部