Flutter
Widget
Dasar
BAB 5
UIBUILDING BLOCK
FLUTTER WIDGET
Bab 5 — Membangun Antarmuka Pertamamu
Kelas 10 · Semester 1 Rekayasa Perangkat Lunak 23 Slide Interaktif
Tujuan Pembelajaran

🎯 Apa yang Akan Kamu Kuasai

Setelah menyelesaikan bab ini, kamu mampu:

1
Mengenali 12 widget dasar Flutter
Text, Icon, Image, Button, Container, dan lainnya
2
Membedakan widget tampilan & widget layout
Kapan pakai Row, Column, Center, Padding
3
Membaca pohon widget (widget tree)
Memahami hierarki parent–child
4
Membangun Profile App sederhana
Menggabungkan semua widget menjadi satu aplikasi
Recap Bab 4

🧱 Apa itu Widget?

🧩 Analogi: Balok LEGO

Di Flutter, semua adalah widget. Bayangkan widget seperti balok LEGO — setiap balok kecil disusun menjadi bangunan besar. Tombol, teks, gambar, bahkan tata letak — semuanya balok yang bisa kamu susun.

Widget adalah potongan antarmuka (UI). Setiap elemen yang kamu lihat di layar aplikasi Flutter adalah sebuah widget.

Dua jenis utama:
Widget Tampilan — menampilkan sesuatu (Text, Icon, Image)
Widget Layout — mengatur posisi (Row, Column, Center, Padding)
Ingat: Widget bisa berisi widget lain. Inilah yang disebut widget tree (pohon widget).
Widget Tampilan · 01

🔤 Text

🪧 Analogi: Papan Nama

Widget Text seperti papan nama di meja — tugasnya hanya satu: menampilkan tulisan kepada orang yang melihat.
Halo, Flutter!
text_widget.dart
Text(
  'Halo, Flutter!',
  style: TextStyle(
    fontSize: 24,
    color: Colors.amber,
    fontWeight: FontWeight.bold,
  ),
)
Penjelasan: Argumen pertama adalah teks yang ditampilkan. Properti style mengatur ukuran, warna, dan ketebalan huruf melalui TextStyle.
Hasil Render klik untuk merender
// hasil Text akan muncul di sini
Halo, Flutter!
Widget Tampilan · 02

Icon

🚦 Analogi: Rambu Lalu Lintas

Widget Icon seperti rambu lalu lintas — gambar kecil sederhana yang langsung menyampaikan makna tanpa kata-kata.
❤️🏠
icon_widget.dart
Icon(
  Icons.favorite,
  color: Colors.red,
  size: 40,
)
Penjelasan: Icons.favorite memilih ikon dari pustaka bawaan Flutter (Material Icons). Properti size dan color mengatur ukuran serta warnanya.
Hasil Render klik untuk merender
// ikon akan muncul satu per satu
❤️
🏠
🔔
⚙️
Widget Tampilan · 03

🖼️ Image

🖼️ Analogi: Figura Foto

Widget Image seperti figura foto di dinding — wadah untuk menampilkan gambar, baik dari internet maupun dari dalam aplikasi.
🏞️
image_widget.dart
// Gambar dari internet
Image.network(
  'https://contoh.com/foto.png',
  width: 150,
  height: 150,
)

// Gambar dari aset aplikasi
Image.asset('assets/logo.png')
Penjelasan: Gunakan Image.network untuk gambar dari URL, dan Image.asset untuk gambar yang disimpan di dalam proyek.
Hasil Render klik untuk memuat gambar
// gambar dimuat ke dalam figura
🌄
🐱
Widget Tampilan · 04

🔘 Button

🛗 Analogi: Tombol Lift

Widget ElevatedButton seperti tombol lift — ketika ditekan, ia melakukan suatu aksi (misal pindah lantai, atau di aplikasi: pindah halaman).
button_widget.dart
ElevatedButton(
  onPressed: () {
    print('Tombol ditekan!');
  },
  child: Text('Tekan Saya'),
)
Penjelasan: onPressed berisi kode yang dijalankan saat tombol ditekan. child adalah isi tombol — biasanya sebuah Text.
Hasil Render lalu klik tombolnya!
// tombol muncul — coba klik untuk uji onPressed
Widget Layout · 01

📦 Container

📦 Analogi: Kotak Kemasan

Widget Container seperti kotak kemasan Amazon — bisa diatur ukuran, warna, jarak, dan bisa membungkus satu widget di dalamnya.
container_widget.dart
Container(
  width: 150,
  height: 110,
  color: Colors.amber,
  padding: EdgeInsets.all(12),
  child: Text('Isi Kotak'),
)
Penjelasan: Container sangat fleksibel — atur width, height, color, dan padding. Properti child menampung satu widget.
🎮 Praktek — Ubah Container Secara Langsung
width150px
height110px
borderRadius14px
child
Sering bingung: Pakai Container jika butuh warna/dekorasi. Pakai SizedBox jika hanya butuh ukuran atau jarak kosong.
Widget Layout · 02

↔️ Row

🎬 Analogi: Kursi Bioskop

Widget Row menyusun widget secara mendatar (kiri ke kanan) — seperti deretan kursi bioskop dalam satu baris.
row_widget.dart
Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Icon(Icons.star),
    Text('Bintang'),
    Icon(Icons.star),
  ],
)
Penjelasan: Row punya children (banyak widget). mainAxisAlignment mengatur posisi mendatar: center, spaceBetween, dll.
🎮 Praktek — mainAxisAlignment (klik tombolnya!)
Klik tombol di atas — perhatikan bagaimana mainAxisAlignment menggeser posisi widget sepanjang sumbu mendatar.
Widget Layout · 03

↕️ Column

📚 Analogi: Rak Buku Bertingkat

Widget Column menyusun widget secara menurun (atas ke bawah) — seperti rak buku bertingkat, satu di atas yang lain.
column_widget.dart
Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: <Widget>[
    Text('Baris Pertama'),
    Text('Baris Kedua'),
    Text('Baris Ketiga'),
  ],
)
Row vs Column: Row = mendatar (samping). Column = menurun (atas-bawah). Keduanya memakai children.
🎮 Praktek — crossAxisAlignment (klik tombolnya!)
Column menyusun ke bawah; crossAxisAlignment mengatur perataan mendatar (kiri / tengah / kanan).
Widget Layout · 04

🎯 Center

🍽️ Analogi: Piring di Tengah Meja

Widget Center menempatkan widget anaknya tepat di tengah ruang yang tersedia — seperti piring utama yang diletakkan di tengah meja makan.
center_widget.dart
Center(
  child: Text(
    'Aku di tengah!',
    style: TextStyle(fontSize: 20),
  ),
)
Penjelasan: Center hanya punya satu child. Ia berguna saat kamu ingin sesuatu berada persis di tengah layar atau di tengah Container.
Hasil Render klik untuk merender
// child diletakkan tepat di tengah
🎯 Aku di tengah!
Widget Layout · 05

🫧 Padding

🫧 Analogi: Bubble Wrap

Widget Padding memberi ruang kosong di sekeliling widget — seperti bubble wrap yang melindungi barang di dalam kotak pengiriman.
padding_widget.dart
Padding(
  padding: EdgeInsets.all(16),
  child: Text('Ada ruang di sekelilingku'),
)
Penjelasan: EdgeInsets.all(16) memberi jarak 16 piksel di semua sisi. Bisa juga EdgeInsets.symmetric atau EdgeInsets.only untuk sisi tertentu.
🎮 Praktek — EdgeInsets.all (geser slidernya!)
padding16px
child
Makin besar nilai padding, makin jauh jarak antara child (kotak hijau) dengan tepi pembungkusnya.
Widget Layout · 06

📐 SizedBox

🪑 Analogi: Jarak Antar Furnitur

Widget SizedBox adalah kotak kosong berukuran tetap — sering dipakai sebagai spacer (jarak) antar widget, seperti jarak antara dua furnitur.
sizedbox_widget.dart
Column(
  children: <Widget>[
    Text('Atas'),
    SizedBox(height: 20), // jarak 20px
    Text('Bawah'),
  ],
)
Penjelasan: SizedBox(height: 20) membuat jarak vertikal. SizedBox(width: 20) untuk jarak mendatar di dalam Row.
🎮 Praktek — SizedBox(height) (geser slidernya!)
height (jarak)20px
Atas
Bawah
SizedBox adalah kotak kosong. Geser slider — dua widget makin berjauhan seiring bertambahnya tinggi.
Widget Layout · 07

🎈 Expanded

🎈 Analogi: Balon Mengisi Ruang

Widget Expanded seperti balon yang mengembang — ia mengisi seluruh sisa ruang yang kosong di dalam Row atau Column.
expanded_widget.dart
Row(
  children: <Widget>[
    Icon(Icons.menu),
    Expanded(
      child: Text('Aku mengisi sisa ruang'),
    ),
    Icon(Icons.search),
  ],
)
Penjelasan: Expanded hanya bisa dipakai di dalam Row atau Column. Ia mendorong widget lain ke tepi dan mengambil ruang sisa.
🎮 Praktek — Pakai Expanded? (klik tombolnya!)
Text
🔍
Tanpa Expanded, teks hanya selebar isinya. Dengan Expanded, ia melar mengisi sisa ruang di antara dua ikon.
Widget Tampilan · 05

🃏 Card

💳 Analogi: Kartu Nama

Widget Card seperti kartu nama — wadah dengan sudut membulat dan bayangan, untuk mengelompokkan informasi yang berkaitan.
CARD
★ VIP
card_widget.dart
Card(
  elevation: 4,
  child: Padding(
    padding: EdgeInsets.all(16),
    child: Text('Informasi penting'),
  ),
)
Penjelasan: elevation mengatur tinggi bayangan kartu. Card biasanya dipadukan dengan Padding dan Column untuk menyusun isinya.
Hasil Render klik untuk merender
// Card muncul dengan bayangan
📌 Informasi penting di dalam Card
Konsep Inti

🌳 Widget Tree — Pohon Hierarki

Setiap widget bisa menampung widget lain. Susunannya membentuk "pohon" parent–child.

Scaffold
Center
Column
Text
Icon
Row
Image
Text
Cara membaca: Scaffold adalah parent tertinggi. Di bawahnya ada Center → Column → lalu beberapa anak (Text, Icon, Row). Widget di dalam disebut child; yang membungkus disebut parent.
🟡 Root🟣 Layout🟢 Tampilan
Mini Project · Bagian 1

📱 Profile App — Desain & Rencana

Kita akan membangun aplikasi profil sederhana dengan menggabungkan widget yang sudah dipelajari.

🧩 Widget yang Dipakai

A
CircleAvatar
Foto profil bulat
T
Text
Nama & status
R
Row
Ikon media sosial berjajar
C
Card + Column
Detail informasi
B
ElevatedButton
Tombol Edit Profil

Rencana susunan (widget tree):

Scaffold
  └ AppBar (judul "Profil Saya")
  └ Column
    ├ CircleAvatar
    ├ Text (nama)
    ├ Text (status)
    ├ Row (ikon sosmed)
    ├ Card → Column (detail)
    └ ElevatedButton
Target: Setelah project ini, kamu mampu menyusun banyak widget menjadi satu layar aplikasi yang utuh.
Mini Project · Bagian 2

💻 Profile App — Kode Lengkap

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

void main() {
  runApp(MaterialApp(home: ProfilePage()));
}

class ProfilePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Profil Saya'),
        backgroundColor: Colors.deepPurple,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // Foto profil bulat
            CircleAvatar(
              radius: 50,
              backgroundColor: Colors.amber,
              child: Icon(Icons.person, size: 50),
            ),
            SizedBox(height: 12),
            // Nama
            Text(
              'Sahil Pratama',
              style: TextStyle(
                fontSize: 22,
                fontWeight: FontWeight.bold,
              ),
            ),
            // Status
            Text(
              'Siswa RPL - Kelas 10',
              style: TextStyle(color: Colors.grey),
            ),
            SizedBox(height: 10),
            // Ikon media sosial berjajar
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Icon(Icons.facebook, color: Colors.blue),
                SizedBox(width: 16),
                Icon(Icons.camera_alt, color: Colors.pink),
                SizedBox(width: 16),
                Icon(Icons.email, color: Colors.red),
              ],
            ),
            SizedBox(height: 16),
            // Kartu detail informasi
            Card(
              elevation: 4,
              child: Padding(
                padding: EdgeInsets.all(16),
                child: Column(
                  children: <Widget>[
                    Text('Hobi: Coding & Game'),
                    Text('Kota: Jakarta'),
                  ],
                ),
              ),
            ),
            SizedBox(height: 16),
            // Tombol edit
            ElevatedButton(
              onPressed: () {},
              child: Text('Edit Profil'),
            ),
          ],
        ),
      ),
    );
  }
}
Mini Project · Bagian 3

👁️ Profile App — Preview & Breakdown

Profil Saya
👤
Sahil Pratama
Siswa RPL - Kelas 10
📘📷✉️
Hobi: Coding & Game
Kota: Jakarta

Mari kita bedah bagian per bagian:

1
AppBar
Bilah ungu di atas berisi judul
2
CircleAvatar
Lingkaran emas berisi ikon orang
3
Text x2
Nama (tebal) & status (abu-abu)
4
Row
Tiga ikon sosmed dengan SizedBox sebagai jarak
5
Card
Kotak detail hobi & kota
6
ElevatedButton
Tombol aksi di bagian bawah
Latihan 1

✏️ Layout Sederhana (Row + Column + Text)

📋 Instruksi

  • Buat sebuah Column berisi 2 baris
  • Baris 1: Row dengan 3 widget Text (Senin, Selasa, Rabu)
  • Baris 2: Text bertuliskan "Jadwal Pelajaran"
  • Beri jarak antar baris dengan SizedBox

✅ Output yang Diharapkan

  • Tiga hari tampil berjajar mendatar
  • Teks "Jadwal Pelajaran" di bawahnya
  • Ada jarak rapi antara keduanya
latihan1_starter.dart
// Lengkapi kode di bawah ini!
Column(
  children: <Widget>[
    Row(
      children: <Widget>[
        Text('Senin'),
        // TODO: tambahkan Selasa dan Rabu
      ],
    ),
    // TODO: tambahkan SizedBox(height: ...)
    // TODO: tambahkan Text('Jadwal Pelajaran')
  ],
)
Latihan 2

✏️ Kartu Profil (Card + Image + Text)

📋 Instruksi

  • Buat sebuah Card dengan elevation 4
  • Di dalamnya, gunakan Column
  • Isi: Icon (atau Image), Text nama, Text jurusan
  • Bungkus isi Card dengan Padding agar rapi

✅ Output yang Diharapkan

  • Sebuah kartu dengan bayangan
  • Ikon di atas, nama & jurusan di bawahnya
  • Ada ruang (padding) di dalam kartu
latihan2_starter.dart
Card(
  elevation: 4,
  child: Padding(
    padding: EdgeInsets.all(16),
    child: Column(
      children: <Widget>[
        Icon(Icons.school, size: 40),
        // TODO: Text nama
        // TODO: Text jurusan
      ],
    ),
  ),
)
Tugas Akhir

🏆 Profile App Mandiri

Buat aplikasi profil versimu sendiri dengan menggabungkan semua widget Bab 5.

📋 Brief Project

  • Tampilkan foto/ikon profil (CircleAvatar)
  • Cantumkan nama, kelas, dan motto (Text)
  • Susun minimal 3 ikon hobi dalam Row
  • Buat 1 Card berisi data diri (Column di dalamnya)
  • Tambahkan tombol "Hubungi Saya"
  • Gunakan Padding & SizedBox agar tampilan rapi

📊 Rubrik Penilaian

KriteriaNilai
Menggunakan ≥ 6 widget berbeda30
Layout rapi (Row, Column, Padding)25
Kode berjalan tanpa error25
Kreativitas & kerapian tampilan20
Total100
Tips: Mulai dari kode Mini Project (Slide 18), lalu ubah data dan tambahkan kreasimu sendiri. Jangan takut bereksperimen!
Rangkuman

🧠 Rangkuman BAB 5

Semua yang sudah kamu kuasai dalam satu peta pikiran:

🔤 Widget Tampilan

Text, Icon, Image, Button, Card — menampilkan sesuatu ke layar.

📦 Container

Kotak serbaguna: ukuran, warna, padding, satu child.

↔️ Row & Column

Row = mendatar. Column = menurun. Pakai children (banyak widget).

🎯 Center & Padding

Center = di tengah. Padding = ruang di sekeliling widget.

📐 SizedBox & Expanded

SizedBox = jarak/ukuran tetap. Expanded = mengisi sisa ruang.

🌳 Widget Tree

Susunan parent–child. Widget bisa membungkus widget lain.

🎉 Selamat! Kamu telah menyelesaikan Bab 5. Sekarang kamu mampu membangun antarmuka aplikasi Flutter sederhana. Lanjutkan ke Bab 6 untuk belajar interaksi & state!
✔ 12 Widget Dasar✔ Widget Tree✔ Profile App✔ 3 Latihan