用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Dev-Toolbelt/dev-team-agents --skill flutter命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | flutter |
| description | Flutter/Dart rules, patterns, and checklists. Load when Flutter is detected. |
Load this skill when any of the following are found:
| Signal | File / Location |
|---|---|
| Flutter SDK in pubspec | pubspec.yaml → sdk: flutter |
| Main entry point | lib/main.dart |
| Flutter workspace | flutter key in pubspec.yaml |
| Platform directories | android/ + ios/ + lib/ together |
lib/
├── main.dart # App entry, environment setup, runApp()
├── app/ # MaterialApp/CupertinoApp, router, theme
├── features/ # Feature-first: each feature owns its own layers
│ └── auth/
│ ├── data/ # Repositories, data sources, DTOs
│ ├── domain/ # Entities, use cases, repository interfaces
│ └── presentation/ # Widgets, pages, state (BLoC/Riverpod/etc.)
├── core/ # Shared: DI setup, network client, error handling
├── shared/ # Reusable widgets and utilities
└── l10n/ # Localization ARB files
lib/ contains only Dart — never put platform-specific Swift/Kotlin in lib/android/, ios/, linux/, macos/, web/, windows/ respectively→ Load skills/mobile/flutter/references/state-management.md when choosing or implementing state management (BLoC, Cubit, Riverpod, Provider, GetX).
! (null assertion) without a preceding null check or a comment explaining why it is guaranteed non-null?? and ?. over null assertionslate only for variables that are genuinely initialized before first use (e.g., in initState) — not as a way to defer null handlingawait Futures — never fire-and-forget unless intentional (document with a comment)Future.wait() for parallel async operations, not sequential awaitFlutterError.onError + PlatformDispatcher.instance.onErrorUse compute() or Isolate.run() for operations that block the UI thread > 16 ms:
// Decode large JSON on a background isolate
final parsed = await compute(parseHeavyJson, rawJsonString);
lowerCamelCase for variables/functions, UpperCamelCase for types, SCREAMING_SNAKE_CASE for constantsflutter_lints (or very_good_analysis for stricter projects)dart format . before committing)// ignore: without a comment explaining the reason→ Load skills/mobile/flutter/references/widgets.md when working with widget composition, rebuilds, performance, or platform-adaptive UI.
→ Load skills/mobile/flutter/references/navigation.md when working with routing, deep links, or navigation guards.
Flavors allow separate configurations for dev, staging, and production without code changes.
// lib/core/config/app_config.dart
enum Flavor { development, staging, production }
class AppConfig {
static late Flavor flavor;
static late String apiBaseUrl;
static void setup(Flavor f) {
flavor = f;
apiBaseUrl = switch (f) {
Flavor.development => 'https://api.dev.example.com',
Flavor.staging => 'https://api.staging.example.com',
Flavor.production => 'https://api.example.com',
};
}
}
flutter run --flavor development -t lib/main_development.dartif (kDebugMode) as a substitute for flavors — debug/release and dev/prod are orthogonal concernsUse platform channels only when a Dart/Flutter package does not exist for the required native API.
const _channel = MethodChannel('com.company.app/biometric');
Future<bool> authenticate() async {
try {
return await _channel.invokeMethod<bool>('authenticate') ?? false;
} on PlatformException catch (e) {
return false;
}
}
com.company.app/featureMissingPluginException and PlatformException on the Dart side| Service | Detection | Action |
|---|---|---|
| Firebase | google-services.json / GoogleService-Info.plist | Use firebase_core, initialize before runApp() |
| Supabase | supabase_flutter dep | Initialize with Supabase.initialize() before runApp() |
| Crashlytics | firebase_crashlytics dep | Pass FlutterError.onError to Crashlytics in main() |
| Push (FCM) | firebase_messaging dep | Request permission; handle background messages via top-level function |
| Layer | Tool | Scope |
|---|---|---|
| Unit | flutter test + mocktail | Business logic, use cases, repositories |
| Widget | flutter_test + WidgetTester | Individual widget rendering and interaction |
| Golden | golden_toolkit | Visual regression — pixel-diff screenshots |
| Integration | integration_test package | Full app flow on simulator / device |
mocktail — never use real network or file I/O in unit/widget tests--update-goldensbloc_test — assert emitted states for each eventversion and build_number incremented in pubspec.yamlflutter pub outdated)flutter run --releaseprint() statements in production code (debugPrint() only, or a proper logger)flutter_launcher_icons package)flutter_native_splash package)CFBundleIdentifier matches App Store Connect entryCFBundleShortVersionString and CFBundleVersion match pubspec.yaml version/buildNSUsageDescription keys set in ios/Runner/Info.plistapplicationId matches Play Console entryversionName and versionCode match pubspec.yamltargetSdkVersion ≥ current Google Play requirementandroid/app/src/main/res/