Belajar Membangun Aplikasi Mobile Pertamamu
Kelas 10 โข Semester 1 โข Buku Digital Interaktif
Lanjutan dari BAB 1 (Mobile Dev), BAB 2 (Dasar Dart) & BAB 3 (OOP)
Kamu sudah melewati 3 bab. Sekarang semuanya bersatu menjadi aplikasi nyata.
Perhatikan balok-balok tersusun terus-menerus. Di Flutter, kamu membangun aplikasi dengan menumpuk “bata” bernama widget โ sama seperti menyusun LEGO menjadi bangunan.
Cepat (Hot Reload), tampilan cantik bawaan (Material Design), dan satu kode untuk banyak platform.
Sebelumnya kita menulis Dart di terminal. Sekarang, kode yang sama bisa menjadi aplikasi nyata!
void main() { print('Hello World');}Program yang kita buat sebelumnya:
Pada BAB ini, kita berpindah dari menulis program menjadi membangun aplikasi.
main.dart sebagai titik masukKemampuan Dart yang telah dipelajari di BAB 2 & 3 tetap digunakan. Perbedaannya: sekarang kita menggunakan Flutter untuk membangun interface dan pengalaman pengguna.
Tujuan utama: tidak hanya membuat tampilan menarik, tapi juga memahami bagaimana kode menjadi aplikasi yang benar-benar berjalan di perangkat.
belajar_flutter
aplikasi_pertama
kasir_sederhana
data_siswa
_ (underscore) untuk memisahkan kataBelajar Flutter // ada spasi!
BelajarFlutter // huruf besar!
belajar-flutter // pakai strip!
belajar flutter // spasi lagi!
Setelah project dibuat, kita akan melihat banyak folder. Jangan panik! Kita akan memahami satu per satu.
Tiap “laci” punya isi sendiri. Yang paling sering kamu buka adalah lib/main.dart.
lib/Tempat utama kamu menulis kode aplikasi. Sebagian besar waktu kamu akan dihabiskan di sini.
lib/
โโโ main.dart โญ file utama
โโโ pages/ (nanti)
โโโ widgets/ (nanti)
โโโ models/ (nanti)
โโโ services/ (nanti)
lib/main.dart!
android/Berisi file & konfigurasi untuk aplikasi Android. Flutter tetap membutuhkan konfigurasi platform saat dijalankan di Android.
ios/Seperti android/, tapi untuk kebutuhan aplikasi di perangkat Apple (iPhone/iPad).
android/ = Android | ios/ = iOS
test/Untuk menyimpan kode pengujian (testing). Memastikan program berjalan sesuai harapan.
pubspec.yamlFile penting untuk mengatur kebutuhan project:
README.mdFile informasi project: nama, deskripsi, tujuan, cara menjalankan.
Klik โถ Run atau ketik flutter run di terminal. Pada pertama kali, proses mungkin membutuhkan waktu lebih lama.
Jangan coba memahami semua folder sekaligus. Fokus ke lib/main.dart dulu!
Prinsipnya: tidak semua yang ada di project harus dipahami dalam satu hari.
Semua tamu masuk lewat satu pintu utama. Begitu juga aplikasi Flutter: selalu mulai dari fungsi main() di file main.dart.
main() = pintu utama โ runApp() = menyalakan listrik โ rumah menyala!
main.dart โ File utama, titik masuk seluruh aplikasi. Flutter selalu mencari file ini pertama kali.
main() โ Fungsi pertama yang dijalankan. Seperti pintu masuk rumah.
runApp() โ “Menyalakan” aplikasi & menampilkan widget root yang diberikan.
import โ Baris di atas mengambil paket Material milik Flutter (widget, tema, dsb).
Mari kita urutkan langkah demi langkah apa yang terjadi saat aplikasi dijalankan.
main.dartlib/main()main() memanggil runApp()runApp() menerima MyApp()import 'package:flutter/material.dart';
// โ mengambil paket Material
void main() {
// โ titik awal eksekusi
runApp(const MyApp());
// โ menjalankan aplikasi
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(
body: Center(child: Text('Halo Flutter!')),
),
);
}
}
import ...
Mengambil paket Material (widget, tema, dsb)
void main()
Fungsi pertama yang dijalankan Flutter
runApp()
Menyalakan aplikasi & menampilkan widget
MyApp()
Widget root โ seluruh aplikasi ada di dalamnya
MaterialApp()
Fondasi: tema, judul, halaman awal
Scaffold()
Kerangka layar (AppBar, Body, FAB)
Setelah memahami alur ini, kita siap mempelajari bagaimana Flutter membangun tampilan aplikasi.
Di Flutter, berlaku satu prinsip utama yang sangat terkenal: “Everything is a Widget” (Semuanya adalah Widget!).
๐ก Klik tombol “๐ Sorot Widget” di atas untuk melihat bagaimana setiap bagian layar dipecah menjadi widget-widget mandiri!
Setelah modul ini selesai, kamu bukan cuma bisa menjawab “Widget adalah komponen UI”, tapi mampu menjelaskan:
“Widget adalah objek/class di Flutter yang mendeskripsikan bagian tertentu dari tampilan aplikasi. Widget dapat disusun dengan widget lain membentuk widget tree. Ada widget yang menampilkan sesuatu dan ada widget yang mengatur posisi/struktur widget lain.”
Melangkah lebih dalam daripada sekadar analogi mainan: Widget adalah Deskripsi UI (Resep Instruksi), bukan benda mati!
Text("Assalamu'alaikum")Center di tengah layarโ “Text adalah tulisan.”
โ “Text adalah Widget yang mendeskripsikan bahwa kita ingin menampilkan sebuah teks.”
Center(
child: Text("Assalamu'alaikum"),
)
Center mendeskripsikan posisi tengah, Text mendeskripsikan teks apa yang ingin dimunculkan.
Bagian yang wajib dikuasai kuat sebelum kita masuk ke pembahasan method build().
child:Text("Halo Flutter")
Center(
child: Text("Halo Flutter"),
)
// Center = parent (induk)
// Text = child (anak)
Properti child hanya menerima 1 widget anak.
children: [ ... ]Text("Nama")Text("Abiy")Icon(school)Column(
children: [
Text("Nama"),
Text("Abiy"),
Icon(Icons.school),
],
)
// Column = parent
// children = List berisi 3 widget anak
Properti children menggunakan kurung siku [...] (List di Dart/BAB 2).
๐ฏ Tantangan Berpikir untuk Siswa & Guru!
Tanya Siswa: “Widget apa saja yang kira-kira dibutuhkan untuk membangun tampilan di atas?”
“Tampilan bukan satu benda besar yang digambar sekaligus.”
Tampilan selalu dibangun dari banyak Widget kecil yang saling melengkapi dan bekerja sama membentuk satu kesatuan.
Mengenal peran Container dan Padding sebelum kita masuk ke struktur layar yang lebih besar.
Wadah serbaguna. Isinya bisa widget lain, dan bisa diberi warna latar, border, sudut tumpul, serta ukuran.
Container(
color: Colors.blue,
child: Text("Halo"),
)
Padding tidak menampilkan tulisan atau gambar. Dia murni memberi ruang kosong di sekitar child-nya!
| Widget | Aksi / Peran | Analogi Sederhana |
|---|---|---|
Text |
Menampilkan | Tulisan di atas kertas |
Icon |
Menampilkan | Stiker simbol visual |
Container |
Membungkus | Kardus pembungkus barang |
Padding |
Memberi Jarak | Bantalan bubble wrap |
Center |
Memposisikan | Titik bidik tengah sasaran |
Column |
Menyusun Vertikal | Tumpukan buku ke bawah |
Row |
Menyusun Horizontal | Barisan tentara ke samping |
Kamu sudah belajar Dart OOP di BAB 3. Sekarang manfaatkan pengetahuan tersebut!
๐ Tanya Siswa: “Kalau Widget adalah bagian dari Flutter, sebenarnya dibuat menggunakan apa?” → Class Dart!
class MyWidget extends StatelessWidget {
// 1. class MyWidget --> Membuat Class baru
// 2. extends StatelessWidget --> Pewarisan / Inheritance (BAB 3!)
@override
Widget build(BuildContext context) {
return const Text("Halo!");
}
}
class MyWidget: Kita mendeklarasikan class baru. Sama persis seperti di BAB 3!
extends StatelessWidget: Kita mewarisi sifat-sifat dasar widget milik Flutter. Ini materi Inheritance (Pewarisan).
@override: Kita menimpa method bawaan untuk menentukan isi widget kita. Ini konsep Polymorphism dari BAB 3!
Inilah jembatan terbaik yang akan membuatmu memahami fungsi method build() secara alami.
Greetingclass Greeting extends StatelessWidget {
const Greeting({super.key});
@override
Widget build(BuildContext context) {
return const Text("Halo!");
}
}
“Apa yang sebenarnya dilakukan oleh Widget Greeting di atas?”
Bukan sekadar kode mati, perhatikan alur logikanya di kolom sebelah kanan →
Greeting adalah sebuah Widget (Class buatan kita).
Greeting memiliki method build() di dalamnya.
build() tersebut mengembalikan (return) widget Text("Halo!").
Bukan: “Sekarang kita belajar method build() karena memang ada di buku.”
Tetapi: “Ternyata Widget buatan kita harus menjelaskan kepada Flutter: 'Saya mau menampilkan apa sih?' Dan di sinilah build() berperan!”
Setiap kali Flutter mau “memasak” tampilan, ia membaca resep di dalam build(). Resep ini menentukan widget apa yang muncul.
build() adalah method yang mengembalikan widget.BuildContext = info posisi widget di pohon.@override
Widget build(BuildContext context) {
// build() mengembalikan widget yang akan digambar di layar
return const Text('Aku digambar oleh build()');
}
Tanpa pondasi, tidak ada yang bisa berdiri. MaterialApp adalah pondasi yang menyiapkan tema, judul, & navigasi untuk seluruh aplikasi.
title โ nama aplikasi (terlihat saat multitasking).theme โ warna & gaya seluruh aplikasi.home โ halaman pertama yang ditampilkan.MaterialApp(
title: 'Aplikasi Pertamaku',
theme: ThemeData(primarySwatch: Colors.deepPurple),
home: const HalamanUtama(), // halaman pembuka
);
Rangka besi menyediakan tempat untuk menaruh AppBar (atas), Body (tengah), dan FloatingActionButton (sudut). Itulah tugas Scaffold.
appBar โ bilah judul di bagian atas.body โ isi utama layar (paling besar).floatingActionButton โ tombol mengambang.Scaffold(
appBar: AppBar(title: const Text('Beranda')),
body: const Center(child: Text('Isi layar di sini')),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: const Icon(Icons.add),
),
);
Papan nama selalu terpasang di atas pintu dan memberi tahu pengunjung di mana mereka berada. AppBar melakukan hal yang sama di aplikasi.
title โ teks judul di AppBar.backgroundColor โ warna latar AppBar.actions โ daftar tombol di kanan (ikon menu, share, dll).AppBar(
title: const Text('Biodataku'),
backgroundColor: Colors.deepPurple,
actions: [
IconButton(onPressed: () {}, icon: const Icon(Icons.share)),
],
);
Ruangan kosong diisi furnitur satu per satu. Begitu juga Body: tempat kamu menaruh semua widget (teks, gambar, tombol) yang ingin ditampilkan.
body menampung satu widget utama.Column untuk menyusun widget vertikal.Row untuk menyusun widget horizontal.Center menaruh isi di tengah layar.body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.person, size: 80),
Text('Nama: Sahil'),
Text('Kelas: 10 SMA'),
],
);
Tombol bel selalu mengambang di sudut dan mudah dijangkau. FAB sama: tombol bundar untuk aksi paling penting. Klik bel untuk melihat efeknya!
onPressed โ kode yang jalan saat ditekan.child โ isi tombol, biasanya sebuah Icon.tooltip โ teks bantuan saat ditahan.floatingActionButton: FloatingActionButton(
onPressed: () {
print('Tombol ditekan!');
},
tooltip: 'Tambah',
child: const Icon(Icons.add),
);
Dua “jurus” ajaib Flutter yang membuat ngoding terasa instan.
“Ganti baju tanpa keluar kamar.”
โ State DIPERTAHANKAN“Mandi dari awal โ semua direset.”
โ State DIRESET| Aspek | Hot Reload | Hot Restart |
|---|---|---|
| Kecepatan | Sangat cepat (< 1 detik) | Lebih lambat (beberapa detik) |
| State aplikasi | Dipertahankan | Hilang / kembali awal |
| Kapan dipakai | Ubah tampilan/UI | Ubah main() / state awal |
| Shortcut umum | Tombol โก / r | Tombol ๐ / R |
Inilah urutan yang dijalankan Flutter dari awal sampai layar tampil. Klik “Putar Ulang” untuk melihat animasinya.
main() memanggil runApp() โ membangun MaterialApp โ Scaffold โ lalu menggambar AppBar, Body, & FAB menjadi Widget Tree.
Sekarang kita gabungkan SEMUA materi tadi menjadi satu aplikasi nyata.
MaterialApp โข Scaffold โข AppBar โข Body โข Column โข Text โข Icon โข CircleAvatar โข FloatingActionButton.
Bagian ini menyiapkan pondasi: titik masuk dan tema aplikasi. Baca komentar // di tiap baris.
import 'package:flutter/material.dart'; // ambil paket Flutter
void main() => runApp(const BiodataApp()); // titik masuk aplikasi
// Widget paling luar = pondasi aplikasi
class BiodataApp extends StatelessWidget {
const BiodataApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Biodata',
debugShowCheckedModeBanner: false, // sembunyikan label debug
theme: ThemeData(primarySwatch: Colors.deepPurple),
home: const HalamanBiodata(), // halaman utama
);
}
}
BiodataApp.
โข MaterialApp mengatur tema ungu & menunjuk halaman pertama.
class HalamanBiodata extends StatelessWidget {
const HalamanBiodata({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Biodata Saya'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
CircleAvatar(
radius: 50,
child: Icon(Icons.person, size: 50),
),
SizedBox(height: 16),
Text('Sahil Pratama',
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
)),
Text('Kelas 10 SMA - Mobile Dev'),
SizedBox(height: 8),
Text('Hobi: Coding, Game, Musik'),
],
),
floatingActionButton: FloatingActionButton(
onPressed: null,
child: Icon(Icons.edit),
),
);
}
}
Scaffold โ kerangka layar.AppBar โ judul "Biodata Saya".Column โ susun isi ke bawah.CircleAvatar โ foto bulat.SizedBox โ beri jarak antar widget.Text โ nama, kelas, hobi.FloatingActionButton โ tombol edit.Beginilah proses saat kamu menekan tombol Run di editor:
main() sampai tampil di layar.Layout & Stateful Widget: membuat tampilan yang lebih kompleks dan aplikasi yang bisa berubah saat disentuh pengguna.
backgroundColor AppBar menjadi merah (Colors.red).primarySwatch pada ThemeData menjadi Colors.red.appBar: AppBar(
title: const Text('Namamu'), // ganti namamu
backgroundColor: Colors.red, // jadi merah
),
Text untuk hobi kamu.Icon yang sesuai hobimu.Row agar sejajar.mainAxisAlignment: MainAxisAlignment.center.Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.sports_esports), // ikon hobi
SizedBox(width: 8),
Text('Hobi: Main Game'),
],
),
Bangun aplikasi Flutter yang menampilkan kartu nama digitalmu sendiri dengan tampilan rapi dan menarik.
Icon placeholder).Row).| Kriteria | Poin |
|---|---|
| Kode berjalan tanpa error | 40 |
| Tampilan rapi & menarik | 30 |
| Memakai minimal 5 widget berbeda | 30 |
โฐ Deadline: ____ / ____ / ______ | Kumpulkan file .dart + screenshot aplikasi.