关于 flutter-config
面向 Flutter 的配置技能,指导使用单一 main.dart 管理 dev、staging 和 prod flavor。内容涵盖集中配置、平台 flavor 设置、Firebase 环境隔离及密钥处理。
主要功能
- 01单一入口配置三种 flavor
- 02按 flavor 使用 JSON 配置
- 03集中管理 AppConfig 参数
- 04配置 Android 与 iOS flavor
- 05按 flavor 隔离 Firebase 项目
- 06密钥处理指引
适用场景
- 01运行 dev、staging 或 prod 构建
- 02集中管理环境专属设置
- 03配置平台 flavor 与 Firebase
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill flutter-config安装后在 Claude Code 中输入/flutter-config确认已加载。
详细介绍
Flavor 架构
- 定义三个 Flavor:
dev、staging、prod - 所有 Flavor 共用**单个
main.dart**入口点 - 通过
--dart-define-from-file传入各 Flavor 的专属配置:flutter run --flavor dev --dart-define-from-file=config/dev.json flutter run --flavor staging --dart-define-from-file=config/staging.json flutter run --flavor prod --dart-define-from-file=config/prod.json - 绝不要创建单独的
main_dev.dart、main_staging.dart、main_prod.dart入口点
JSON 配置结构
- 在项目根目录的
config/目录中存放各 Flavor 的 JSON 配置文件:config/ ├── dev.json ├── staging.json └── prod.json config/dev.json示例:{ "FLAVOR": "dev", "BASE_URL": "https://api-dev.example.com", "APP_NAME": "MyApp Dev", "ENABLE_LOGGING": "true", "ENABLE_CRASHLYTICS": "false" }- 绝不要将密钥(API 密钥、签名凭据)放入这些 JSON 文件中:请使用 CI 注入的环境变量或
flutter_secure_storage - 如果
config/*.json包含任何特定于环境的密钥,请将其添加到.gitignore;否则,为了方便团队协作,请将其提交
入口点模式
// lib/main.dart
void main() {
const flavor = String.fromEnvironment('FLAVOR', defaultValue: 'dev');
AppConfig.init(flavor: Flavor.fromString(flavor));
runApp(const App());
}
- 通过
String.fromEnvironment('KEY')或bool.fromEnvironment('KEY')读取所有编译时值 - 使用密封的
Flavor枚举:sealed class Flavor { dev, staging, prod } AppConfig是一个单例,用于保存 Flavor、基础 URL、功能标志和 Firebase 配置
环境配置
- 在集中的
AppConfig类中存放各 Flavor 的配置:baseUrl:各环境对应的 API 端点enableLogging:仅在 dev 环境启用详细日志记录enableCrashlytics:在 dev 环境中禁用appName:各 Flavor 的显示名称(例如,“MyApp Dev”、“MyApp”)
- 所有值都通过
--dart-define-from-file从 JSON 文件中读取:Dart 代码中不得硬编码各 Flavor 的逻辑 - 绝不要将密钥放入 JSON 配置文件中:请使用
flutter_secure_storage或 CI 注入的环境变量
平台专属 Flavor 设置
Android
- 在
android/app/build.gradle中定义flavorDimensions和productFlavors:flavorDimensions "environment" productFlavors { dev { dimension "environment"; applicationIdSuffix ".dev"; resValue "string", "app_name", "MyApp Dev" } staging { dimension "environment"; applicationIdSuffix ".staging"; resValue "string", "app_name", "MyApp Staging" } prod { dimension "environment"; resValue "string", "app_name", "MyApp" } }
iOS
- 为每个 Flavor(Dev、Staging、Prod)创建 Xcode 方案。
- 使用 xcconfig 文件设置各 Flavor 的 Bundle ID、显示名称和签名。
- 在
ios/Runner.xcodeproj中将 Flutter Flavor 映射到 Xcode 方案。 - Swift Package Manager 集成:配置 iOS Flavor 时,Xcode 方案会自动映射软件包依赖配置。SPM 无需修改 CocoaPods
Podfile。确保在 Xcode Runner 项目设置的 Package Dependencies 中定义所有依赖项覆盖。
各 Flavor 的 Firebase 配置
- 为每个 Flavor(dev、staging、prod)使用独立的 Firebase 项目
- 将
google-services.json(Android)和GoogleService-Info.plist(iOS)放入各 Flavor 专属目录 - 对每个环境使用带有
--project标志的flutterfire configure
构建命令
# Development
flutter run --flavor dev --dart-define-from-file=config/dev.json
# Staging
flutter run --flavor staging --dart-define-from-file=config/staging.json
# Production release
flutter build appbundle --flavor prod --dart-define-from-file=config/prod.json --release
flutter build ipa --flavor prod --dart-define-from-file=config/prod.json --release
规则
- 绝不要硬编码特定于环境的值(URL、API 密钥、功能标志)
- 绝不要将生产环境密钥提交到代码仓库
- 每位团队成员都必须能够通过单条命令在本地运行任意 Flavor
- CI/CD 流水线必须明确指定
--flavor和--dart-define-from-file - 使用单个
main.dart:绝不要为各 Flavor 创建单独的入口点
评论
支持 Markdown