Setelah pelajaran ini kamu bisa memperbaiki dan menelusuri potongan kode kasir yang memadukan null safety, Future, kelas berparameter bawaan, dan pencarian di koleksi.
±17 menit
4 latihan
Diperiksa 28 Okt 2026
Latihan di pelajaran ini butuh akun gratis. Progres, kode, dan catatanmu hanya tersimpan di browser ini. Masuk untuk menyimpannya
Materi
Warung Bu Sri di Yogyakarta sedang dibuatkan aplikasi kasir Flutter. Sebelum menyentuh tampilan, rekanmu menulis logika Dart-nya, dan empat potongan di soal perlu diperiksa: satu ditolak analyzer karena null safety, satu salah menjumlahkan Future, satu menghitung struk berdiskon, dan satu mencari menu yang habis. Harga dan persentase diskon di sini adalah contoh, bukan tarif.
Untuk setiap potongan, jawab dua pertanyaan sebelum melihat pilihan: apakah analyzer menerimanya, dan bila diterima, apa yang terjadi saat berjalan. Pilihan yang lolos analyzer belum tentu benar, karena ! dan as hanya memindahkan galat dari waktu analisis ke waktu berjalan. Catat juga di mana galat muncul: pesan analyzer menyebut baris dan alasannya sebelum program dijalankan, sedangkan galat saat berjalan baru keluar ketika baris itu dieksekusi. Tabel berikut membantu memilah gejalanya.
Gejala
Penyebab yang dibahas di modul ini
Ditolak sebelum berjalan
Nilai nullable dipakai langsung, field final diubah, argumen required hilang, Future dipakai sebagai nilai
Berhenti saat berjalan
Operator ! pada null, cast as yang salah tipe, firstWhere tanpa elemen yang cocok
Berjalan tetapi hasilnya keliru
Future yang tidak ditunggu, nilai bawaan parameter yang terlupa
Latihan
0/4 lulus
Misi akhir modul: luluskan minimal 4 dari 4 tugas. Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.
Latihan 1 dari 4
Potongan ini ditolak analyzer. Baris print mana yang menggantikannya sehingga program mencetak - bila catatan bernilai null, dan catatan berhuruf kapital bila ada?
hitungTotal(['KP', 'TB', 'KP']) seharusnya menghasilkan 45000, tetapi baris di dalam for ditolak analyzer. Perbaikan mana yang benar?
Future<int> ambilHarga(String kode) async => kode == 'KP' ? 18000 : 9000;
Future<int> hitungTotal(List<String> daftarKode) async {
var total = 0;
for (final k in daftarKode) {
total += ambilHarga(k);
}
return total;
}
Latihan 3 dari 4
Apa yang dicetak program struk ini?
class Item {
final String nama;
final int harga;
final int qty;
const Item(this.nama, this.harga, {this.qty = 1});
int get subtotal => harga * qty;
}
class Struk {
final List<Item> item;
final int diskonPersen;
Struk(this.item, {this.diskonPersen = 0});
int get total {
var jumlah = 0;
for (final i in item) {
jumlah += i.subtotal;
}
return jumlah - jumlah * diskonPersen ~/ 100;
}
}
void main() {
final s = Struk([
const Item('Gudeg', 20000, qty: 2),
const Item('Es teh', 5000, qty: 3),
const Item('Kerupuk', 2000),
], diskonPersen: 10);
print(s.total);
}
Latihan 4 dari 4
Apa yang terjadi saat program ini dijalankan?
class Menu {
final String nama;
final int harga;
final bool habis;
const Menu(this.nama, this.harga, {this.habis = false});
}
void main() {
const daftar = [
Menu('Gudeg', 20000),
Menu('Bakmi', 18000, habis: true),
Menu('Es teh', 5000),
Menu('Wedang ronde', 12000, habis: true),
];
final tersedia = daftar.where((m) => !m.habis).map((m) => m.nama).toList();
print(tersedia);
final murahHabis = daftar.firstWhere((m) => m.habis && m.harga < 10000);
print(murahHabis.nama);
}