8.2 配置管理

张开发
2026/4/15 4:18:43 15 分钟阅读

分享文章

8.2 配置管理
通过环境变量和 Flavor 机制Flutter 项目可以灵活管理 dev/staging/prod 多套环境配置实现一套代码多环境构建。一、–dart-define 环境变量1.1 传入环境变量# 运行时传入flutter run\--dart-defineAPI_BASE_URLhttps://dev-api.example.com\--dart-defineAPP_ENVdevelopment\--dart-defineENABLE_ANALYTICSfalse# 构建时传入flutter build apk\--dart-defineAPI_BASE_URLhttps://api.example.com\--dart-defineAPP_ENVproduction\--dart-defineENABLE_ANALYTICStrue# 使用配置文件推荐flutter run --dart-define-from-file.env.dev flutter build apk --dart-define-from-file.env.prod1.2 .env 配置文件// .env.dev{API_BASE_URL:https://dev-api.example.com,APP_ENV:development,ENABLE_ANALYTICS:false,SENTRY_DSN:}// .env.prod{API_BASE_URL:https://api.example.com,APP_ENV:production,ENABLE_ANALYTICS:true,SENTRY_DSN:https://xxxsentry.io/123}1.3 在 Dart 代码中读取classAppConfig{// const String.fromEnvironment 在编译时注入值staticconstStringapiBaseUrlString.fromEnvironment(API_BASE_URL,defaultValue:https://api.example.com,);staticconstStringappEnvString.fromEnvironment(APP_ENV,defaultValue:production,);staticconstbool enableAnalyticsbool.fromEnvironment(ENABLE_ANALYTICS,defaultValue:true,);staticconstStringsentryDsnString.fromEnvironment(SENTRY_DSN);// 派生属性staticboolgetisDevelopmentappEnvdevelopment;staticboolgetisProductionappEnvproduction;staticvoidlog(){if(isDevelopment){print(Config:$apiBaseUrl($appEnv));}}}// 使用finaldioDio(BaseOptions(baseUrl:AppConfig.apiBaseUrl));二、Flavor 配置Flavor 让同一项目可以打出不同的 App不同包名、图标、应用名。2.1 Android Flavor 配置// android/app/build.gradleandroid{flavorDimensionsenvironmentproductFlavors{development{dimensionenvironmentapplicationIdcom.example.myapp.devversionNameSuffix-devresValuestring,app_name,MyApp Dev}staging{dimensionenvironmentapplicationIdcom.example.myapp.stagingversionNameSuffix-stagingresValuestring,app_name,MyApp Staging}production{dimensionenvironmentapplicationIdcom.example.myappresValuestring,app_name,MyApp}}}2.2 iOS Flavor 配置Scheme# 在 Xcode 中# 1. Product → Scheme → Manage Schemes# 2. 创建 development、staging、production 三个 Scheme# 3. 每个 Scheme 对应不同的 Build Configuration# ios/Podfile 按 Configuration 区分targetRunnerdouse_frameworks!ifENV[CONFIGURATION]Release-productionpodFirebaseAnalyticsendend2.3 运行 Flavor# 运行特定 Flavorflutter run--flavordevelopment-tlib/main_dev.dart flutter run--flavorproduction-tlib/main.dart# 构建特定 Flavorflutter build apk--flavorproduction-tlib/main.dart--releaseflutter build ipa--flavorstaging-tlib/main_staging.dart2.4 Flavor 入口分离// lib/main_dev.dartvoidmain(){AppConfig.init(environment:Environment.development,apiBaseUrl:https://dev-api.example.com,);runApp(constMyApp());}// lib/main_staging.dartvoidmain(){AppConfig.init(environment:Environment.staging,apiBaseUrl:https://staging-api.example.com,);runApp(constMyApp());}// lib/main.dart (production)voidmain(){AppConfig.init(environment:Environment.production,apiBaseUrl:https://api.example.com,);runApp(constMyApp());}三、VS Code 启动配置// .vscode/launch.json{version:0.2.0,configurations:[{name:Development,request:launch,type:dart,program:lib/main_dev.dart,args:[--flavor,development,--dart-define-from-file,.env.dev]},{name:Production,request:launch,type:dart,program:lib/main.dart,args:[--flavor,production,--dart-define-from-file,.env.prod]}]}小结方案适用场景特点–dart-defineAPI 地址、功能开关编译期注入代码可读–dart-define-from-file多环境配置集中管理JSON 文件方便 CI/CDFlavor多渠道包名、图标、应用名原生级别区分支持不同图标 下一节8.3 日志与调试

更多文章