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 项目,可以看到以下文件:
②、默认创建个配置文件(目前没发现有什么用):CNMEnvconfigDefault.xcconfig。我们要将dart-define 配置的键值对使用在 iOS 项目中,以下操作
CNMEnvconfigDefault.xcconfig
文件中内容:
CNM_APP_ENV=debug
CNM_APP_NAME=
注意:CNM_APP_ENV必须与multi_env.dart文件中的evnKey值一致。
③、打开
填写: 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配置文件中
Debug.xcconfig
Release.xcconfig
info.plist设置:
这样就可以在不同环境下显示不同的项目名称了。
④、配置Flutter项目不同环境运行的文件命令:
Android Studio:
各个环境文件
debug:
debug
例子:Addtional run args: --dart-define=CNM_APP_ENV=debug --dart-define=CNM_APP_NAME=CNMdebug
profile
profile
例子:Addtional run args: --dart-define=CNM_APP_ENV=profile --dart-define=CNM_APP_NAME=CNMprofile
release
release
例子:Addtional run args: --dart-define=CNM_APP_ENV=release --dart-define=CNM_APP_NAME=CNMrelease
VSCode:
在launch.json中配置:
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
修改 label 值
注意:这里 label 设置是对应上面 resValue的键值对
4、使用
只要切换
vscode
VSCode 在 profile以及release环境下,iOS 模拟器不能运行(如果有大佬知道如何配置,可告知)
Android Studio