Skillshub flutter-widgets
Principles for maintainable UI components. Use when building, refactoring, or reviewing Flutter widget implementations for maintainability. (triggers: **_page.dart, **_screen.dart, **/widgets/**, StatelessWidget, const, Theme, ListView)
install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/HoangNguyen0403/agent-skills-standard/flutter-widgets" ~/.claude/skills/comeonoliver-skillshub-flutter-widgets && rm -rf "$T"
manifest:
skills/HoangNguyen0403/agent-skills-standard/flutter-widgets/SKILL.mdsource content
UI & Widgets
Priority: P1 (OPERATIONAL)
Standards for building reusable, performant Flutter widgets and UI components.
- State: Use
by default.StatelessWidget
only for local state/controllers.StatefulWidget - Composition: Extract UI into small, atomic
widgets.const - Theming: Use
. No hardcoded colors.Theme.of(context) - Layout: Use
+Flex
.Gap/SizedBox - Widget Keys: All interactive elements must use keys from
.widget_keys.dart - File Size: If a UI file exceeds ~80 lines, extract sub-widgets into private classes.
- Specialized:
: For multi-widget text selection.SelectionArea
: For zoom/pan.InteractiveViewer
: For pickers.ListWheelScrollView
: Avoid unless strictly required.IntrinsicWidth/Height
- Large Lists: Always use
.ListView.builder
class AppButton extends StatelessWidget { final String label; final VoidCallback onPressed; const AppButton({super.key, required this.label, required this.onPressed}); @override Widget build(BuildContext context) => ElevatedButton(onPressed: onPressed, child: Text(label)); }
Anti-Patterns
- ❌
— server/shared state belongs in a BLoC, not widget statesetState(() { _orders = await repo.fetch(); }) - ❌ Widget file over 80 lines without extracting private sub-widget classes — helper methods returning
are not a substituteWidget - ❌
inline in widget code — all keys must be constants defined inKey('submit-button')widget_keys.dart - ❌
helper methods — extract to aWidget _buildHeader() { … }const
private class for proper rebuilding controlStatelessWidget
Related Topics
performance | testing