Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Specialized skill for Flutter app development and Dart programming
.claude/skills/a5c-ai-flutter-dart-development/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 8 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 71% | 0% |
This skill provides specialized capabilities for Flutter app development and Dart programming. It enables execution of Flutter CLI commands, widget generation, state management configuration, and comprehensive debugging with Flutter DevTools.
bash - Execute Flutter CLI, Dart commands, and pub operationsread - Analyze Flutter project files, widgets, and configurationswrite - Generate and modify Dart code and Flutter configurationsedit - Update existing Flutter widgets and configurationsglob - Search for Dart files and Flutter assetsgrep - Search for patterns in Flutter codebaseThis skill integrates with the following processes:
flutter-app-scaffolding.js - Project setup and configurationcross-platform-ui-library.js - Shared widget developmentmobile-testing-strategy.js - Test implementationmobile-performance-optimization.js - Performance tuningproject-root/
├── lib/
│ ├── main.dart
│ ├── app/
│ │ ├── app.dart
│ │ └── router.dart
│ ├── features/
│ │ └── feature_name/
│ │ ├── data/
│ │ ├── domain/
│ │ └── presentation/
│ ├── core/
│ │ ├── constants/
│ │ ├── errors/
│ │ ├── extensions/
│ │ └── utils/
│ └── shared/
│ └── widgets/
├── test/
├── integration_test/
├── assets/
├── pubspec.yaml
└── analysis_options.yamlyaml# analysis_options.yaml include: package:flutter_lints/flutter.yaml linter: rules: prefer_const_constructors: true prefer_const_declarations: true avoid_print: true prefer_single_quotes: true require_trailing_commas: true analyzer: errors: invalid_annotation_target: ignore exclude: - "**/*.g.dart" - "**/*.freezed.dart"
bash# Create new Flutter project flutter create --org com.example my_app # Create with specific platforms flutter create --platforms android,ios,web my_app # Add dependencies flutter pub add flutter_bloc equatable flutter pub add --dev build_runner freezed freezed_annotation
dart// lib/features/home/presentation/widgets/custom_card.dart import 'package:flutter/material.dart'; class CustomCard extends StatelessWidget { const CustomCard({ super.key, required this.title, required this.subtitle, this.onTap, }); final String title; final String subtitle; final VoidCallback? onTap; @override Widget build(BuildContext context) { final theme = Theme.of(context); return Card( elevation: 2, child: InkWell( onTap: onTap, borderRadius: BorderRadius.circular(12), child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: theme.textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( subtitle, style: theme.textTheme.bodyMedium?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), ), ], ), ), ), ); } }
dart// lib/features/auth/presentation/bloc/auth_bloc.dart import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; part 'auth_event.dart'; part 'auth_state.dart'; class AuthBloc extends Bloc<AuthEvent, AuthState> { AuthBloc({required this.authRepository}) : super(const AuthInitial()) { on<AuthLoginRequested>(_onLoginRequested); on<AuthLogoutRequested>(_onLogoutRequested); } final AuthRepository authRepository; Future<void> _onLoginRequested( AuthLoginRequested event, Emitter<AuthState> emit, ) async { emit(const AuthLoading()); try { final user = await authRepository.login( email: event.email, password: event.password, ); emit(AuthAuthenticated(user: user)); } catch (e) { emit(AuthError(message: e.toString())); } } Future<void> _onLogoutRequested( AuthLogoutRequested event, Emitter<AuthState> emit, ) async { await authRepository.logout(); emit(const AuthUnauthenticated()); } }
dart// lib/app/router.dart import 'package:go_router/go_router.dart'; final router = GoRouter( initialLocation: '/', routes: [ GoRoute( path: '/', name: 'home', builder: (context, state) => const HomeScreen(), routes: [ GoRoute( path: 'details/:id', name: 'details', builder: (context, state) { final id = state.pathParameters['id']!; return DetailsScreen(id: id); }, ), ], ), GoRoute( path: '/login', name: 'login', builder: (context, state) => const LoginScreen(), ), ], redirect: (context, state) { final isAuthenticated = authProvider.isAuthenticated; final isLoggingIn = state.matchedLocation == '/login'; if (!isAuthenticated && !isLoggingIn) { return '/login'; } if (isAuthenticated && isLoggingIn) { return '/'; } return null; }, );
dart// lib/features/user/domain/entities/user.dart import 'package:freezed_annotation/freezed_annotation.dart'; part 'user.freezed.dart'; part 'user.g.dart'; @freezed class User with _$User { const factory User({ required String id, required String email, required String name, String? avatarUrl, @Default(false) bool isVerified, }) = _User; factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); }
bash flutter clean && flutter pub get
bash dart run build_runner build --delete-conflicting-outputs
bash cd ios && pod install --repo-update && cd ..
bash cd android && ./gradlew clean && cd ..
react-native-dev - Alternative cross-platform frameworkmobile-testing - Comprehensive testing frameworksmobile-perf - Performance profiling and optimizationkotlin-compose - Native Android development| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 19,178 | 23,403 | +22% | 1 | 1 | 0% | 3,289 | 6,273 | +91% | 0 | 0 | — |
case-02 | pass→pass | 5,095 | 3,936 | -23% | 1 | 1 | 0% | 989 | 3,129 | +216% | 0 | 0 | — |
case-03 | pass→pass | 7,020 | 3,425 | -51% | 1 | 1 | 0% | 1,311 | 3,108 | +137% | 0 | 0 | — |
case-04 | pass→pass | 8,578 | 5,412 | -37% | 1 | 1 | 0% | 1,553 | 3,393 | +118% | 0 | 0 | — |
case-05 | pass→pass | 9,212 | 6,591 | -28% | 1 | 1 | 0% | 1,569 | 3,737 | +138% | 0 | 0 | — |
case-06 | pass→fail | 11,807 | 6,458 | -45% | 1 | 1 | 0% | 1,921 | 3,566 | +86% | 0 | 0 | — |
case-07 | fail→pass | 13,110 | 3,388 | -74% | 1 | 1 | 0% | 2,089 | 2,928 | +40% | 0 | 0 | — |
case-08 | fail→pass | 9,923 | 1,256 | -87% | 1 | 1 | 0% | 1,550 | 2,708 | +75% | 0 | 0 | — |
case-09 | pass→pass | 12,929 | 16,381 | +27% | 1 | 1 | 0% | 2,536 | 5,060 | +100% | 0 | 0 | — |
case-10 | pass→pass | 14,870 | 17,291 | +16% | 1 | 1 | 0% | 2,892 | 5,919 | +105% | 0 | 0 | — |
case-11 | pass→pass | 6,476 | 6,970 | +8% | 1 | 1 | 0% | 1,389 | 3,991 | +187% | 0 | 0 | — |
case-12 | pass→pass | 14,316 | 12,063 | -16% | 1 | 1 | 0% | 2,532 | 4,810 | +90% | 0 | 0 | — |
case-13 | pass→pass | 2,866 | 3,243 | +13% | 1 | 1 | 0% | 506 | 3,046 | +502% | 0 | 0 | — |
case-14 | fail→pass | 16,759 | 14,480 | -14% | 1 | 1 | 0% | 2,839 | 5,307 | +87% | 0 | 0 | — |
case-15 | pass→pass | 9,395 | 4,636 | -51% | 1 | 1 | 0% | 1,875 | 3,382 | +80% | 0 | 0 | — |
case-16 | pass→pass | 7,139 | 5,999 | -16% | 1 | 1 | 0% | 1,156 | 3,479 | +201% | 0 | 0 | — |
case-17 | pass→pass | 13,688 | 10,819 | -21% | 1 | 1 | 0% | 2,094 | 4,521 | +116% | 0 | 0 | — |
case-18 | pass→pass | 12,557 | 13,055 | +4% | 1 | 1 | 0% | 2,567 | 5,049 | +97% | 0 | 0 | — |
case-19 | fail→pass | 10,467 | 2,760 | -74% | 1 | 1 | 0% | 1,701 | 2,903 | +71% | 0 | 0 | — |
case-20 | pass→pass | 14,895 | 15,191 | +2% | 1 | 1 | 0% | 2,429 | 5,459 | +125% | 0 | 0 | — |
case-21 | pass→pass | 10,406 | 9,216 | -11% | 1 | 1 | 0% | 1,646 | 3,893 | +137% | 0 | 0 | — |
case-22 | pass→pass | 14,612 | 14,765 | +1% | 1 | 1 | 0% | 2,338 | 5,583 | +139% | 0 | 0 | — |
case-23 | pass→pass | 9,503 | 12,137 | +28% | 1 | 1 | 0% | 1,805 | 5,138 | +185% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.