Create distinctive, production-grade Flutter mobile applications with Material Design 3. Use this skill when the user asks to build Flutter widgets, screens, pages, or complete mobile apps. Handles UI creation from scratch, design-to-code conversion (Figma/mockups), architecture patterns (Riverpod, BLoC), and Flutter best practices. Generates beautiful, performant Flutter code that avoids generic aesthetics.
This skill inherits all available tools. When active, it can use any tool Claude has access to.
This skill guides creation of distinctive, production-grade Flutter mobile applications using Material Design 3. Implement real working Dart/Flutter code with exceptional attention to aesthetic details, performance, and platform conventions.
The user provides mobile app requirements: a widget, screen, feature, or complete application to build. They may include context about the purpose, target platform (iOS/Android), or design references.
Before coding, understand the context and commit to a strong design direction:
Then implement working Flutter code that is:
Use Material 3 type scale with Theme.of(context).textTheme:
Text(
'Headline',
style: Theme.of(context).textTheme.headlineMedium,
)
Type roles: displayLarge/Medium/Small, headlineLarge/Medium/Small, titleLarge/Medium/Small, bodyLarge/Medium/Small, labelLarge/Medium/Small.
For custom fonts, define in TextTheme and apply via ThemeData. Prefer Google Fonts that complement Material 3.
Use Material 3 ColorScheme with semantic colors:
ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.deepPurple,
brightness: Brightness.light,
),
useMaterial3: true,
)
Access colors semantically:
colorScheme.primary / onPrimary - Key actions, FABcolorScheme.secondary / onSecondary - Less prominent actionscolorScheme.tertiary / onTertiary - Contrasting accentscolorScheme.surface / onSurface - Cards, sheets, dialogscolorScheme.error / onError - Error statesSupport dark mode with Brightness.dark variant.
Prefer Material 3 widgets:
FilledButton, FilledButton.tonal, OutlinedButton, TextButtonFloatingActionButton.extended with iconNavigationBar (bottom), NavigationRail (side), NavigationDrawerCard with elevation and surfaceTintColorSearchAnchor for searchSegmentedButton for togglesSlider, Switch, Checkbox with M3 stylingUse Material widget with proper elevation and surfaceTintColor for custom surfaces.
Use purposeful, expressive motion:
// Implicit animations
AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeOutCubic,
// ...
)
// Hero transitions
Hero(
tag: 'item-$id',
child: Image.network(url),
)
// Page transitions
MaterialPageRoute(
builder: (context) => DetailScreen(),
)
Motion principles:
Duration guidelines: 150ms (small), 300ms (medium), 500ms (large/complex).
Use Material spacing scale (multiples of 4dp):
const EdgeInsets.all(16) // Standard padding
const EdgeInsets.symmetric(horizontal: 24, vertical: 16)
const SizedBox(height: 8) // Vertical spacing
Responsive layouts:
LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > 600) {
return WideLayout();
}
return NarrowLayout();
},
)
Use Flex, Wrap, GridView.builder for adaptive grids.
// Define providers
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
return CounterNotifier();
});
class CounterNotifier extends StateNotifier<int> {
CounterNotifier() : super(0);
void increment() => state++;
}
// Use in widget
class CounterWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text('$count');
}
}
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0) {
on<Increment>((event, emit) => emit(state + 1));
}
}
lib/
├── main.dart
├── app/
│ ├── app.dart # MaterialApp setup
│ └── router.dart # Navigation (go_router)
├── features/
│ └── feature_name/
│ ├── presentation/ # Widgets, screens
│ ├── application/ # Business logic, providers/blocs
│ ├── domain/ # Entities, repositories interfaces
│ └── data/ # Repository implementations, DTOs
├── shared/
│ ├── widgets/ # Reusable widgets
│ └── theme/ # ThemeData, ColorScheme
└── core/
├── constants/
└── utils/
const constructors everywhere possibleListView.builder / GridView.builder for long listscached_network_imageConsumer or BlocBuilderRepaintBoundary for complex animationsSafeArea widget)CupertinoPageRoute for iOS-style transitions// Good: Descriptive, const, proper typing
const EdgeInsets kDefaultPadding = EdgeInsets.all(16);
class ProductCard extends StatelessWidget {
const ProductCard({
super.key,
required this.product,
this.onTap,
});
final Product product;
final VoidCallback? onTap;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final colors = theme.colorScheme;
return Card(
clipBehavior: Clip.antiAlias,
child: InkWell(
onTap: onTap,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Widget content
],
),
),
);
}
}
NEVER generate generic, boilerplate Flutter code. Each implementation should feel crafted for its specific purpose with thoughtful Material Design 3 application and attention to detail.