Lompat ke konten utama
←

Flutter Dasar: Dart, Widget, dan State

Pelajaran 5 dari 18

Dart, bahasa di balik Flutter

Misi: memperbaiki potongan kode kasir

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.

GejalaPenyebab yang dibahas di modul ini
Ditolak sebelum berjalanNilai nullable dipakai langsung, field final diubah, argumen required hilang, Future dipakai sebagai nilai
Berhenti saat berjalanOperator ! pada null, cast as yang salah tipe, firstWhere tanpa elemen yang cocok
Berjalan tetapi hasilnya keliruFuture 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?

void main() {
  final pesanan = {'menu': 'Gudeg', 'catatan': null};
  String? catatan = pesanan['catatan'];
  print(catatan.toUpperCase());
}
Pilih satu jawaban

Latihan 2 dari 4

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;
}
Pilih satu jawaban

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);
}
Pilih satu jawaban

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);
}
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Lanjutkan ke