如何在Flutter Firebase应用中通过--dart-define指定google-services.json
结论
可以实现。但google-services.json(Android端)/GoogleService-Info.plist(iOS端)属于原生构建阶段就需要解析的配置文件,无法直接在Dart层通过--dart-define参数加载,需要配合原生端的构建脚本读取--dart-define传入的环境标识,自动将对应环境的配置文件复制到原生构建默认读取的路径即可。
前置准备
先将不同环境的配置文件按统一规则存放在项目根目录,比如按如下结构存放:
项目根目录 └── config ├── dev │ ├── google-services.json │ └── GoogleService-Info.plist ├── test │ ├── google-services.json │ └── GoogleService-Info.plist └── prod ├── google-services.json └── GoogleService-Info.plist
Android端配置
- 打开项目
android/app/build.gradle文件,在文件顶部添加逻辑读取--dart-define传入的环境参数:
// 读取dart-define传入的环境标识,无参数时默认使用开发环境 def dartEnv = System.getenv('FLUTTER_APPLICATION_ARGS')?.split('--dart-define=ENV=')?.getAt(1)?.split(' ')?.getAt(0) ?: 'dev'
- 在
android配置块之前添加文件复制任务,绑定到构建前置流程:
task copyGoogleServices(type: Copy) { from "../config/${dartEnv}/google-services.json" into "." } // 构建前自动执行配置文件复制 preBuild.dependsOn copyGoogleServices
iOS端配置
- 打开Xcode选中Runner项目,进入
Build Phases标签页,点击左上角+号选择New Run Script Phase,将新建的脚本阶段拖到Dependencies阶段之后 - 在脚本输入框填入以下内容:
# 读取dart-define传入的环境标识,无参数时默认使用开发环境 ENV=$(echo $FLUTTER_APPLICATION_ARGS | grep -o 'ENV=[^ ]*' | cut -d'=' -f2) if [ -z "$ENV" ]; then ENV="dev" fi # 复制对应环境的配置文件到默认读取路径 cp "$SRCROOT/../config/$ENV/GoogleService-Info.plist" "$SRCROOT/Runner/GoogleService-Info.plist"
- 不要将
GoogleService-Info.plist加入Xcode的编译缓存列表,避免旧配置被复用。
构建使用示例
构建时通过--dart-define传入对应环境参数即可自动加载匹配的配置文件:
- 开发环境调试:
flutter run --dart-define=ENV=dev - 测试环境打包:
flutter build apk --dart-define=ENV=test - 生产环境打包:
flutter build ipa --dart-define=ENV=prod
注意事项
- 切换环境构建前建议先执行
flutter clean清理构建缓存,避免旧配置文件残留 - 不要将原生目录下默认路径的
google-services.json和GoogleService-Info.plist提交到代码仓库,避免配置冲突
内容的提问来源于stack exchange,提问作者cahix
相关产品推荐
相关产品推荐

