// Build cross-platform mobile apps with Flutter and Dart. Use when creating mobile applications, working with Flutter projects, designing UIs with widgets, implementing state management (Provider/BLoC), handling navigation, or when user mentions Flutter, Dart, mobile app development, iOS/Android apps, or Material Design.
| name | flutter-development |
| description | Build cross-platform mobile apps with Flutter and Dart. Use when creating mobile applications, working with Flutter projects, designing UIs with widgets, implementing state management (Provider/BLoC), handling navigation, or when user mentions Flutter, Dart, mobile app development, iOS/Android apps, or Material Design. |
Build beautiful, natively compiled applications for mobile, web, and desktop from a single codebase using Flutter and Dart.
Use this Skill when:
Standard Flutter project:
my_flutter_app/
âââ lib/
â âââ main.dart # App entry point
â âââ screens/ # Screen widgets
â âââ widgets/ # Reusable widgets
â âââ models/ # Data models
â âââ services/ # API, database services
â âââ providers/ # State management
âââ pubspec.yaml # Dependencies and assets
âââ test/ # Unit and widget tests
âââ assets/ # Images, fonts, etc.
flutter create my_app
cd my_app
flutter run # Default device
flutter run -d chrome # Web
flutter run -d linux # Linux desktop
flutter run -d android # Android device/emulator
flutter pub add package_name # Add dependency
flutter pub get # Install dependencies
flutter pub upgrade # Update dependencies
flutter test # Run tests
flutter analyze # Static analysis
flutter build apk # Android APK
flutter build ios # iOS build
flutter build web # Web build
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: const Center(
child: Text('Hello, Flutter!'),
),
);
}
}
Install Provider:
flutter pub add provider
Example usage:
// 1. Create a ChangeNotifier model
class Counter extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
// 2. Wrap app with ChangeNotifierProvider
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => Counter(),
child: const MyApp(),
),
);
}
// 3. Access in widgets
class CounterDisplay extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counter = context.watch<Counter>();
return Text('Count: ${counter.count}');
}
}
// 4. Trigger updates
ElevatedButton(
onPressed: () => context.read<Counter>().increment(),
child: const Text('Increment'),
)
// Navigate to new screen
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondScreen()),
);
// Navigate back
Navigator.pop(context);
// Navigate with data
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailScreen(data: myData),
),
);
flutter pub add go_router
final router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomeScreen(),
),
GoRoute(
path: '/details/:id',
builder: (context, state) {
final id = state.pathParameters['id']!;
return DetailScreen(id: id);
},
),
],
);
// Use in app
MaterialApp.router(
routerConfig: router,
)
// Navigate
context.go('/details/123');
Install http package:
flutter pub add http
Example:
import 'package:http/http.dart' as http;
import 'dart:convert';
Future<List<User>> fetchUsers() async {
final response = await http.get(
Uri.parse('https://api.example.com/users'),
);
if (response.statusCode == 200) {
final List<dynamic> data = json.decode(response.body);
return data.map((json) => User.fromJson(json)).toList();
} else {
throw Exception('Failed to load users');
}
}
// Use with FutureBuilder
FutureBuilder<List<User>>(
future: fetchUsers(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return ListTile(title: Text(snapshot.data![index].name));
},
);
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
return const CircularProgressIndicator();
},
)
â
Use const constructors wherever possible for better performance
â
Implement proper dispose() methods to prevent memory leaks
â
Extract widgets into separate classes for reusability
â
Use meaningful, descriptive widget names
â
Separate business logic from UI (use services/providers)
â
Handle errors comprehensively with try-catch
â
Test on both iOS and Android platforms
â
Use responsive design (MediaQuery, LayoutBuilder)
â
Follow Dart naming conventions (lowerCamelCase for variables, UpperCamelCase for classes)
â
Add comments for complex logic
â Hardcode values (use constants or configuration) â Use complex setState logic (prefer state management solutions) â Make network calls in build() methods â Skip testing phases â Ignore platform-specific differences â Create deeply nested widget trees (extract to methods/classes) â Store heavy objects in state unnecessarily â Forget to add loading and error states
Move state to common ancestor when multiple widgets need access:
class Parent extends StatefulWidget {
@override
State<Parent> createState() => _ParentState();
}
class _ParentState extends State<Parent> {
int _count = 0;
void _increment() => setState(() => _count++);
@override
Widget build(BuildContext context) {
return Column(
children: [
ChildA(count: _count),
ChildB(onPressed: _increment),
],
);
}
}
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
final isLargeScreen = size.width > 600;
return isLargeScreen
? Row(children: [...]) // Tablet/Desktop layout
: Column(children: [...]); // Mobile layout
}
r in terminal or save file (for quick UI updates)R in terminal (for state reset)flutter pub global activate devtools then flutter pub global run devtoolsdebugPrint() instead of print()flutter run --profile for performance metricsWhen helping with Flutter development:
useMaterial3: true) for modern UISolution: Delete flutter.lock file or restart terminal
Solution: Run flutter clean then flutter pub get
Solution: Move setState calls to lifecycle methods or use Future.microtask
Solution: Wrap content in SingleChildScrollView or use Flexible/Expanded widgets
Solution: Use hot restart (R) or restart app completely