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));
}