πŸ“±
BAB 4
</>
🎯
Dart
Part 1
Mobile Development β€’ Flutter & Dart

BAB 4 β€” FUNDAMENTAL DART PART 1

Memahami Anatomi, Pustaka Dasar, dan Logika Wadah Sebelum Mendesain UI

Kelas 11  β€’  Semester 1  β€’  Modul Interaktif 31 Slide Lengkap

Ibarat belajar HTML dasar (tag skeleton) sebelum masuk ke styling CSS & interaksi di Bab 5!

πŸ—ΊοΈ Peta Konsep & Analogi

Kerangka Flutter vs Dokumen Web

Jika kamu pernah belajar Web (HTML & CSS), Flutter memiliki logika kerangka yang sangat mirip!

🌐 Di Dunia Web (HTML)

  • <link rel="stylesheet" ...> → Impor pustaka komponen.
  • <html><body> → Kerangka dasar dokumen kosong.
  • <header>, <main> → Pembagian slot layar.
  • <div> punya banyak anak & <p> membungkus teks.

πŸ’™ Di Dunia Flutter

  • import 'package:flutter/material.dart'; → Impor balok Material.
  • MaterialApp > Scaffold → Kerangka kanvas layar kosong.
  • appBar: & body: → Slot resmi penempatan widget.
  • children: [] (banyak anak) vs child: (1 anak).

πŸ“š Daftar 31 Modul Belajar BAB 4

πŸ’™ Pengenalan β€” Fondasi

Apa Itu Flutter Sebenarnya?

🧱 Analogi: Balok LEGO + Kanvas Lukis Cepat

MaterialApp
Scaffold
Body
Widget

Flutter bukan sekadar pembuat tombol. Flutter adalah mesin grafis berkecepatan tinggi buatan Google yang melukis setiap pixel di layar ponselmu hingga 60-120 frame per detik!

4 Fakta Kunci Flutter

  • Bukan Webview: Flutter tidak merender browser tersembunyi. Tampilan digambar langsung menggunakan mesin grafis native (Skia / Impeller).
  • Bahasa Dart: Logika OOP (Class, Objek, Inheritance) yang sudah kamu pelajari di Bab 2 & 3 dipakai 100% di sini!
  • Multiplatform: Satu basis kode bisa berjalan di Android, iOS, Web, dan Desktop.
  • Filosofi Widget: Apapun yang ada di layar adalah widget!
Rumus Inti Dart (Bahasa) + Flutter (Framework) = Aplikasi Visual Nyata πŸ“±
⚑ Praktik VS Code β€’ Command Palette

Cara Membuat Project Flutter di VS Code (Mulai dari Tanda >)

Langkah resmi membuat kerangka proyek aplikasi Flutter dari awal menggunakan shortcut sakti Command Palette!

πŸ”‘ 4 Langkah Emas Membuat Project Baru

  • Buka Command Palette:
    Tekan tombol keyboard Ctrl + Shift + P (atau F1). Muncul kotak bilah di atas dengan awalan tanda panah >.
  • Pilih Flutter New Project:
    Ketik >Flutter: New Project lalu tekan Enter.
  • Pilih Template Application:
    Pilih opsi Application (bukan Module atau Package) untuk membuat aplikasi ponsel lengkap.
  • Tentukan Folder & Beri Nama:
    Pilih folder penyimpanan di laptopmu, ketik nama proyek (misal aplikasi_pertamaku), lalu tekan Enter!
  • ⚠️ Aturan Wajib Nama Project (Snake Case)

    • ❌ SALAH: Aplikasi Keren (Dilarang pakai huruf BESAR & dilarang pakai SPASI!).
    • ❌ SALAH: 1_projek (Dilarang diawali angka!).
    • βœ… BENAR: aplikasi_keren atau belajar_flutter_bab4 (Gunakan huruf kecil semua dan tanda garis bawah _).
    Visual Studio Code β€” Project Wizard
    > Flutter: New Project
    Flutter: New Project Buat project aplikasi baru dengan Flutter SDK
    Flutter
    Klik langkah di bawah untuk mencoba simulasi:
    πŸ“ EXPLORER β€” APLIKASI_PERTAMAKU Project Ready
    πŸ“ aplikasi_pertamaku/
    β”œβ”€β”€ πŸ“ android/ (Konfigurasi sistem Android)
    β”œβ”€β”€ πŸ“ ios/ (Konfigurasi sistem iOS Apple)
    β”œβ”€β”€ πŸ“ lib/ ← JANTUNG KODING KITA!
    β”‚   └── πŸ“„ main.dart (Titik awal aplikasi)
    └── πŸ“„ pubspec.yaml (Daftar pustaka & aset)
    πŸŽ‰
    Project Berhasil Dibuat! Folder project siap dibuka dan mulai dikoding!
    ⚑ Tips Pintas Praktik di Kelas Jika perintah >Flutter: New Project tidak muncul di VS Code, pastikan ekstensi Flutter buatan Dart Code sudah terpasang dari menu Extensions (Ctrl + Shift + X)!
    πŸ”„ Transformasi β€” Bab 3 ke Bab 4

    Dari Teks Terminal ke Kanvas Ponsel

    Mengapa kita butuh kerangka khusus saat pindah dari terminal ke aplikasi ponsel?

    πŸ’» BAB 2 & 3 (Console Dart)

    Di terminal, output hanya berupa barisan teks berurutan ke bawah:

    void main() {
      print("Selamat datang!");
    }
    > Selamat datang!
    Tidak ada konsep koordinat, warna latar, header, atau batas layar sentuh.

    πŸ“± BAB 4 (Kanvas Layar Flutter)

    Di smartphone, layar adalah kanvas 2D berpixel jutaan:

    runApp(const MaterialApp(
      home: Scaffold(body: Center(child: Text("...")))
    ));
    Butuh kerangka (Scaffold) agar tahu di mana posisi atas (appBar), tengah (body), dan bawah!
    Pelajaran Penting Kamu tidak bisa sekadar print() di ponsel. Kamu butuh Scaffold sebagai kanvas kerja tempat meletakkan teks tersebut!
    πŸ“¦ Pustaka Utama β€” Baris Pertama

    Misteri import 'package:flutter/material.dart';

    Pernahkah kamu bertanya-tanya: "Dari mana Flutter tahu apa itu Scaffold, AppBar, dan Center?"

    Gudang Balok Material Design

    Di baris pertama file main.dart, selalu ada mantra sakti ini:

    import 'package:flutter/material.dart';
    • import = Mengambil atau meminjam kode dari luar.
    • package:flutter = Paket pustaka inti bawaan framework Flutter.
    • material.dart = Gudang yang berisi ribuan cetak biru komponen standar Google Material Design.

    ⚠️ Apa Jadinya Kalau Lupa Mengimpor Ini?

    Jika baris ini terhapus, editor VS Code akan memerah total! Kata StatelessWidget, Widget, MaterialApp, dan Scaffold akan dianggap sebagai "kata asing yang tidak dikenal" oleh Dart.

    Error: Undefined class 'StatelessWidget'.
    Try importing the library that defines 'StatelessWidget'.
    πŸš€ Titik Masuk Aplikasi

    void main() dan Proyektor runApp()

    Setiap program Dart bermula dari fungsi main(). Di Flutter, ia punya satu misi khusus!

    Fungsi Pintu Gerbang & Proyektor Layar

    void main() {
      runApp(const MyApp());
    }
    • void main(): Titik mula eksekusi yang dipanggil oleh sistem operasi Android/iOS.
    • runApp(Widget app): Fungsi bawaan Flutter yang bertindak sebagai proyektor ajaib.
    • MyApp(): Widget induk pertama yang akan direntangkan memenuhi seluruh layar smartphone.

    🎬 Simulasi Proyektor 2D

    πŸ“½οΈ
    runApp()
    MyApp
    Klik tombol untuk melihat kerja runApp()
    🧱 Filosofi Flutter

    "Everything is a Widget!"

    Satu kalimat yang akan selalu kamu dengar di dunia Flutter: Semuanya adalah Widget!

    πŸ”€

    Widget Konten

    Menampilkan informasi di layar.

    Text("Halo")
    Icon(Icons.star)
    πŸ“

    Widget Posisi & Tata Letak

    Mengatur letak dan jarak.

    Center(...)
    Padding(...)
    πŸ—οΈ

    Widget Struktur Layar

    Membentuk kerangka kanvas.

    MaterialApp(...)
    Scaffold(...)
    Kesimpulan Bahkan tombol spasi kosong dan tata letak tengah di Flutter bukan kode CSS terpisah, melainkan sebuah Widget objek Dart!
    🌳 Hierarki Tampilan

    Pohon Widget (Widget Tree)

    Aplikasi Flutter tersusun rapi seperti pohon silsilah keluarga: ada Kakek → Ayah → Anak → Cucu.

    🌳 Struktur Pohon Kanvas Bersih

    MaterialApp (Akar / Root)
    Scaffold (Kanvas Layar)
    Center (Pengatur Posisi Tengah)
    Text("Hello World") (Daun / Konten)

    Istilah Penting Pohon Widget

    • Root (Akar): Widget paling atas yang membungkus segalanya (biasanya MaterialApp).
    • Parent (Induk): Widget yang memiliki wadah untuk menampung widget lain. Contoh: Scaffold adalah parent bagi Center.
    • Child (Anak): Widget yang berada di dalam widget lain. Contoh: Text adalah anak dari Center.
    • Leaf (Daun): Widget di ujung ranting yang tidak punya anak lagi (seperti Teks atau Ikon).
    🎭 Dua Spesies Kerangka Widget

    StatelessWidget vs StatefulWidget

    Semua komponen tampilan di Flutter terbagi menjadi dua spesies besar. Di Bab 4 ini, kita fokus menuntaskan StatelessWidget!

    ❄️ Spesies 1: Statis / Beku

    StatelessWidget (Fokus Utama Bab 4)

    Analogi Nyata: Kartu Pelajar Plastik / Sertifikat yang Sudah Dicetak

    ID CARD
    πŸ‘¨β€πŸŽ“
    NAMA: Budi Sanjaya
    KELAS: XI RPL 1
    STATUS: Siswa Aktif

    🧠 Apakah Punya State (Memori)?

    TIDAK ADA! Begitu digambar oleh method build(), tampilannya terkunci mati (immutable).

    ⚑ Superpower & Performa

    Super Ringan & Instan (0 ms)! Sangat hemat baterai dan RAM ponsel karena tidak perlu memantau perubahan data.

    🎯 Kapan Wajib Digunakan?

    Gunakan untuk elemen yang datanya tetap: Judul bab, logo sekolah, kartu profil statis, tombol statis, teks panduan.

    🧭 Rumus Emas Pengambilan Keputusan

    Sebelum membuat Widget baru di Flutter, selalu tanyakan 1 pertanyaan sakti ini ke dirimu sendiri:

    ❓
    "Apakah data di layar ini akan BERUBAH saat pengguna berinteraksi?"
    ❌ TIDAK → Pakai StatelessWidget (Cepat, Ringan, 100% Aman)
    βœ… YA → Pakai StatefulWidget (Butuh Otak Memori State)
    πŸ’‘ Kenapa Bab 4 fokus StatelessWidget dulu? Karena sebelum belajar cara mengemudi mobil dinamis (Bab 5), kita harus paham dulu cara merakit bodi & rangkanya (Scaffold, AppBar, Body, Text)!

    ⚑ Kuis Kilat: Tebak Spesies Widget!

    Soal 1 dari 3

    1. Teks judul header "Profil Siswa" di bagian paling atas aplikasi:

    Pilih salah satu tombol di atas untuk menguji insting analisismu!
    🧬 Bedah Kode Dasar

    Struktur Class StatelessWidget

    Mari kita bedah anatomi kode class yang selalu kamu lihat di Flutter:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          home: Scaffold(),
        );
      }
    }

    1. class ... extends

    Ingat Bab 3 OOP! Kita membuat cetak biru baru bernama MyApp yang mewarisi sifat bawaan Flutter: StatelessWidget.

    2. const MyApp({super.key})

    Constructor widget. Parameter key adalah tanda pengenal unik yang dipakai Flutter untuk melacak posisi widget di pohon.

    3. Widget build(...)

    Jantung utama yang bertugas mengembalikan susunan visual yang ingin digambar ke layar ponsel.

    🍳 Jantung Widget

    Method build(BuildContext context)

    Method ini adalah tempat kamu menentukan: "Bentuk apa yang ingin kamu gambar?"

    πŸ“– Analogi: Resep Masakan Koki

    πŸ‘¨β€πŸ³ → πŸ“œ → 🍲

    Flutter adalah kokinya, dan method build() adalah buku resepnya. Setiap kali layar perlu digambar ulang, Flutter akan membaca isi resep di dalam build().

    Penjelasan Teknis Dua Kata Kunci

    • @override:
      Tanda bahwa kita mengganti/menimpa method build() standar milik StatelessWidget dengan racikan buatan kita sendiri.
    • BuildContext context:
      Ibarat "Alamat GPS" atau KTP bagi widget di dalam pohon. Memberitahu widget: "Di mana letak posisiku di pohon tampilan? Siapa indukku? Dan tema warna apa yang sedang aktif?"
    πŸ—οΈ Cetak Biru Induk

    MaterialApp β€” Fondasi Utama Seluruh Aplikasi

    Mengapa kita tidak bisa langsung mengetik Scaffold? Mengapa wajib dibungkus MaterialApp?

    Peran MaterialApp

    • Pengatur Bahasa & Arah Baca: Menyiapkan arah baca kiri-ke-kanan (LTR).
    • Sistem Navigasi: Memungkinkan perpindahan antar halaman layar.
    • Palet Tema: Mengatur warna dasar dan font default seluruh aplikasi.
    πŸ“± Aplikasi Rapi
    Teks Tampil Cantik Bersih ✨
    Tanpa MaterialApp, Flutter tidak tahu cara memformat teks!
    βš™οΈ Konfigurasi Dasar

    3 Parameter Penting di MaterialApp

    Berikut 3 parameter yang paling sering kamu sentuh pada tahap awal:

    return MaterialApp(
      title: 'Kantin Sekolah',             // 1. Nama aplikasi di recent apps
      debugShowCheckedModeBanner: false,   // 2. Hilangkan pita merah "DEBUG"
      home: const Scaffold(),              // 3. Halaman pembuka pertama
    );

    title:

    Nama aplikasi yang muncul saat pengguna menekan tombol multitasking (Recent Apps) di ponsel.

    debugShowCheckedModeBanner:

    Set ke false jika ingin menghilangkan pita merah bertuliskan "DEBUG" di pojok kanan atas layar.

    home:

    Halaman pertama yang langsung muncul saat aplikasi dibuka. Di sinilah kita pasang Scaffold()!

    πŸ“ Kanvas Kosong

    Apa Itu Scaffold? (Lembar Kanvas Berslot)

    πŸ—οΈ Analogi: Perancah / Kanvas Arsitektur

    appBar body FAB

    Dalam bahasa Inggris, Scaffold artinya perancah bangunan. Di Flutter, Scaffold adalah lembaran kanvas putih standar yang sudah menyiapkan lubang-lubang slot untuk meletakkan komponen layar.

    Mengapa Scaffold Begitu Penting?

    • Latar Belakang Putih Bersih: Memberikan warna latar kanvas yang nyaman secara otomatis.
    • Mencegah Tabrakan UI: Menjaga agar konten tidak menabrak bar status baterai atau notch kamera atas.
    • Menyediakan "Slot": Kamu tidak perlu menghitung koordinat pixel. Cukup masukkan widget ke slot appBar atau body!
    🎨 2D Interactive Studio

    Anatomi Lengkap Slot-Slot Scaffold

    Klik tombol slot di sebelah kiri untuk melihat letak posisinya di layar ponsel virtual!

    appBar: (Header)
    body: (Lapangan Utama)
    βž•
    🏠 HomeπŸ” CariπŸ‘€ Profil
    πŸ“‚ Menu Drawer

    β€’ Beranda
    β€’ Pengaturan
    β€’ Keluar
    Posisi: Atas Layar

    Bilah Judul Header (appBar)

    Slot di bagian paling atas ponsel untuk menampilkan judul halaman, profil, atau ikon aksi.

    Contoh Kode:

    Scaffold(
      appBar: AppBar(
        title: const Text("Beranda"),
      ),
    )
    πŸ” Slot Scaffold 1

    Slot appBar: (Bilah Judul Header Atas)

    Slot ini selalu berada di bagian paling atas layar ponsel.

    Scaffold(
      appBar: AppBar(
        title: const Text('Profil Siswa'),
        backgroundColor: Colors.indigo,
        centerTitle: true,
      ),
    )
    • title: → Menampung widget teks untuk judul bilah atas.
    • backgroundColor: → Memberikan warna dasar bilah judul.
    • centerTitle: true → Memaksa judul teks berada persis di tengah.

    πŸ“± Tampilan di Layar Ponsel

    Profil Siswa
    Area body (masih kosong)
    πŸ›‹οΈ Slot Scaffold 2 (Paling Utama)

    Slot body: (Lapangan Kerja Utama Kita)

    Jika appBar adalah topinya, maka body adalah seluruh tubuh aplikasi!

    Aturan Emas Slot body:

    • 95% Waktu Codingmu Ada di Sini: Semua materi widget di bab-bab berikutnya akan kita letakkan di dalam slot body: ini.
    • Default Posisi (Pojok Kiri Atas): Secara default, widget di dalam body akan menempel di koordinat (0,0) pojok kiri atas.
    • Hanya Menerima 1 Widget Utama: Slot body: hanya bisa menerima 1 buah widget induk (seperti Center, Column, atau Row).

    πŸ“Œ Kerangka Minimal body:

    Scaffold(
      body: Center(
        // πŸ‘‰ DI SINI KITA AKAN EKSPERIMEN WIDGET!
        child: Text("Halo Dunia!"),
      ),
    )

    Dengan membungkus teks menggunakan Center, teks otomatis ditarik ke tengah kanvas layar!

    πŸ”” Slot Scaffold 3, 4, 5

    Slot Pendukung: FAB, Drawer, & BottomNav

    Cukup kenali dulu posisi dan namanya, kamu tidak perlu langsung menghafal kodenya sekarang!

    πŸ”˜

    floatingActionButton:

    Tombol aksi bulat melayang di pojok kanan bawah.

    Biasa dipakai untuk tombol "Tambah Data" atau "Kirim Pesan".
    πŸ“‚

    drawer:

    Laci navigasi samping yang bisa digeser masuk dari kiri.

    Tempat menyimpan menu-menu aplikasi tambahan.
    πŸ“‘

    bottomNavigationBar:

    Bilah navigasi tab di bagian paling bawah layar.

    Seperti baris menu di Instagram, YouTube, atau TikTok.
    ❓ Logika Wadah Widget

    Misteri Terpecahkan: Kapan Pakai child: vs children:?

    Inilah kebingungan nomor 1 siswa pemula saat belajar Flutter. Mari kita selesaikan hari ini!

    πŸ‘Ά

    Wadah Anak Tunggal (child:)

    Kata benda tunggal (1 anak saja). Wadah ini HANYA BISA menampung SATU widget di dalamnya!

    child: Text("Hanya 1 anak!")
    Contoh: Center, Container, Padding, SizedBox.
    πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦

    Wadah Banyak Anak (children:)

    Kata benda jamak (banyak anak). Wadah ini menggunakan kurung siku [ ... ] (tipe List di Dart) untuk menampung BANYAK widget!

    children: [ Text("Anak 1"), Text("Anak 2") ]
    Contoh: Column, Row, Stack, ListView.
    Aturan Emas Siswa Jika wadah itu berakhiran child:, jangan pernah pasang tanda kurung siku [ ]. Sebaliknya jika berakhiran children:, wajib gunakan tanda [ ]!
    πŸƒ Kelompok 1: Konten Murni

    Leaf Widgets (Widget Daun β€” Tanpa Anak)

    Widget ini berada di ujung ranting pohon tampilan. Tugasnya murni menyajikan isi informasi.

    Text(...)

    Menampilkan tulisan teks di layar.

    Text('Halo Flutter!')
    Tidak punya properti child/children!

    Icon(...)

    Menampilkan simbol atau logo grafis.

    Icon(Icons.home)
    Ratusan ikon bawaan Material Icons siap pakai.

    Image.network(...)

    Menampilkan foto atau gambar.

    Image.network('url...')
    Mengambil gambar langsung dari internet atau aset lokal.
    πŸ“¦ Kelompok 2: Wadah 1 Anak

    Single-Child Widgets (Menggunakan child:)

    Widget yang bertindak sebagai pembungkus untuk mengatur posisi atau ukuran satu anak.

    1. Center(child: ...)

    Menarik anak tunggalnya tepat ke titik tengah kanvas layar.

    Center(
      child: Text("Persis di Tengah!"),
    )

    2. Container(child: ...)

    Kotak serbaguna pembungkus 1 anak (mirip tag <div> di HTML).

    Container(
      child: Text("Di dalam kotak"),
    )

    3. Padding(child: ...)

    Memberikan jarak ruang bantalan keliling untuk anaknya.

    Padding(
      padding: EdgeInsets.all(16.0),
      child: Text("Diberi jarak"),
    )

    4. SizedBox(child: ...)

    Kotak dengan lebar dan tinggi pasti untuk membatasi ukuran anak.

    SizedBox(
      width: 200, height: 100,
      child: Text("Kotak berukuran"),
    )
    πŸ“š Kelompok 3: Wadah Banyak Anak

    Multi-Child Widgets (Menggunakan children: [])

    Jika kamu ingin menyusun lebih dari 1 widget, gunakan wadah berarah ini:

    ⬇️

    Column(children: [])

    Menata banyak anak berbaris dari atas ke bawah (vertikal).

    Column(
      children: [
        Text("Baris 1"),
        Text("Baris 2"),
      ],
    )
    ➑️

    Row(children: [])

    Menata banyak anak berbaris dari kiri ke kanan (horizontal).

    Row(
      children: [
        Icon(Icons.star),
        Text("Bintang"),
      ],
    )
    πŸ₯ž

    Stack(children: [])

    Menumpuk banyak anak lapis demi lapis ke depan (seperti pancake / z-index).

    Stack(
      children: [
        Image.asset('bg.png'),
        Text("Teks di atas foto"),
      ],
    )
    πŸ§ͺ Laboratorium 2D Interaktif

    Eksperimen: Uji Wadah 1 Anak vs Banyak Anak

    Pilih wadah, lalu coba klik "Tambah Anak" untuk membuktikan aturan wadah Flutter!

    🎯 Text("Anak 1: Aku di Tengah!")
    1 Widget Anak

    πŸ“œ Kode yang Dihasilkan:

    Center(
      // βœ… child HANYA BISA 1 ANAK!
      child: Text("Anak 1: Aku di Tengah!"),
    )
    πŸ’‘ Perhatikan: Jika kamu memasukkan lebih dari 1 anak ke dalam Center, Flutter akan menampilkan pesan compile error!
    🧹 Misi Praktik 1

    Langkah 1: Buka main.dart & Bersihkan

    Sebelum kita mulai membuat aplikasi, kita harus membersihkan kode bawaan yang membingungkan!

    πŸ“‹ Mengapa Harus Dikosongkan?

    Saat pertama kali membuat project (flutter create nama_project), Flutter menyediakan file contoh bernama Counter App (aplikasi hitung angka).

    • File ini panjangnya lebih dari 100 baris.
    • Penuh dengan komentar bahasa Inggris yang panjang.
    • Sudah menggunakan StatefulWidget yang rumit bagi pemula.

    πŸ› οΈ 2 Langkah Pembersihan di VS Code:

    1. Buka file lib/main.dart di editor VS Code kamu.
    2. Tekan kombinasi tombol: Ctrl + A (pilih semua), lalu tekan Delete.

    βœ” Jangan takut, menghapus kode bawaan adalah langkah resmi seluruh programmer Flutter untuk menyiapkan kanvas kerja yang bersih!

    πŸ“‹ Misi Praktik 2

    Langkah 2: Pasang Template "Kanvas Bersih" (20 Baris)

    Salin kode starter boilerplate minimalis di bawah ini dan tempelkan ke dalam lib/main.dart kamu:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: Center(
              // πŸ‘‰ DI SINI KITA AKAN EKSPERIMEN WIDGET!
              child: Text("Halo Flutter!"),
            ),
          ),
        );
      }
    }

    πŸ“Œ Batas Suci Pembelajaran

    Perhatikan baris dengan komentar:
    // πŸ‘‰ DI SINI KITA AKAN EKSPERIMEN WIDGET!

    Mulai dari sekarang dan di bab-bab berikutnya, kita HANYA akan mengganti kode di dalam body: ini saja! Seluruh struktur kerangka luar biarkan tetap utuh seperti ini.

    Halo Flutter!
    Hasil di HP: Layar putih bersih dengan teks "Halo Flutter!" persis di tengah layar.
    ⚑ Misi Praktik 3

    Langkah 3: Menjalankan Aplikasi & Kekuatan Hot Reload

    Tekan tombol F5 di VS Code untuk menjalankan aplikasi ke emulator atau HP kamu!

    ⚑ Hot Reload (Tekan 'r' di Terminal)

    πŸ§‘β€πŸ’»

    “Mengganti baju tanpa perlu keluar rumah.”

    Super Cepat (< 1 Detik)

    Dipakai saat kamu mengubah teks, mengganti warna, atau merapikan posisi widget.

    πŸ”„ Hot Restart (Tekan 'R' di Terminal)

    🚿

    “Mandi dari awal β€” semua diulang dari nol.”

    Mereset Ulang Aplikasi

    Dipakai jika kamu mengubah fungsi main() atau struktur class dasar.

    🧠 Rangkuman Lengkap

    Silsilah Kerangka Flutter β€” Klik Kartu untuk Membalik

    Klik kartu flashcard di bawah untuk menguji ingatanmu terhadap konsep-konsep kunci Bab 4:

    πŸ•΅οΈ Evaluasi Interaktif 1

    Kuis Detektif Slot Scaffold

    Uji pemahamanmu tentang letak slot di lembar kanvas Scaffold:

    Kasus 1 dari 2

    Kamu ingin menaruh judul aplikasi "Kantin Digital" di bagian paling atas layar ponsel. Slot mana di Scaffold yang harus kamu gunakan?


    Kasus 2 dari 2

    Kamu ingin meletakkan formulir pemesanan makanan dan daftar menu yang memakan sebagian besar area layar. Slot mana tempatnya?

    βš–οΈ Evaluasi Interaktif 2

    Kuis: Tentukan child: atau children:?

    Pilih properti wadah yang tepat berdasarkan kebutuhan tampilan:

    Pertanyaan 1 dari 2

    Widget Center bertugas menarik 1 widget agar berada persis di tengah layar. Properti apa yang dimiliki Center?


    Pertanyaan 2 dari 2

    Widget Column ingin menyusun 4 buah tombol dan teks dari atas ke bawah. Properti apa yang digunakan?

    πŸ† Pencapaian BAB 4

    Selamat! Kanvas Kosongmu Sudah Siap!

    Kamu telah menguasai fondasi kerangka Flutter tanpa ada satu pun konsep yang terlewat.

    βœ… Yang Sudah Kamu Kuasai di BAB 4:

    • Memahami fungsi baris package:flutter/material.dart.
    • Memahami alur void main() dan proyektor runApp().
    • Membedakan kerangka statis StatelessWidget vs StatefulWidget.
    • Menguasai anatomi kanvas MaterialApp & slot-slot Scaffold.
    • Membedakan wadah 1 anak (child:) vs banyak anak (children:).
    • Menyiapkan template "Kanvas Bersih" di VS Code untuk eksperimen.

    πŸš€ Gerbang Menuju BAB 5 (Bab Berikutnya):

    Di BAB 5 nanti, kita akan mulai belajar "CSS & Komponen Interaktif di Flutter":

    • 🎨 Mewarnai teks, mengatur ukuran font & menebalkan huruf (TextStyle).
    • πŸ“¦ Memberi border, warna latar & bayangan kotak (BoxDecoration).
    • πŸ”˜ Membuat aneka tombol: ElevatedButton, OutlinedButton, IconButton.
    • πŸ–±οΈ Menghubungkan aksi klik tombol dengan fungsi (onPressed: () {}).
    ← β†’ untuk navigasi antar slide