mcpField
F
flutter-ui

flutter-ui

github.com/naimehossein77Design & UI547 installsUpdated 27w ago
Repository

About flutter-ui

A Flutter UI development skill that guides state management, navigation, theming, layout, animation, and performance through reference files, checkpoints, and an audit script.

Key features

  1. 01Requires relevant references before coding
  2. 02Detects state management from imports
  3. 03Guides GoRouter navigation and back logic
  4. 04Provides theme, layout, and animation rules
  5. 05Audits const usage and disposal issues

Use cases

  1. 01Choose state and navigation approaches for a screen
  2. 02Check animation disposal and repaint boundaries
  3. 03Find missing const or deprecated APIs
  4. 04Review theme, layout, and error states before release

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/naimehossein77/claude-flutter-ui-skills --skill flutter-ui

After installing, type/flutter-uiin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

flutter-animations.md
flutter-custom-paint.md
flutter-design-thinking.md
flutter-layout-system.md
flutter-navigation.md
flutter-performance.md
flutter-state-ui.md
flutter-theme-system.md
scripts/
flutter_ui_audit.py

Details

From the project README

Flutter UI System

Philosophy: Flutter owns every pixel. Const-first. Theme-driven. GPU-animated. State-scoped.


🔧 Runtime Scripts

ScriptPurposeUsage
scripts/flutter_ui_audit.pyAudit: missing const, dispose leaks, deprecated APIspython scripts/flutter_ui_audit.py <path>

🔴 MANDATORY: Read Reference Files First

⛔ DO NOT code until relevant files are read:

FileContentPriority
flutter-design-thinking.mdAnti-memorization, forces context analysis⬜ CRITICAL FIRST
flutter-state-ui.mdRiverpod + Provider rules Claude MUST enforce⬜ CRITICAL
flutter-navigation.mdGoRouter, PopScope, back logic, deep links⬜ CRITICAL
flutter-animations.mdImplicit, explicit, Hero, page transitions, physics⬜ CRITICAL
flutter-performance.mdconst, RepaintBoundary, 60fps, shader warmup⬜ CRITICAL
flutter-theme-system.mdMaterial 3, ColorScheme, TextTheme, ThemeExtension⬜ Read
flutter-layout-system.mdResponsive, LayoutBuilder, MediaQuery, Slivers⬜ Read
flutter-custom-paint.mdCanvas, CustomPainter, pixel-perfect rendering⬜ Read

🧠 flutter-design-thinking.md FIRST — prevents AI from applying memorized patterns.


⚠️ ASK BEFORE ASSUMING

AspectAsk
State manager"Riverpod, Provider, BLoC, or vanilla?"
Navigation"GoRouter, auto_route, or Navigator 1.0?"
Design system"Material 3, Cupertino, or custom?"
Platforms"Mobile only, or tablet/desktop adaptive?"
Flutter version"3.12+? (PopScope vs WillPopScope)"

⛔ ANTI-PATTERNS

Performance
❌ NEVER✅ ALWAYS
ListView with static children for long listsListView.builder
setState in animation loopAnimatedBuilder
Opacity(opacity: 0) to hideVisibility or conditional render
IntrinsicHeight/IntrinsicWidth in listsFixed heights or SliverFixedExtentList
Missing const on StatelessWidgetconst MyWidget({super.key}) always
Column + ListView without ExpandedWrap ListView in Expanded
Hardcoded Color(0xFF...) in widgetsTheme.of(context).colorScheme.primary
Hardcoded fontSizeTheme.of(context).textTheme.bodyLarge
Animation
❌ NEVER✅ ALWAYS
Animate width/heightAnimate Transform (scale/translate)
AnimationController without dispose()Dispose in dispose() method
addListener(() => setState((){}))AnimatedBuilder
Missing RepaintBoundary on complex paintersWrap CustomPaint in RepaintBoundary
Hero tag collisionUnique data-driven tags
No easing curveCurves.easeInOut minimum
Navigation
❌ NEVER✅ ALWAYS
WillPopScope (Flutter 3.12+ deprecated)PopScope with canPop + onPopInvokedWithResult
Navigator.push in GoRouter appcontext.go() / context.push()
Hardcoded route strings everywhereCentralized route constants
No route guard for auth screensGoRouter redirect callback
Back button does nothing at rootPopScope(canPop: false) + exit dialog
State
❌ NEVER✅ ALWAYS
ref.read() in build() (Riverpod)ref.watch() in build()
Provider defined inside build()Top-level final myProvider = ...
context.read<T>() in build() (Provider)context.watch<T>() in build()
BuildContext in ChangeNotifierPass data, not context
notifyListeners() before mutationMutate first, then notifyListeners()
.when() without error handlerAlways when(data:, loading:, error:)
Consumer<T> wrapping entire screenSelector<T, R> on smallest widget

🗺️ Navigation: go() vs push() vs replace()

MethodBack StackUse When
context.go('/path')Replaces stackTab switching, auth redirect
context.push('/path')Adds to stackDrill-down navigation
context.replace('/path')Replaces current, no popLogin → Home after auth
context.pop()Removes currentBack button, close modal
context.pop(result)Removes + returns dataForm submit, picker result

🎬 Animation Selection

WHAT ARE YOU ANIMATING?
├── Simple property change → AnimatedContainer, AnimatedOpacity, TweenAnimationBuilder
├── Complex sequence/stagger → AnimationController + CurvedAnimation + AnimatedBuilder
├── Shared element (cross-screen) → Hero widget + unique tag
├── Page enter/exit → GoRouter CustomTransitionPage or pageBuilder
├── Spring/bounce/momentum → SpringSimulation, BouncingScrollPhysics
└── Vector/sprite → Rive or Lottie package

GPU-safe: transform, opacity → smooth CPU-bound: width, height, margin, padding → jank


📊 State Manager Auto-Detect

Scan imports before writing any state code:

Import FoundUse
flutter_riverpodRiverpod rules
provider packageProvider rules
NeitherAsk user → recommend Riverpod for new projects

⚡ Performance Quick Reference

class MyCard extends StatelessWidget {
  const MyCard({super.key});
  @override
  Widget build(BuildContext context) => const Padding(
    padding: EdgeInsets.all(16),
    child: Text('Hello'),
  );
}

RepaintBoundary(child: AnimatedWidget(...))

ListView.builder(itemCount: n, itemBuilder: (ctx, i) => Item(items[i]))

final name = ref.watch(userProvider.select((u) => u.name));

🧠 CHECKPOINT (Fill Before Any Flutter Work)

🧠 FLUTTER CHECKPOINT:

State:      [ Riverpod / Provider / BLoC / Vanilla ]
Navigation: [ GoRouter / auto_route / Navigator 1.0 ]
Design:     [ Material 3 / Cupertino / Custom ]
Platforms:  [ Mobile / Tablet / Desktop / Web ]
Files Read: [ List files read ]

3 Rules I Will Apply:
1. _______________
2. _______________
3. _______________

Anti-Patterns I Will Avoid:
1. _______________
2. _______________

🔴 Can't fill checkpoint? → Read the skill files.


📋 Checklists

Per Screen
  • ConsumerWidget if Riverpod? const constructor?
  • Touch targets ≥ 48dp?
  • Loading + error states defined?
  • Back navigation tested (PopScope or GoRouter canPop)?
  • No hardcoded colors or font sizes?
Per Animation
  • Animating transform/opacity, not width/height?
  • AnimationController.dispose() called?
  • Duration ≥ 150ms with easing curve?
  • RepaintBoundary on complex painters?
Pre-Release
  • Run audit script — fix all 🔴 findings
  • flutter analyze — no missing const warnings
  • Android back button tested — no stuck screens
  • Dark mode tested — all colors from Theme
  • Tablet layout tested — no overflow
  • All .when() handle error state

📚 Reference Files

FileUse When
flutter-design-thinking.mdFIRST — prevents AI defaults
flutter-state-ui.mdRiverpod + Provider rules, patterns, migration
flutter-navigation.mdGoRouter, back logic, deep links, tabs
flutter-animations.mdImplicit, explicit, Hero, transitions, physics
flutter-theme-system.mdMaterial 3, ColorScheme, TextTheme
flutter-layout-system.mdResponsive, LayoutBuilder, Slivers
flutter-performance.mdconst, RepaintBoundary, DevTools
flutter-custom-paint.mdCanvas, CustomPainter, pixel-perfect

Pixel-perfect = every spacing, color, and type choice is intentional and theme-driven. Own the pixels through your design system, not magic numbers.

Comments

Markdown supported