如何通过Flutter Flavors自动配置--dart-define变量?
解决Flutter根据Flavor自动注入dart-define变量的方案
Android 端(Gradle配置)
直接在android/app/build.gradle中关联Flavor与dart-define变量,无需手动在命令行输入参数:
- 先定义Flavor维度(如果还没配置):
android { flavorDimensions "environment" productFlavors { prod { dimension "environment" // 可添加其他Flavor专属配置,比如applicationIdSuffix ".prod" } dev { dimension "environment" } } }
- 为每个Flavor绑定对应的dart-define变量:
在android/app/build.gradle的applicationVariants中添加逻辑:
android { // 上面的Flavor配置... applicationVariants.all { variant -> def flavorName = variant.flavorName if (flavorName == "prod") { variant.dartDefines.addAll([ "BASE_URL=https://example-prod.com/", "API_PATH=/api/v2/", "OTHERVAR=blablabla", "YETANOTHERVAR=blablablabla" ]) } else if (flavorName == "dev") { variant.dartDefines.addAll([ "BASE_URL=https://example-dev.com/", "API_PATH=/api/v1/", "OTHERVAR=devblabla", "YETANOTHERVAR=devblablablabla" ]) } } }
配置完成后,执行flutter build apk --flavor=prod,Gradle会自动将对应变量传递给Flutter。
iOS 端(xcconfig配置)
通过xcconfig文件为每个Flavor绑定dart-define变量,配合Xcode配置实现自动注入:
- 创建Flavor专属xcconfig文件:
在ios目录下新建Flavors文件夹,创建Prod.xcconfig和Dev.xcconfig:
Prod.xcconfig:
// Prod环境dart-define变量 DART_DEFINES = BASE_URL=https://example-prod.com/,API_PATH=/api/v2/,OTHERVAR=blablabla,YETANOTHERVAR=blablablabla // 可添加其他Flavor配置,比如APP_ICON = AppIconProd
Dev.xcconfig:
// Dev环境dart-define变量 DART_DEFINES = BASE_URL=https://example-dev.com/,API_PATH=/api/v1/,OTHERVAR=devblabla,YETANOTHERVAR=devblablablabla // 可添加其他Flavor配置,比如APP_ICON = AppIconDev
- 在Podfile中关联Flavor与xcconfig:
修改ios/Podfile的post_install块:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) end # 绑定Flavor与xcconfig文件 project = installer.pods_project project.targets.each do |target| next unless target.name == 'Runner' target.build_configurations.each do |config| case config.name when 'Prod' config.base_configuration_reference = project.files.find { |f| f.path == 'Flavors/Prod.xcconfig' } when 'Dev' config.base_configuration_reference = project.files.find { |f| f.path == 'Flavors/Dev.xcconfig' } end end end end
- Xcode中配置Build Configuration:
打开Xcode -> 选择Runner项目 -> 切换到Info标签 -> Configurations,将Prod对应的Debug/Release配置关联到Flavors/Prod.xcconfig,Dev同理。
之后执行flutter build ipa --flavor=prod,Xcode会自动读取xcconfig中的变量传递给Flutter。
跨平台统一脚本方案(Shell/Makefile)
如果需要跨平台统一管理,可编写Shell脚本(Linux/macOS)或批处理脚本(Windows),根据Flavor自动拼接参数:
示例build.sh(macOS/Linux):
#!/bin/bash if [ -z "$1" ]; then echo "请指定Flavor,例如: ./build.sh prod" exit 1 fi FLAVOR=$1 case $FLAVOR in prod) DEFINE_PARAMS="--dart-define BASE_URL=https://example-prod.com/ --dart-define API_PATH=/api/v2/ --dart-define OTHERVAR=blablabla --dart-define YETANOTHERVAR=blablablabla" ;; dev) DEFINE_PARAMS="--dart-define BASE_URL=https://example-dev.com/ --dart-define API_PATH=/api/v1/ --dart-define OTHERVAR=devblabla --dart-define YETANOTHERVAR=devblablablabla" ;; *) echo "不支持的Flavor: $FLAVOR" exit 1 ;; esac flutter build ipa --flavor=$FLAVOR $DEFINE_PARAMS
使用时赋予脚本执行权限:chmod +x build.sh,然后执行./build.sh prod即可。
验证方法
在Flutter代码中通过String.fromEnvironment("BASE_URL")获取变量,构建后通过调试或打印确认值是否正确对应当前Flavor。
内容的提问来源于stack exchange,提问作者Mau
相关产品推荐
相关产品推荐

