1. Performance & Rendering
- Const-First: Every widget that can be
constMUST beconst. - Lazy Rendering: Use
SliverList.builderorSliverGrid.builderfor lists > 10 items. - Repaint Boundaries: Wrap complex animations in
RepaintBoundary. - Isolate Parsing: Use
compute()orIsolatefor JSON > 1MB. - BuildContext Safety: Check
mountedbefore usingcontextacross async gaps.
2. Design Tokens (Theming)
Use AppColors, AppSpacing, AppRadius, and AppTypography. NEVER hardcode raw values.
- Colors: Use
context.colorScheme.primaryorAppColors. Support light/dark modes. - Spacing: Use
AppSpacing.sm(8),AppSpacing.md(16), etc. UseSizedBoxfor gaps. - Radius: Use
AppRadius.md(12) for consistent rounding. - Typography: Use
context.textTheme.bodyMedium. Support text scaling.
3. Reusable Components
- Single Responsibility: Each component has one clear purpose.
- Parameterization: Expose parameters for customization.
- Complexity: Extract widgets or code blocks used multiple times into
core/views/widgets. - Keys: Assign
Key('feature_action_id')to interactive widgets for test access.
4. Widget & Interaction Patterns
- Extraction: STRICTLY prohibit private
_build*()methods. Extract into separate widget classes. - Slivers: Prefer
CustomScrollViewwith Slivers for non-trivial scrollable layouts. - FAB: Use Floating Action Buttons for primary positive actions (Add, Create).
- Scroll Padding: Add dynamic bottom padding when a FAB or BottomBar is present to prevent overlap.
- Sheets vs Screens: Prefer full
Scaffoldscreens overModalBottomSheetfor complex forms.
5. Adaptive & Responsive Design and Common Fixes
- Mobile First: Design for mobile, then adapt for tablet (
600-840dp) and desktop (>840dp). UseMediaQuery.sizeOf(context).width. - Layout Builder: Use
LayoutBuilderwhen widget rendering depends on the immediate parent's constraints, not the whole screen. - Safe Area: Always wrap main layouts in
SafeAreato avoid device notches and system UI. - Overflow Fixes:
A RenderFlex overflowed...: Typically means a widget is demanding more space than available in aRoworColumn. Wrap the offending widget inExpandedorFlexible.Vertical viewport was given unbounded height: Often happens when nesting scrollable views (likeListViewinsideColumn). UseExpandedon theListViewor setshrinkWrap: true.
- Rules: Never lock orientation unless strictly required by a unique feature. Support keyboard navigation and hover effects for desktop users.
6. UI States & Accessibility
- States: Always handle Loading, Error, and Empty states with clear messaging.
- Accessibility: Include
Semanticslabels. Ensure 48x48 dp touch targets. WCAG AA contrast.
Source: dhruvanbhalara/skills — distributed by TomeVault.