Di pelajaran sebelumnya, kita sudah membuat proyek Flutter pertama kita. Proyek ini sangat sederhana, hanya ada satu tombol yang akan menaikkan angka setiap kali diklik. Berikut adalah struktur direktori dari proyek ini.
Struktur Direktori Proyek

Kamu akan melihat banyak folder dan berkas seperti android, web, windows, lib, test dan lainnya. Lalu di mana kita menulis kode sumber? Apakah di folder android? Atau windows? Sebenarnya tidak, kode sumber ada di folder lib. Buka folder lib, kamu akan menemukan berkas main.dart.

Folder lib nantinya akan menjadi tempat menyimpan semua kode sumbermu. Kamu akan menulis kode dengan bahasa Dart, bukan Java ataupun C++. Flutter menggunakan bahasa Dart. Lalu kenapa ada folder android, web, windows dan lainnya di root proyek?
Sangat mudah dipahami, Flutter bisa dikompilasi menjadi aplikasi lintas platform karena adanya folder-folder ini.
Flutter adalah kerangka kerja dengan prinsip Satu kode Dart, bisa berjalan di banyak platform. Folder lib berisi kode bisnis umum lintas platform yang kamu tulis; sedangkan folder android / windows / web / macos / linux adalah proyek induk native tiap platform, fungsinya untuk menanamkan mesin render Flutter agar bisa berjalan di sistem operasi terkait.
1. Folder android
Ini adalah proyek native platform Android
Folder ini menyediakan wadah untuk menjalankan aplikasi Android dan menampung mesin render Flutter. Semua konfigurasi tingkat bawah yang berkaitan dengan Android diatur di sini, contohnya izin aplikasi, ikon, nama paket dan lainnya. Artinya kamu bisa mengatur hal-hal khusus Android di sini serta memanggil API native sistem (kamera, bluetooth, notifikasi, lokasi dan lain-lain).
2. Folder windows
Ini adalah proyek native untuk desktop Windows
Merupakan proyek native C++ Win32 yang berfungsi membuat jendela sistem Windows dan menginisialisasi mesin render Skia. Skia adalah pustaka grafis milik Google, Flutter menggunakan pustaka ini untuk merender jendela dan semua kontrol aplikasi desktop.
Isi folder windows berisi semua konfigurasi tingkat bawah perangkat lunak desktop Windows, seperti ukuran jendela, bilah judul jendela, ikon, baki sistem (ikon di sudut kanan bawah Windows).
Nantinya kamu bisa membungkus proyek menjadi format exe, msix dan menerbitkannya di Microsoft Store.
3. Folder web
Proyek halaman web statis (HTML/JS/CSS) yang menyediakan titik masuk web index.html. Kode Dartmu nantinya akan dikompilasi menjadi sumber daya web.
Kamu bisa mengatur judul halaman, ikon, sumber daya statis dan rute. Saat dikompilasi akan menghasilkan berkas HTML/CSS/JS yang siap diunggah ke server dan dibuka di browser.
Folder Lainnya
Kita tidak menggunakan iOS, macOS dan Linux di contoh ini karena saat membuat proyek tidak mencentang opsi tersebut, sehingga folder-folder itu tidak ada. Namun prinsip kerjanya sama saja.
ios: Proyek Xcode native Apple iOS, untuk membungkus berkas ipa dan rilis ke iPhone
macos: Proyek Cocoa native desktop macOS, klien untuk komputer Mac
linux: Proyek desktop Linux berbasis GTK
Di sudut kanan atas Android Studio kamu bisa memilih platform berbeda untuk mengompilasi versi aplikasi yang berbeda. Kamu juga bisa langsung menggunakan perintah terminal, sebenarnya saat kamu memilih platform dan klik segitiga hijau di Android Studio, sistem akan menjalankan perintah Flutter di belakang layar.
# Jalankan versi Android, baca konfigurasi dari folder android
flutter run -d android
# Jalankan desktop Windows, baca proyek C++ dari folder windows
flutter run -d windows
# Jalankan versi web, baca html dari folder web
flutter run -d chromeCode language: PHP (php)

Buka berkas runner / main.cpp di dalam folder windows
#include <flutter/dart_project.h>
#include <flutter/flutter_view_controller.h>
#include <windows.h>
#include "flutter_window.h"
#include "utils.h"
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
_In_ wchar_t *command_line, _In_ int show_command) {
// Attach to console when present (e.g., 'flutter run') or create a
// new console when running with a debugger.
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
CreateAndAttachConsole();
}
// Initialize COM, so that it is available for use in the library and/or
// plugins.
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
flutter::DartProject project(L"data");
std::vector<std::string> command_line_arguments =
GetCommandLineArguments();
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
FlutterWindow window(project);
Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720);
if (!window.Create(L"myproject", origin, size)) {
return EXIT_FAILURE;
}
window.SetQuitOnClose(true);
::MSG msg;
while (::GetMessage(&msg, nullptr, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
::CoUninitialize();
return EXIT_SUCCESS;
}
Code language: PHP (php)
Jika kamu mengompilasi untuk Windows Desktop, main.cpp ini adalah titik masuk utama program. Berkas C++ ini akan dieksekusi terlebih dahulu, baru kemudian masuk ke lib/main.dart milikmu.
Sama halnya, jika kamu buka folder android, kamu akan melihat struktur yang hampir mirip dengan proyek Android yang dikembangkan pakai Kotlin atau Java.

Terdapat juga folder src, berkas AndroidManifest.xml, MainActivity dan elemen lain yang sudah kamu kenal jika pernah membuat aplikasi Android. Sebenarnya, saat membuat aplikasi Android pakai Flutter, eksekusi dimulai dari folder android ini.
Begitu juga, buka folder web dan kamu akan menemukan titik masuk web yaitu index.html

Berkas Dart
Berkas main.dart di dalam folder lib akan menjadi tempat kamu melakukan sebagian besar pengembangan. Kamu bisa membuat subfolder dan menambahkan berkas Dart lain di dalam lib.
Buka main.dart
// Impor pustaka komponen Material
import 'package:flutter/material.dart';
// Fungsi titik masuk program
void main() {
runApp(const MyApp());
}
// Komponen akar aplikasi (tanpa state)
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
// Pengaturan tema global
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
// Halaman utama
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
// Halaman utama (komponen dengan state)
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
// Parameter judul halaman
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
// Kelola state halaman utama
class _MyHomePageState extends State<MyHomePage> {
// Variabel penghitung
int _counter = 0;
// Fungsi menaikkan penghitung
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
// Kerangka dasar tata letak halaman
return Scaffold(
// Bilah navigasi atas
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
// Isi utama halaman
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('You have pushed the button this many times:'),
Text(
'$_counter', // Tampilkan variabel angka di atas
style: Theme.of(context).textTheme.headlineMedium, // Gaya teks
),
],
),
),
// Tombol melayang kanan bawah: onPressed jalankan _incrementCounter, tooltip teks bantuan, child atur ikon
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}Code language: JavaScript (javascript)
1. Bagian Titik Masuk
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
Code language: JavaScript (javascript)
- Mengimpor Material, pustaka UI resmi Google berisi tombol, halaman, teks dan lainnya. Apple juga punya kerangka UI milik sendiri.
mainadalah satu-satunya titik masuk program Dart;runApp()menjalankan aplikasi dan memasang komponen akarMyApp
2. MyApp Komponen Akar Global
Ini adalah StatelessWidget (komponen tanpa status), kita akan bahas nanti, cukup ketahui saja untuk sekarang.
class MyApp extends StatelessWidget {
const MyApp({super.key});
// Komponen akar aplikasi kamu
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
Code language: JavaScript (javascript)
- Pengaturan global: Nama aplikasi, tema keseluruhan, halaman awal
MaterialApp: Wadah aplikasi gaya Material, mengelola rute, tema, judul secara terpusathomemenentukan halaman yang terbuka saat aplikasi pertama kali dibuka yaituMyHomePage
3. MyHomePage Halaman Utama
Halaman yang muncul secara default saat membuka jendela atau aplikasi, ini adalah StatefulWidget (komponen dengan status), akan dijelaskan rinci nanti.
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}Code language: JavaScript (javascript)
- Memiliki data yang berubah (angka penghitung), sehingga pakai komponen dengan status
- Menerima parameter
titledari luar, dibaca di kelas state melaluiwidget.title - Harus disertai kelas
_MyHomePageStateyang berfungsi menyimpan variabel halaman dan logika interaksi
4. _MyHomePageState
Kelas logika status, bertugas menangani logika halaman, tampilan dan pembaruan antarmuka
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('You have pushed the button this many times:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}Code language: JavaScript (javascript)
int _counter = 0: Data variabel halaman yaitu nilai penghitung_incrementCounter(): Peristiwa klik tombolsetState()memberitahu Flutter bahwa data berubah, perlu menyegarkan ulang UI halaman- Nilai penghitung bertambah satu
build(): Dijalankan setiap kali ada pembaruan, mengembalikan seluruh tata letak halaman
5. Scaffold Kerangka Halaman
Cetak tata letak halaman, berada di dalam kelas _MyHomePageState
appBar: Bilah judul bagian atasbody: Isi utama halamanCenterrata tengah elemen,Columnsusun teks secara vertikal
floatingActionButton: Tombol bulat tanda tambah di kanan bawah, terhubung dengan fungsi tambah saat diklik
Alur Jalannya Program Secara Keseluruhan
- Program dimulai → jalankan
main→ muatMyApp MyApprenderMaterialApp→ muat halaman awalMyHomePage- Halaman menampilkan bilah judul, teks tengah dan tombol tambah
- Klik tombol → jalankan
_incrementCounter+setStategambarkan ulang halaman → angka berubah
Memahami Proyek Flutter Pertama Kita