Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Build cross-platform Flutter 3 apps with Riverpod/Bloc state management, GoRouter navigation, and performance optimization.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/widget-patterns.md
1# Widget Patterns23## Optimized Widget Pattern45```dart6// Use const constructors7class OptimizedCard extends StatelessWidget {8final String title;9final VoidCallback onTap;1011const OptimizedCard({12super.key,13required this.title,14required this.onTap,15});1617@override18Widget build(BuildContext context) {19return Card(20child: InkWell(21onTap: onTap,22child: Padding(23padding: const EdgeInsets.all(16),24child: Text(title, style: Theme.of(context).textTheme.titleMedium),25),26),27);28}29}30```3132## Responsive Layout3334```dart35class ResponsiveLayout extends StatelessWidget {36final Widget mobile;37final Widget? tablet;38final Widget desktop;3940const ResponsiveLayout({41super.key,42required this.mobile,43this.tablet,44required this.desktop,45});4647@override48Widget build(BuildContext context) {49return LayoutBuilder(50builder: (context, constraints) {51if (constraints.maxWidth >= 1100) return desktop;52if (constraints.maxWidth >= 650) return tablet ?? mobile;53return mobile;54},55);56}57}58```5960## Custom Hooks (flutter_hooks)6162```dart63import 'package:flutter_hooks/flutter_hooks.dart';6465class CounterWidget extends HookWidget {66@override67Widget build(BuildContext context) {68final counter = useState(0);69final controller = useTextEditingController();7071useEffect(() {72// Setup73return () {74// Cleanup75};76}, []);7778return Column(79children: [80Text('Count: ${counter.value}'),81ElevatedButton(82onPressed: () => counter.value++,83child: const Text('Increment'),84),85],86);87}88}89```9091## Sliver Patterns9293```dart94CustomScrollView(95slivers: [96SliverAppBar(97expandedHeight: 200,98pinned: true,99flexibleSpace: FlexibleSpaceBar(100title: const Text('Title'),101background: Image.network(imageUrl, fit: BoxFit.cover),102),103),104SliverList(105delegate: SliverChildBuilderDelegate(106(context, index) => ListTile(title: Text('Item $index')),107childCount: 100,108),109),110],111)112```113114## Key Optimization Patterns115116| Pattern | Implementation |117|---------|----------------|118| **const widgets** | Add `const` to static widgets |119| **keys** | Use `Key` for list items |120| **select** | `ref.watch(provider.select(...))` |121| **RepaintBoundary** | Isolate expensive repaints |122| **ListView.builder** | Lazy loading for lists |123| **const constructors** | Always use when possible |124