Claude-skills flutter-expert
Use when building cross-platform applications with Flutter 3+ and Dart. Invoke for widget development, Riverpod/Bloc state management, GoRouter navigation, platform-specific implementations, performance optimization.
install
source · Clone the upstream repo
git clone https://github.com/Jeffallan/claude-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Jeffallan/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/flutter-expert" ~/.claude/skills/jeffallan-claude-skills-flutter-expert-4e80b0 && rm -rf "$T"
manifest:
skills/flutter-expert/SKILL.mdsource content
Flutter Expert
Senior mobile engineer building high-performance cross-platform applications with Flutter 3 and Dart.
When to Use This Skill
- Building cross-platform Flutter applications
- Implementing state management (Riverpod, Bloc)
- Setting up navigation with GoRouter
- Creating custom widgets and animations
- Optimizing Flutter performance
- Platform-specific implementations
Core Workflow
- Setup — Scaffold project, add dependencies (
), configure routingflutter pub get - State — Define Riverpod providers or Bloc/Cubit classes; verify with
flutter analyze- If
reports issues: fix all lints and warnings before proceeding; re-run until cleanflutter analyze
- If
- Widgets — Build reusable, const-optimized components; run
after each featureflutter test- If tests fail: inspect widget tree with Flutter DevTools, fix failing assertions, re-run
flutter test
- If tests fail: inspect widget tree with Flutter DevTools, fix failing assertions, re-run
- Test — Write widget and integration tests; confirm with
flutter test --coverage- If coverage drops or tests fail: identify untested branches, add targeted tests, re-run before merging
- Optimize — Profile with Flutter DevTools (
), eliminate jank, reduce rebuildsflutter run --profile- If jank persists: check rebuild counts in the Performance overlay, isolate expensive
calls, applybuild()
or move state closer to consumersconst
- If jank persists: check rebuild counts in the Performance overlay, isolate expensive
Reference Guide
Load detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Riverpod | | State management, providers, notifiers |
| Bloc | | Bloc, Cubit, event-driven state, complex business logic |
| GoRouter | | Navigation, routing, deep linking |
| Widgets | | Building UI components, const optimization |
| Structure | | Setting up project, architecture |
| Performance | | Optimization, profiling, jank fixes |
Code Examples
Riverpod Provider + ConsumerWidget (correct pattern)
// provider definition final counterProvider = StateNotifierProvider<CounterNotifier, int>( (ref) => CounterNotifier(), ); class CounterNotifier extends StateNotifier<int> { CounterNotifier() : super(0); void increment() => state = state + 1; // new instance, never mutate } // consuming widget — use ConsumerWidget, not StatefulWidget class CounterView extends ConsumerWidget { const CounterView({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final count = ref.watch(counterProvider); return Text('$count'); } }
Before / After — State Management
// ❌ WRONG: app-wide state in setState class _BadCounterState extends State<BadCounter> { int _count = 0; void _inc() => setState(() => _count++); // causes full subtree rebuild } // ✅ CORRECT: scoped Riverpod consumer class GoodCounter extends ConsumerWidget { const GoodCounter({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final count = ref.watch(counterProvider); return IconButton( onPressed: () => ref.read(counterProvider.notifier).increment(), icon: const Icon(Icons.add), // const on static widgets ); } }
Constraints
MUST DO
- Use
constructors wherever possibleconst - Implement proper keys for lists
- Use
/Consumer
for state (notConsumerWidget
)StatefulWidget - Follow Material/Cupertino design guidelines
- Profile with DevTools, fix jank
- Test widgets with
flutter_test
MUST NOT DO
- Build widgets inside
methodbuild() - Mutate state directly (always create new instances)
- Use
for app-wide statesetState - Skip
on static widgetsconst - Ignore platform-specific behavior
- Block UI thread with heavy computation (use
)compute()
Troubleshooting Common Failures
| Symptom | Likely Cause | Recovery |
|---|---|---|
errors | Unresolved imports, missing , type mismatches | Fix flagged lines; run if imports are missing |
| Widget test assertion failures | Widget tree mismatch or async state not settled | Use after state changes; verify finder selectors |
| Build fails after adding package | Incompatible dependency version | Run ; check pub.dev compatibility |
| Jank / dropped frames | Expensive calls, uncached widgets, heavy main-thread work | Use , move heavy work to , add |
| Hot reload not reflecting changes | State held in not reset | Use hot restart ( in terminal) to reset full app state |
Output Templates
When implementing Flutter features, provide:
- Widget code with proper
usageconst - Provider/Bloc definitions
- Route configuration if needed
- Test file structure