We use cookies to understand how the site is used and to display ads. Analytics and advertising only run after you accept. You can change your choice anytime. Privacy policy

Skip to content
devvkit
$devvkit learn --librarie flutter-guide

Flutter Guide

[flutter][dart][mobile][ui]
Cross-platform
Install
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

Create project· New Flutter app.
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

Basic widget· Stateless widget.
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!')),
      ),
    );
  }
}
Stateful widget· Mutable state.
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

Flex layout· Row and Column.
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
    const Text('Header'),
    Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        Icon(Icons.star),
        Icon(Icons.favorite),
        Icon(Icons.settings),
      ],
    ),
  ],
)
List view· Scrollable list.
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

Riverpod: provider· 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

Navigation· Named routes.
MaterialApp(
  initialRoute: '/',
  routes: {
    '/': (context) => const HomeScreen(),
    '/settings': (context) => const SettingsScreen(),
    '/profile': (context) => const ProfileScreen(),
  },
)

// Navigate:
Navigator.pushNamed(context, '/profile');
Navigator.pop(context);

Platform

Platform channel· Call native code.
// 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))
  }
}