1. Konsep Single-Threaded Event Loop di Dart
Dart mengeksekusi kode secara single-threaded (satu thread utama). Agar aplikasi tidak mengalami macet (freeze) saat menunggu tugas berat (seperti mengunduh data dari internet atau membaca database lokal), Dart menggunakan model Asynchronous Programming berbasis Event Loop.
2. Bekerja dengan Future & Sintaks async / await
Future mewakili sebuah nilai atau error yang baru akan tersedia di masa mendatang. Penggunaan sintaks async dan await membuat penulisan kode asinkron tampak bersih dan terbaca seperti kode sinkron berurutan:
// Fungsi simulasi request API dengan jeda waktu 2 detik
Future<String> fetchUserData(int userId) async {
print("Mengirim request data user ke server...");
// Simulasi network delay
await Future.delayed(Duration(seconds: 2));
return '{"id": $userId, "nama": "Rizky Ramadhan", "jurusan": "TJKT"}';
}
void main() async {
print("Aplikasi dimulai.");
try {
String hasilJson = await fetchUserData(101);
print("Data Diterima: $hasilJson");
} catch (error) {
print("Terjadi error: $error");
} finally {
print("Operasi fetch selesai.");
}
print("Aplikasi siap digunakan.");
}
3. Pengenalan Reactive Streams (Aliran Data Berkelanjutan)
Jika Future hanya mengembalikan satu nilai tunggal di masa depan, Stream mengalirkan banyak nilai secara berurutan seiring berjalannya waktu (mirip pipa air yang terus mengalirkan data, seperti update lokasi GPS atau detak sensor):
// Stream generator menggunakan keyword async* dan yield
Stream<int> hitungDetik(int totalDetik) async* {
for (int i = 1; i <= totalDetik; i++) {
await Future.delayed(Duration(seconds: 1));
yield i; // Mengirimkan nilai baru ke listener
}
}
void main() async {
print("Memulai download paket update...");
await for (int detik in hitungDetik(3)) {
print("Progress: Mengunduh data detik ke-$detik...");
}
print("Download 100% Selesai!");
}