
Flutter Development
Scaffold Flutter apps with GoRouter routes, Material 3 theming, and Provider-backed screens when your agent needs mobile UI patterns instead of guessing widget structure.
Overview
Flutter Development is an agent skill for the Build phase that supplies GoRouter navigation, Material 3 theming, and Provider-ready screen scaffolds for Flutter mobile apps.
Install
npx skills add https://github.com/aj-geddes/useful-ai-prompts --skill flutter-developmentWhat is this skill?
- pubspec.yaml template with Flutter SDK, Provider, HTTP, and go_router dependencies
- MaterialApp.router setup with Material 3 ThemeData and declarative GoRouter route trees
- Nested GoRoute patterns including path parameters for details/:id screens
- Stateful HomeScreen scaffold with initState hooks ready for Provider consumption
- Cross-screen navigation paths for home and profile routes in one router config
Adoption & trust: 577 installs on skills.sh; 250 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want a Flutter app skeleton with sane routing and state hooks, but your agent keeps producing fragmented widgets without a coherent project layout.
Who is it for?
Solo builders starting or extending a Flutter client who already chose Flutter and need navigation plus Provider integration patterns fast.
Skip if: Teams that need only backend APIs, desktop-only tooling, or a full store-release pipeline without writing any Flutter UI.
When should I use this skill?
When implementing or extending Flutter mobile UI with navigation and Provider-based screens.
What do I get? / Deliverables
You get copy-ready Dart for pubspec dependencies, routerConfig, and screen stubs you can extend with business logic and tests.
- Router and main.dart configuration snippets
- Screen widget stubs with Provider integration hooks
Recommended Skills
Journey fit
Flutter screen and navigation code belongs on the build shelf under frontend because solo builders install it while implementing the client app, not during idea research or ship-only checklists. Subphase frontend fits widget composition, routing, and state wiring—the README’s HomeScreen, GoRouter, and Provider examples are product UI work, not backend APIs or ops.
How it compares
Use as a procedural Flutter layout reference instead of generic “build me an app” chat without routing or dependency conventions.
Common Questions / FAQ
Who is flutter-development for?
Indie and solo developers using Claude Code, Cursor, or similar agents to build Flutter mobile products who want structured routing and Provider examples in the prompt context.
When should I use flutter-development?
During the build phase while implementing screens and navigation; also handy in validate when you prototype a Flutter MVP shell before committing to full features.
Is flutter-development safe to install?
Review the Security Audits panel on this Prism page and inspect the skill files in your repo before trusting generated code in production builds.
SKILL.md
READMESKILL.md - Flutter Development
# Project Structure & Navigation ## Project Structure & Navigation ```dart // pubspec.yaml name: my_flutter_app version: 1.0.0 dependencies: flutter: sdk: flutter provider: ^6.0.0 http: ^1.1.0 go_router: ^12.0.0 // main.dart with GoRouter navigation import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp.router( title: 'Flutter App', theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true), routerConfig: _router, ); } } final GoRouter _router = GoRouter( routes: <RouteBase>[ GoRoute( path: '/', builder: (context, state) => const HomeScreen(), routes: [ GoRoute( path: 'details/:id', builder: (context, state) => DetailsScreen( itemId: state.pathParameters['id']! ), ), ], ), GoRoute( path: '/profile', builder: (context, state) => const ProfileScreen(), ), ], ); ``` # Screens with Provider Integration ## Screens with Provider Integration ```dart class HomeScreen extends StatefulWidget { const HomeScreen({Key? key}) : super(key: key); @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { @override void initState() { super.initState(); Future.microtask(() { Provider.of<ItemsProvider>(context, listen: false).fetchItems(); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Home Feed')), body: Consumer<ItemsProvider>( builder: (context, itemsProvider, child) { if (itemsProvider.items.isEmpty) { return const Center(child: Text('No items found')); } return ListView.builder( itemCount: itemsProvider.items.length, itemBuilder: (context, index) { final item = itemsProvider.items[index]; return ItemCard(item: item); }, ); }, ), ); } } class ItemCard extends StatelessWidget { final Map<String, dynamic> item; const ItemCard({required this.item, Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Card( margin: const EdgeInsets.all(8), child: ListTile( title: Text(item['title'] ?? 'Untitled'), subtitle: Text(item['description'] ?? ''), trailing: const Icon(Icons.arrow_forward), onTap: () => context.go('/details/${item['id']}'), ), ); } } class DetailsScreen extends StatelessWidget { final String itemId; const DetailsScreen({required this.itemId, Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Details')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Item ID: $itemId', style: const TextStyle(fontSize: 18)), const SizedBox(height: 16), ElevatedButton( onPressed: () => context.pop(), child: const Text('Go Back'), ), ], ), ), ); } } class ProfileScreen extends StatelessWidget { const ProfileScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Profile')), body: Consumer<UserProvider>( builder: (context, userProvider, child) { if (userProvider.isLoading) { return const Center(child: CircularProgressIndicator()); } if (userProvider.error != null) { return Center(child: Text('Error: ${userProvider.error}'));