Flutter Guide
flutter create my_app cd my_app flutter run
Flutter uses the Dart language and renders its own widgets using Skia/Impeller, bypassing platform UI components. This means consistent behavior and appearance across iOS, Android, Web, Windows, macOS, and Linux.
Widgets are the building blocks. Everything is a widget (padding, alignment, text, buttons, gestures). The composition model means complex UIs are built by nesting simple, focused widgets.
Flutter's state management ecosystem includes Provider, Riverpod, BLoC, and GetX. Hot reload provides sub-second iteration. Platform channels bridge to native Swift/Kotlin/Java code.
Setup
flutter create my_app --org com.example cd my_app flutter run # run on connected device flutter run -d chrome # run in browser flutter run -d windows # run on desktop
Widgets
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Hello')),
body: const Center(child: Text('Hello, Flutter!')),
),
);
}
}class Counter extends StatefulWidget {
@override
State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('$_count'),
ElevatedButton(
onPressed: () => setState(() => _count++),
child: const Text('Increment'),
),
],
);
}
}Layout
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Header'),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Icon(Icons.star),
Icon(Icons.favorite),
Icon(Icons.settings),
],
),
],
)ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
leading: const Icon(Icons.person),
title: Text(items[index].name),
onTap: () => _showDetail(items[index]),
);
},
)State Management
final counterProvider = StateProvider<int>((ref) => 0);
class CounterWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return ElevatedButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: Text('$count'),
);
}
}Navigation
MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => const HomeScreen(),
'/settings': (context) => const SettingsScreen(),
'/profile': (context) => const ProfileScreen(),
},
)
// Navigate:
Navigator.pushNamed(context, '/profile');
Navigator.pop(context);Platform
// Dart side:
import 'package:flutter/services.dart';
static const platform = MethodChannel('com.example/battery');
final batteryLevel = await platform.invokeMethod<int>('getBatteryLevel');
// Android (Kotlin):
channel.setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
result.success(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY))
}
}