🎯 📘 Bagian 2 (Lanjutan & Penerapan) • Modul 13 100% Standar Industri & Vokasi

Fitur Mutakhir Dart 3: Records & Pattern Matching

Modul pembelajaran Fitur Mutakhir Dart 3: Records & Pattern Matching.

⚡ Pemrograman DART

15. Fitur Mutakhir Dart 3: Records & Pattern Matching

1. Apa itu Records di Dart 3?

Records adalah tipe data komposit yang anonim, tidak dapat diubah (immutable), dan memungkinkan sebuah fungsi mengembalikan lebih dari satu nilai sekaligus tanpa harus membuat class model khusus.

// Fungsi mengembalikan 2 nilai: String status dan int statusCode
(String, int) cekKoneksiServer(String host) {
  // Mengembalikan Record (tuple)
  return ("ONLINE", 200);
}

// Record dengan Named Fields ({...})
({double latitude, double longitude}) ambilLokasiGps() {
  return (latitude: -6.2088, longitude: 106.8456);
}

void main() {
  // Mengakses field dengan $1, $2
  var res = cekKoneksiServer("192.168.1.1");
  print("Status: ${res.$1}, Kode: ${res.$2}");

  // Mengakses named field
  var gps = ambilLokasiGps();
  print("Koordinat: ${gps.latitude}, ${gps.longitude}");
}

2. Destructuring (Membongkar Nilai Record Secara Elegan)

void main() {
  // Destructuring langsung ke variabel terpisah
  var (status, kode) = ("SUCCESS", 200);
  print("Status: $status | Kode: $kode");

  var (lat: latitude, lon: longitude) = (lat: -6.9175, lon: 107.6191);
  print("Lat: $latitude | Lon: $longitude");
}

3. Exhaustive Pattern Matching & Sealed Classes

Class dengan modifier sealed memastikan compiler mengetahui seluruh kemungkinan subclass-nya, sehingga ketika digunakan pada switch, kita dijamin tidak akan melewatkan satu kondisi pun (Exhaustiveness Checking):

sealed class NetworkState {}

class LoadingState extends NetworkState {}
class SuccessState extends NetworkState {
  final String data;
  SuccessState(this.data);
}
class ErrorState extends NetworkState {
  final String message;
  ErrorState(this.message);
}

// Switch Expression yang aman dan lengkap
String renderUI(NetworkState state) {
  return switch (state) {
    LoadingState() => "⏳ Sedang memuat data...",
    SuccessState(data: var konten) => "✅ Sukses: $konten",
    ErrorState(message: var error) => "❌ Gagal: $error",
  };
}

void main() {
  var state = SuccessState("Paket Data Berhasil Diterima");
  print(renderUI(state));
}