Postingan kali ini, untuk siswa Flutter pemula, materi Struktur Kontrol paling bagus dibuat bertahap: siswa tidak langsung diberi kode kompleks, tetapi memahami kondisi → percabangan → perulangan → kontrol loop → nested loop, lalu semuanya diterapkan pada Project Aplikasi Penilaian.
📱 PRAKTIKUM FLUTTER PEMULA
Struktur Kontrol Dart & Flutter
Project: Aplikasi Penilaian Siswa
Sasaran: Siswa SMK Kelas XI RPL/PPLG
Level: Pemula
Bahasa: Dart
Framework: Flutter
Tools: VS Code / Android Studio / DartPad
Durasi: ± 6–8 JP
🎯 Tujuan Pembelajaran
Setelah praktikum, siswa diharapkan mampu:
- Menjelaskan fungsi struktur kontrol dalam pemrograman.
-
Menggunakan
if,else if, danelse. -
Menggunakan
switch. -
Menggunakan perulangan
for,while, dando-while. -
Menggunakan
breakdancontinue. - Membuat nested loop.
- Menggabungkan struktur kontrol dalam aplikasi Flutter.
- Membuat aplikasi sederhana untuk menentukan nilai dan predikat siswa.
🧠 BAGIAN 1 — Mengenal Struktur Kontrol
Struktur kontrol digunakan agar program dapat mengambil keputusan dan mengulang perintah.
Secara sederhana:
Program │ ├── Apakah kondisi terpenuhi? │ │ │ ├── Ya → lakukan sesuatu │ └── Tidak → lakukan sesuatu yang lain │ └── Apakah perintah perlu diulang? │ └── Ya → ulangi
Dalam Dart kita akan mempelajari:
| Struktur | Fungsi |
|---|---|
if | Pengambilan keputusan |
switch | Memilih berdasarkan beberapa kondisi |
for | Perulangan dengan jumlah tertentu |
while | Perulangan selama kondisi benar |
do-while | Perulangan minimal satu kali |
break | Menghentikan perulangan |
continue | Melewati satu putaran |
| Nested loop | Perulangan di dalam perulangan |
🟢 PRAKTIKUM 1 — IF
Tujuan
Siswa dapat membuat keputusan sederhana menggunakan if.
Contoh
void main() { int nilai = 85; if (nilai >= 75) { print("LULUS"); } }
Jika nilai:
85
hasil:
LULUS
✏️ Latihan 1
Ubahlah program sehingga:
-
Nilai ≥ 75 →
LULUS -
Nilai < 75 →
TIDAK LULUS
Tantangan
int nilai = 65;
Prediksi hasil sebelum menjalankan program.
🟢 PRAKTIKUM 2 — IF ELSE IF
Sekarang kita menentukan predikat nilai.
Gunakan aturan:
| Nilai | Predikat |
|---|---|
| 90–100 | A |
| 80–89 | B |
| 70–79 | C |
| 60–69 | D |
| < 60 | E |
Kode
void main() { int nilai = 85; if (nilai >= 90) { print("Predikat A"); } else if (nilai >= 80) { print("Predikat B"); } else if (nilai >= 70) { print("Predikat C"); } else if (nilai >= 60) { print("Predikat D"); } else { print("Predikat E"); } }
💡 Pertanyaan
Apa yang terjadi jika:
nilai = 95;
Bagaimana jika:
nilai = 55;
🟡 PRAKTIKUM 3 — SWITCH
switch cocok digunakan ketika kita memiliki beberapa pilihan nilai/kategori.
Contoh:
void main() { String predikat = "A"; switch (predikat) { case "A": print("Sangat Baik"); break; case "B": print("Baik"); break; case "C": print("Cukup"); break; case "D": print("Kurang"); break; default: print("Tidak diketahui"); } }
✏️ Latihan
Buat program:
1 → Senin 2 → Selasa 3 → Rabu 4 → Kamis 5 → Jumat 6 → Sabtu 7 → Minggu
Contoh:
int hari = 3;
Output:
Rabu
🔵 PRAKTIKUM 4 — LOOP
Sekarang kita belajar membuat program melakukan pekerjaan berulang.
A. FOR
void main() { for (int i = 1; i <= 10; i++) { print("Perulangan ke-$i"); } }
Output:
Perulangan ke-1 Perulangan ke-2 Perulangan ke-3 ... Perulangan ke-10
✏️ Tantangan
Buat program yang menampilkan:
1 2 3 4 5 6 7 8 9 10
Kemudian ubah menjadi:
10 9 8 7 ... 1
🔵 PRAKTIKUM 5 — LOOP DATA SISWA
Misalnya terdapat data:
List<String> siswa = [ "Andi", "Budi", "Citra", "Dina", "Eko" ];
Tampilkan semua nama menggunakan for.
void main() { List<String> siswa = [ "Andi", "Budi", "Citra", "Dina", "Eko" ]; for (int i = 0; i < siswa.length; i++) { print(siswa[i]); } }
🔴 PRAKTIKUM 6 — BREAK
break digunakan untuk menghentikan loop.
void main() { for (int i = 1; i <= 10; i++) { print(i); if (i == 5) { break; } } }
Hasil:
1 2 3 4 5
Setelah angka 5, loop berhenti.
✏️ Tantangan
Buat program mencari angka 7.
Jika ditemukan angka 7:
Angka ditemukan!
Kemudian hentikan loop.
🟣 PRAKTIKUM 7 — CONTINUE
Berbeda dengan break.
continue tidak menghentikan loop, tetapi melewati satu putaran.
void main() { for (int i = 1; i <= 10; i++) { if (i == 5) { continue; } print(i); } }
Hasil:
1 2 3 4 6 7 8 9 10
Angka 5 dilewati.
🟠 PRAKTIKUM 8 — NESTED LOOP
Nested loop adalah:
Loop di dalam loop.
Contoh membuat pola:
***** ***** ***** ***** *****
Kode:
void main() { for (int baris = 1; baris <= 5; baris++) { for (int kolom = 1; kolom <= 5; kolom++) { print("*"); } } }
Tetapi agar bentuknya terlihat lebih jelas:
void main() { for (int baris = 1; baris <= 5; baris++) { String hasil = ""; for (int kolom = 1; kolom <= 5; kolom++) { hasil += "*"; } print(hasil); } }
Output:
***** ***** ***** ***** *****
🚀 PROJECT AKHIR
📊 APLIKASI PENILAIAN SISWA
Setelah mempelajari semua struktur kontrol, siswa membuat aplikasi Flutter sederhana.
Konsep Aplikasi
Guru memasukkan:
Nama Siswa Nilai Tugas Nilai UTS Nilai UAS
Kemudian aplikasi menghitung:
Nilai Akhir Predikat Keterangan
🧮 Rumus
Gunakan:
Nilai Akhir = 30% Tugas + 30% UTS + 40% UAS
Contoh:
Tugas = 80 UTS = 75 UAS = 90
Maka:
80 × 30% = 24 75 × 30% = 22.5 90 × 40% = 36 Nilai Akhir = 82.5
Predikat:
A = 90–100 B = 80–89 C = 70–79 D = 60–69 E = <60
Keterangan:
Nilai ≥ 75 → LULUS Nilai < 75 → TIDAK LULUS
📱 TAMPILAN APLIKASI
Siswa diarahkan membuat UI seperti:
┌──────────────────────────────┐ │ 📊 PENILAIAN SISWA │ ├──────────────────────────────┤ │ │ │ Nama Siswa │ │ ┌──────────────────────────┐ │ │ │ Andi │ │ │ └──────────────────────────┘ │ │ │ │ Nilai Tugas │ │ ┌──────────────────────────┐ │ │ │ 80 │ │ │ └──────────────────────────┘ │ │ │ │ Nilai UTS │ │ ┌──────────────────────────┐ │ │ │ 75 │ │ │ └──────────────────────────┘ │ │ │ │ Nilai UAS │ │ ┌──────────────────────────┐ │ │ │ 90 │ │ │ └──────────────────────────┘ │ │ │ │ [ HITUNG NILAI ] │ │ │ ├──────────────────────────────┤ │ HASIL PENILAIAN │ │ │ │ Andi │ │ Nilai Akhir : 82.5 │ │ Predikat : B │ │ Status : LULUS │ └──────────────────────────────┘
💻 STRUKTUR LOGIKA PROJECT
Siswa belajar menggabungkan materi.
Input │ ▼ Validasi nilai │ ▼ Hitung nilai akhir │ ▼ IF │ ├── >= 90 → A ├── >= 80 → B ├── >= 70 → C ├── >= 60 → D └── < 60 → E │ ▼ Cek kelulusan │ ├── >= 75 → LULUS └── < 75 → TIDAK LULUS │ ▼ Tampilkan hasil
🧩 KODE PROJECT DASAR
Untuk siswa pemula, saya sarankan jangan langsung menggunakan database. Fokus dulu pada struktur kontrol.
Berikut starter main.dart:
import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Aplikasi Penilaian', theme: ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: Colors.indigo, ), useMaterial3: true, ), home: const PenilaianPage(), ); } } class PenilaianPage extends StatefulWidget { const PenilaianPage({super.key}); @override State<PenilaianPage> createState() => _PenilaianPageState(); } class _PenilaianPageState extends State<PenilaianPage> { final namaController = TextEditingController(); final tugasController = TextEditingController(); final utsController = TextEditingController(); final uasController = TextEditingController(); double? nilaiAkhir; String predikat = ''; String status = ''; void hitungNilai() { final nama = namaController.text.trim(); final tugas = double.tryParse(tugasController.text); final uts = double.tryParse(utsController.text); final uas = double.tryParse(uasController.text); if (nama.isEmpty || tugas == null || uts == null || uas == null) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Lengkapi semua data terlebih dahulu!'), ), ); return; } if (tugas < 0 || tugas > 100 || uts < 0 || uts > 100 || uas < 0 || uas > 100) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Nilai harus berada antara 0 sampai 100!'), ), ); return; } final hasil = (tugas * 0.30) + (uts * 0.30) + (uas * 0.40); String hasilPredikat; if (hasil >= 90) { hasilPredikat = 'A'; } else if (hasil >= 80) { hasilPredikat = 'B'; } else if (hasil >= 70) { hasilPredikat = 'C'; } else if (hasil >= 60) { hasilPredikat = 'D'; } else { hasilPredikat = 'E'; } final hasilStatus = hasil >= 75 ? 'LULUS' : 'TIDAK LULUS'; setState(() { nilaiAkhir = hasil; predikat = hasilPredikat; status = hasilStatus; }); } void resetForm() { namaController.clear(); tugasController.clear(); utsController.clear(); uasController.clear(); setState(() { nilaiAkhir = null; predikat = ''; status = ''; }); } Widget inputNilai( String label, TextEditingController controller, ) { return Padding( padding: const EdgeInsets.only(bottom: 16), child: TextField( controller: controller, keyboardType: TextInputType.number, decoration: InputDecoration( labelText: label, border: const OutlineInputBorder(), prefixIcon: const Icon(Icons.edit), ), ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('📊 Penilaian Siswa'), centerTitle: true, ), body: SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Text( 'Data Siswa', style: TextStyle( fontSize: 22, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 20), TextField( controller: namaController, decoration: const InputDecoration( labelText: 'Nama Siswa', border: OutlineInputBorder(), prefixIcon: Icon(Icons.person), ), ), const SizedBox(height: 16), inputNilai( 'Nilai Tugas', tugasController, ), inputNilai( 'Nilai UTS', utsController, ), inputNilai( 'Nilai UAS', uasController, ), const SizedBox(height: 10), ElevatedButton.icon( onPressed: hitungNilai, icon: const Icon(Icons.calculate), label: const Text('HITUNG NILAI'), ), const SizedBox(height: 10), OutlinedButton.icon( onPressed: resetForm, icon: const Icon(Icons.refresh), label: const Text('RESET'), ), const SizedBox(height: 30), if (nilaiAkhir != null) Card( child: Padding( padding: const EdgeInsets.all(20), child: Column( children: [ const Text( 'HASIL PENILAIAN', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 20), Text( namaController.text, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 15), Text( 'Nilai Akhir', style: TextStyle( color: Colors.grey.shade600, ), ), Text( nilaiAkhir!.toStringAsFixed(1), style: const TextStyle( fontSize: 42, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 10), Text( 'Predikat: $predikat', style: const TextStyle( fontSize: 20, ), ), const SizedBox(height: 10), Text( status, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.bold, ), ), ], ), ), ), ], ), ), ); } @override void dispose() { namaController.dispose(); tugasController.dispose(); utsController.dispose(); uasController.dispose(); super.dispose(); } }
🔥 PENGEMBANGAN PROJECT
Setelah aplikasi dasar berhasil, jangan berhenti di sini. Jadikan project ini sebagai sarana menguji seluruh materi Struktur Kontrol.
Level 1 — Dasar
Tambahkan:
- Nama siswa
- Nilai tugas
- Nilai UTS
- Nilai UAS
- Nilai akhir
- Predikat
- Status kelulusan
Level 2 — switch
Tambahkan pilihan mata pelajaran:
Pemrograman Basis Data Jaringan UI/UX Bahasa Inggris
Kemudian gunakan switch untuk menentukan bobot atau keterangan tertentu.
Level 3 — loop
Buat daftar beberapa siswa:
Andi Budi Citra Deni Eka
Kemudian tampilkan menggunakan ListView.builder.
Di sini siswa mulai melihat hubungan antara:
Dart Loop → Flutter Widget
🚀 Level 4 — BREAK & CONTINUE
Misalnya terdapat 10 data siswa.
Jika ditemukan siswa bernama:
Citra
gunakan break untuk menghentikan pencarian.
Untuk siswa yang datanya belum lengkap, gunakan:
continue;
agar siswa tersebut dilewati.
🚀 Level 5 — NESTED LOOP
Buat data:
Kelas XI RPL 1 ├── Andi ├── Budi ├── Citra Kelas XI RPL 2 ├── Deni ├── Eka ├── Fajar
Struktur datanya dapat dibuat:
List<List<String>> kelas = [ ['Andi', 'Budi', 'Citra'], ['Deni', 'Eka', 'Fajar'], ];
Kemudian:
for (int i = 0; i < kelas.length; i++) { for (int j = 0; j < kelas[i].length; j++) { print(kelas[i][j]); } }
Ini menjadi contoh nested loop yang benar-benar relevan dengan aplikasi sekolah.
🏆 TUGAS PROJECT SISWA
Buat aplikasi:
"Aplikasi Penilaian Siswa Berbasis Flutter"
Minimal mempunyai:
- Input nama siswa
- Input nilai tugas
- Input nilai UTS
- Input nilai UAS
- Tombol Hitung
- Tombol Reset
- Validasi input
- Perhitungan nilai akhir
- Predikat A–E
- Status LULUS/TIDAK LULUS
- Tampilan hasil yang menarik
Pengembangan nilai tambah:
- Daftar banyak siswa
-
ListView.builder - Tambah data
- Hapus data
- Edit data
- Pencarian siswa
- Rekap nilai
- Nilai tertinggi
- Nilai terendah
- Rata-rata kelas
📝 LKPD / LEMBAR KERJA SISWA
Aktivitas 1
Buat program menggunakan if untuk menentukan:
LULUS / TIDAK LULUS
Aktivitas 2
Gunakan if else if untuk menentukan:
A / B / C / D / E
Aktivitas 3
Gunakan switch untuk menentukan nama hari.
Aktivitas 4
Gunakan for untuk menampilkan 10 siswa.
Aktivitas 5
Gunakan break untuk menghentikan pencarian siswa.
Aktivitas 6
Gunakan continue untuk melewati data siswa yang tidak lengkap.
Aktivitas 7
Gunakan nested loop untuk menampilkan siswa berdasarkan kelas.
Aktivitas 8
Gabungkan seluruh konsep menjadi Aplikasi Penilaian.
📊 RUBRIK PENILAIAN
| Komponen | Bobot |
|---|---|
| Struktur program | 15 |
Implementasi if | 15 |
Implementasi switch | 10 |
| Implementasi loop | 15 |
break & continue | 10 |
| Nested loop | 10 |
| UI/UX Flutter | 15 |
| Kreativitas | 10 |
| Total | 100 |
💡 Alur pembelajaran yang saya rekomendasikan
Untuk siswa kelas XI RPL/PPLG yang masih pemula, urutannya sebaiknya:
Pertemuan 1
if → else → else if
Pertemuan 2
switch → latihan kasus
Pertemuan 3
for → while → do while
Pertemuan 4
break → continue → nested loop
Pertemuan 5
Flutter UI + input data
Pertemuan 6
Project Aplikasi Penilaian
Pertemuan 7
Pengembangan daftar banyak siswa
Pertemuan 8
Presentasi/demo project
Dengan pola ini, siswa tidak sekadar menghafal sintaks, tetapi melihat langsung bahwa if, switch, dan loop adalah bagian dari logika aplikasi Flutter yang mereka buat sendiri.







Tidak ada komentar:
Posting Komentar