天天看点

Flutter关于使用dart-define进行项目多环境配置

1、创建需要编写环境配置的multi_env.dart

代码:

/// 环境配置模型类
class CNMEvnModel {
  /// 不同环境下的域名
  final String appDomain;

  CNMEvnModel({required this.appDomain});
}

/// 声明环境变量类
abstract class CNMEvnName {
  static const String evnKey = 'CNM_APP_ENV';

  /// 测试
  static const String debug = 'debug';

  /// 预发布
  static const String profile = 'profile';

  /// 正式
  static const String release = 'release';
}

/// 获取配置环境信息类
class CNMEvn {
  /// 开发环境(测试)
  static final CNMEvnModel _debugEvn = CNMEvnModel(appDomain: 'https://gateway.ngrok.i84.com.cn');

  /// 预发布环境
  static final CNMEvnModel _profileEvn = CNMEvnModel(appDomain: 'https://profile');

  /// 生产环境(正式)
  static final CNMEvnModel _releaseEvn = CNMEvnModel(appDomain: 'https://cloud.5i84txh.com/gateway');

  /// 获取当前 --dart-define 设置的环境
  static String get _getAppEnvString => const String.fromEnvironment(CNMEvnName.evnKey);

  /// 根据不同环境获取相应配置
  static void _getEvn() {
    /// String.fromEnvironment('xxx') 能获取到 命令中 --dart-define=xxx=zzz,以xxx为key对应的值zzz
    /// 运行 flutter 项目时,可以使用 flutter run --dart-define=xxx=zzz
    /// 例子:flutter run --dart-define=CNM_APP_ENV=release
    /// 多配置例子:flutter run --dart-define=CNM_APP_ENV=release --dart-define=CNM_APP_NAME=CNM项目
    switch (_getAppEnvString) {
      case CNMEvnName.debug:
        evnConfig = _debugEvn;
        break;
      case CNMEvnName.profile:
        evnConfig = _profileEvn;
        break;
      case CNMEvnName.release:
        evnConfig = _releaseEvn;
        break;
      default:
        evnConfig = _debugEvn;
    }
  }

  /// 初始化环境配置
  static void initEnvironment() => _getEvn();

  /// 获取当前环境配置(默认 debug)
  static CNMEvnModel evnConfig = _debugEvn;
}           

2、配置 iOS

①、打开iOS 项目,可以看到以下文件:

Flutter关于使用dart-define进行项目多环境配置

②、默认创建个配置文件(目前没发现有什么用):CNMEnvconfigDefault.xcconfig。我们要将dart-define 配置的键值对使用在 iOS 项目中,以下操作

Flutter关于使用dart-define进行项目多环境配置

CNMEnvconfigDefault.xcconfig

文件中内容:

CNM_APP_ENV=debug

CNM_APP_NAME=
           

注意:CNM_APP_ENV必须与multi_env.dart文件中的evnKey值一致。

③、打开

Flutter关于使用dart-define进行项目多环境配置

填写: 4 -> 选取目标,添加脚本:

function entry_decode() { echo "${*}" | base64 --decode; }

IFS=',' read -r -a define_items <<< "$DART_DEFINES"


for index in "${!define_items[@]}"
do
    define_items[$index]=$(entry_decode "${define_items[$index]}");
done

printf "%s\n" "${define_items[@]}"|grep '^CNM_' > ${SRCROOT}/Flutter/CNMEnvconfig.xcconfig           

由于Flutter 2.2 中,Generated.xcconfig 以及 flutter_export_environment.sh 出现DART_DEFINES

例子:DART_DEFINES=Q05NX0FQUF9FTlY9ZGVidWc=,Q05NX0FQUF9OQU1FPUNOTWRlYnVn,Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==           

我们需要使用 Base64 解码;

注意:|grep '^CNM_'必须加,能过滤掉Base64解码后的不合规的键值对,留下自定义的键值对。

提前告知:CNMEnvconfig.xcconfig:是Flutter项目运行后,会生成的一个配置,到时此配置里面会出现 dart-define 命令执行的键值对,这样就可以在 info.plist中使用这个键值对。这样目前 iOS 项目里面会有两个配置文件:CNMEnvconfigDefault.xcconfig 和 CNMEnvconfig.xcconfig。

注意:需要将 CNMEnvconfigDefault.xcconfig 和 CNMEnvconfig.xcconfig 文件引入到Debug和Release.xcconfig配置文件中

Flutter关于使用dart-define进行项目多环境配置

Debug.xcconfig

Flutter关于使用dart-define进行项目多环境配置

Release.xcconfig

info.plist设置:

Flutter关于使用dart-define进行项目多环境配置
Flutter关于使用dart-define进行项目多环境配置

这样就可以在不同环境下显示不同的项目名称了。

④、配置Flutter项目不同环境运行的文件命令:

Android Studio:
Flutter关于使用dart-define进行项目多环境配置

各个环境文件

debug:

Flutter关于使用dart-define进行项目多环境配置

debug

例子:Addtional run args: --dart-define=CNM_APP_ENV=debug --dart-define=CNM_APP_NAME=CNMdebug

profile

Flutter关于使用dart-define进行项目多环境配置

profile

例子:Addtional run args: --dart-define=CNM_APP_ENV=profile --dart-define=CNM_APP_NAME=CNMprofile

release

Flutter关于使用dart-define进行项目多环境配置

release

例子:Addtional run args: --dart-define=CNM_APP_ENV=release --dart-define=CNM_APP_NAME=CNMrelease

VSCode:

在launch.json中配置:

Flutter关于使用dart-define进行项目多环境配置

vscode配置多环境

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "flutter_multi_env (debug mode)",
            "request": "launch",
            "type": "dart",
            "program": "lib/main.dart",
            "args": [
                "--dart-define",
                "CNM_APP_ENV=debug",
                "--dart-define",
                "CNM_APP_NAME=CNM测试",
            ],
        },
        {
            "name": "flutter_multi_env (profile mode)",
            "request": "launch",
            "type": "dart",
            "program": "lib/main.dart",
            "args": [
                "--dart-define",
                "CNM_APP_ENV=profile",
                "--dart-define",
                "CNM_APP_NAME=CNM预发布",
            ],
        },
        {
            "name": "flutter_multi_env (release mode)",
            "request": "launch",
            "type": "dart",
            "program": "lib/main.dart",
            "args": [
                "--dart-define",
                "CNM_APP_ENV=release",
                "--dart-define",
                "CNM_APP_NAME=CNM正式",
            ],
        }
    ]
}           

3、配置安卓

打开安卓项目,android -> app -> build.gradle

// 配置多环境参数键值对
def dartEnvironmentVariables = [
        CNM_APP_NAME: null,
        CNM_APP_ENV: 'debug'
];
if (project.hasProperty('dart-defines')) {
    dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
                def pair = new String(entry.decodeBase64(), 'UTF-8').split('=')
                [(pair.first()): pair.last()]
            }
}           
/// defaultConfig 中添加 resValue
defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.flutter_multi_env"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdkVersion 21
        targetSdkVersion 33
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        resValue "string", "app_name", dartEnvironmentVariables.CNM_APP_NAME
        // applicationIdSuffix dartEnvironmentVariables.CNM_APP_ENV
        ndk {
            abiFilters "arm64-v8a" // 仅支持64位
            // abiFilters "armeabi-v7a", "arm64-v8a" // 同时兼容32和64位
        }
 }           

打开安卓项目,android -> app -> src -> main -> AndroidManifest.xml

Flutter关于使用dart-define进行项目多环境配置

修改 label 值

注意:这里 label 设置是对应上面 resValue的键值对

4、使用

只要切换

Flutter关于使用dart-define进行项目多环境配置

vscode

VSCode 在 profile以及release环境下,iOS 模拟器不能运行(如果有大佬知道如何配置,可告知)

Flutter关于使用dart-define进行项目多环境配置

Android Studio

继续阅读