Flutter Desktop memungkinkan kamu membangun aplikasi Windows, macOS, dan Linux dari kode yang sama dengan mobile dan web. Sekarang sudah stable sejak Flutter 3.0 — artinya siap produksi.
Mengaktifkan Desktop Support
Pastikan Flutter SDK versi terbaru:
flutter upgrade
flutter config --enable-windows-desktop
flutter config --enable-macos-desktop
flutter config --enable-linux-desktop
Cek device yang tersedia:
flutter devices
Kamu akan melihat windows, macos, atau linux di daftar device.
Struktur Project Desktop
Buat project baru atau tambahkan ke project existing:
flutter create my_desktop_app
cd my_desktop_app
Folder platform desktop otomatis dibuat:
windows/— CMake, runner, manifestmacos/— Xcode project, entitlementslinux/— CMake, GTK, .desktop file
Contoh 1: Window Size & Title Kustom
Di main.dart, atur ukuran jendela dan title sebelum runApp:
import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Konfigurasi window manager
await windowManager.ensureInitialized();
WindowOptions windowOptions = const WindowOptions(
size: Size(1024, 768),
minimumSize: Size(800, 600),
center: true,
backgroundColor: Colors.transparent,
titleBarStyle: TitleBarStyle.hidden, // custom title bar
);
windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
await windowManager.focus();
});
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Desktop App',
theme: ThemeData(
useMaterial3: true,
colorSchemeSeed: Colors.indigo,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Desktop'),
centerTitle: true,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.computer, size: 80, color: Colors.indigo),
const SizedBox(height: 16),
const Text(
'Hello Flutter Desktop!',
style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600),
),
const SizedBox(height: 8),
Text(
'Running on ${Platform.operatingSystem}',
style: TextStyle(fontSize: 16, color: Colors.grey[600]),
),
],
),
),
);
}
}
Dependency window_manager (di pubspec.yaml):
dependencies:
window_manager: ^0.3.8
Package ini memberikan kontrol penuh: resize, minimize, maximize, fullscreen, custom title bar, dll.
Contoh 2: Menu Bar Native (macOS/Windows)
Gunakan bitsdojo_window untuk menu bar custom yang terasa native:
// lib/main.dart
import 'package:bitsdojo_window/bitsdojo_window.dart';
void main() {
runApp(const MyApp());
// Setup window buttons (close, minimize, maximize)
doWhenWindowReady(() {
final win = appWindow;
win.minSize = const Size(800, 600);
win.size = const Size(1024, 768);
win.alignment = Alignment.center;
win.title = "My Flutter Desktop App";
win.show();
});
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.blue),
home: const DesktopShell(),
);
}
}
class DesktopShell extends StatelessWidget {
const DesktopShell({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
// Custom title bar dengan window buttons
appBar: PreferredSize(
preferredSize: const Size.fromHeight(kToolbarHeight),
child: WindowTitleBarBox(
child: Row(
children: [
Expanded(
child: MoveWindow(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
color: Theme.of(context).colorScheme.surface,
child: const Text('My App', style: TextStyle(fontWeight: FontWeight.w600)),
),
),
),
const WindowButtons(),
],
),
),
),
body: const Center(child: Text('Content goes here')),
);
}
}
Dependency:
dependencies:
bitsdojo_window: ^0.1.5
Build & Distribusi
Windows (MSIX / EXE)
flutter build windows --release
# Output: build/windows/x64/runner/Release/
Buat installer dengan MSIX (Windows Store) atau Inno Setup / NSIS untuk EXE tradisional.
macOS (App Bundle / DMG)
flutter build macos --release
# Output: build/macos/Build/Products/Release/
Codesign & notarize untuk distribusi di luar App Store:
codesign --deep --force --verify --verbose --sign "Developer ID Application: Your Name" build/macos/Build/Products/Release/your_app.app
# Lalu buat DMG dengan create-dmg atau appdmg
Linux (AppImage / Snap / Flatpak / DEB)
flutter build linux --release
# Output: build/linux/x64/release/bundle/
Gunakan AppImage untuk portable, atau Snapcraft / Flatpak untuk store.
Tips Khusus Desktop
| Fitur | Solusi |
|---|---|
| Keyboard shortcuts | Shortcuts + Actions widget atau FocusableActionDetector |
| Context menu (right-click) | PopupMenuButton atau flutter_context_menu |
| Drag & drop files | desktop_drop package |
| System tray | system_tray / window_manager |
| Native dialogs | file_picker, path_provider |
| Auto-update | upgrader (GitHub Releases) atau custom |
Perbedaan Mobile vs Desktop
| Aspek | Mobile | Desktop |
|---|---|---|
| Input | Touch | Mouse, keyboard, trackpad |
| Window | Fullscreen | Resizable, multi-window |
| Menu | Drawer/BottomNav | Menu bar, context menu |
| Density | High DPI | Variable DPI |
| Distribution | App Store/Play Store | Website, Store, Package manager |
Kesimpulan
Flutter Desktop sudah production-ready. Kode UI sama, tinggal handle:
- Window management (
window_manager,bitsdojo_window) - Native menu & shortcuts
- Build & signing per platform
- Distribusi (MSIX, DMG, AppImage, Snap)
Mulai migrasi app mobile ke desktop hari ini — codebase 90% reusable!
Coba sendiri! Share ke sosial media dan tag @ahsai001