Dart menggerakkan seluruh aplikasi Flutter, sehingga cara mendeklarasikan variabel di Dart menjadi bekal dasar sebelum menyusun widget. Topik ini membahas deklarasi variabel dengan var, final, dan const, tipe dasar int, double, String, dan bool, semantik sound null safety, serta operator ?., ??, dan ! beserta kata kunci late dan required. Pada akhir topik, variabel pada kode Dart dapat dideklarasikan dengan tipe yang tepat beserta pengamanan terhadap nilai null.
Program pertama: variabel nilai ujian#
Program pada topik ini menggunakan satu berkas tunggal dengan fungsi main() sebagai titik awal eksekusi, sesuai konvensi Dart. Contoh berikut merekam data sebuah ujian, lengkap dengan satu catatan opsional yang mungkin belum terisi. Simpan program berikut sebagai berkas null_safety.dart, lalu jalankan perintah dart null_safety.dart dari direktori tempat berkas itu berada.
// Demonstrasi variabel, tipe dasar, dan null safety di Dart.
void main() {
// Tipe dasar dan type inference.
var jumlahPeserta = 24; // int terinferensi dari literanya
double rataRata = 78.5;
var mataKuliah = 'Statistika Dasar'; // String terinferensi
bool nilaiLengkap = true;
// final: sekali diisi, nilainya tidak dapat diganti.
final String namaUjian = 'Ujian Tengah Semester';
// const: konstanta yang ditetapkan saat kompilasi.
const int nilaiMaksimum = 100;
// Variabel nullable dan operator ??.
String? catatan;
String catatanTampil = catatan ?? 'tanpa catatan';
// late: dideklarasikan dulu, diisi sebelum dipakai.
late String kesimpulan;
kesimpulan = 'rata-rata $rataRata dari $jumlahPeserta peserta';
// Manipulasi string dan operator ?. pada nilai yang berisi.
String? panggilan = 'Budi';
print('Panjang panggilan : ${panggilan?.length}');
print('Huruf besar : ${mataKuliah.toUpperCase()}');
print('Nama ujian : $namaUjian');
print('Nilai maksimum : $nilaiMaksimum');
print('Nilai lengkap : $nilaiLengkap');
print('Rata-rata : $rataRata');
print('Catatan : $catatanTampil');
print('Kesimpulan : $kesimpulan');
}Panjang panggilan : 4
Huruf besar : STATISTIKA DASAR
Nama ujian : Ujian Tengah Semester
Nilai maksimum : 100
Nilai lengkap : true
Rata-rata : 78.5
Catatan : tanpa catatan
Kesimpulan : rata-rata 78.5 dari 24 pesertaSetiap baris keluaran berasal dari satu pernyataan print di akhir program. Nilai Panjang panggilan : 4 diperoleh dari ekspresi panggilan?.length yang menghitung jumlah karakter pada teks yang tersimpan dalam panggilan. Baris Catatan : tanpa catatan menunjukkan kerja operator ??, yaitu mengambil nilai pengganti karena variabel catatan belum berisi apa pun. Baris Huruf besar memperlihatkan interpolasi string, yakni penyisipan nilai dan hasil ekspresi ke dalam teks dengan tanda $ dan ${}. Bentuk $namaUjian menyisipkan satu variabel, sedangkan ${panggilan?.length} menyisipkan hasil ekspresi apa pun. Bagian berikut mengurai setiap mekanisme yang muncul pada program ini, sehingga setiap baris keluarannya dapat dijelaskan.
Mendeklarasikan variabel: var, final, dan const#
Dart dapat menentukan tipe dari nilai awalnya secara otomatis, kemampuan yang disebut type inference (inferensi tipe). Pernyataan var jumlahPeserta = 24; menghasilkan variabel bertipe int karena literalnya berupa bilangan bulat. Menulis tipe secara eksplisit seperti double rataRata = 78.5; tetap sah dan sering dipilih agar maksudnya terbaca jelas. Tipe dasar yang paling sering muncul adalah int untuk bilangan bulat, double untuk bilangan pecahan, String untuk teks, dan bool untuk nilai benar-salah.
Kata kunci final menyatakan variabel yang hanya dapat diisi satu kali. Setelah final String namaUjian = 'Ujian Tengah Semester'; dieksekusi, penugasan ulang ke namaUjian ditolak Dart pada saat kompilasi. Perbedaannya dengan const terletak pada waktu nilai ditetapkan. Nilai const harus sudah diketahui saat kompilasi, sehingga const int nilaiMaksimum = 100; tertanam langsung ke dalam program. Aturan praktisnya, gunakan final untuk nilai yang baru diketahui saat program berjalan dan const untuk nilai yang sudah pasti sejak kode ditulis.
Null safety: tipe yang tidak boleh kosong#
Null adalah nilai khusus yang menyatakan tidak adanya objek, dan mengakses anggota pada nilai null adalah sumber error yang lazim di banyak bahasa. Sound null safety adalah jaminan bahwa variabel yang tipenya tidak diberi tanda tanya memang tidak akan pernah bernilai null. Jaminan itu diperiksa saat kompilasi, bukan saat program berjalan, sehingga kategori error tersebut hilang sebelum aplikasi digunakan.
Secara bawaan, seluruh tipe bersifat non-nullable, artinya String nama = 'Budi'; tidak boleh diisi null. Tanda tanya pada String? catatan; menyatakan tipe nullable, yaitu boleh berisi String maupun null. Konsekuensinya, anggota pada variabel nullable tidak dapat diakses begitu saja, sebab pemanggilan .length pada nilai null tidak punya arti yang jelas. Bahasa tanpa pemeriksaan ini biasanya baru melempar error ketika program berjalan, yakni ketika aplikasi sudah berada di tangan pengguna. Potongan berikut bahkan tidak dapat dikompilasi sama sekali karena Dart menolaknya dengan pesan error sebelum program dijalankan.
// tidak-dijalankan
String? catatan;
print(catatan.length); // error kompilasi: length tidak dapat diakses langsungOperator pengaman nilai null#
Operator ?. mengakses anggota hanya apabila variabel yang bersangkutan berisi nilai, dan menghasilkan null apabila variabel tersebut kosong. Ekspresi panggilan?.length pada program menghasilkan 4, dan hasil ekspresi semacam ini bertipe nullable karena bisa saja berupa null. Operator ?? menyediakan nilai pengganti ketika sisi kirinya null, sehingga catatan ?? 'tanpa catatan' menghasilkan teks pengganti tersebut. Kedua operator ini saling melengkapi: ?. untuk membaca dengan aman dan ?? untuk menyediakan nilai bawaan.
Operator ! adalah penegasan bahwa variabel nullable saat itu pasti berisi nilai, sehingga aksesnya boleh dilakukan langsung. Apabila penegasan itu keliru, error dilempar ketika program berjalan. Karena itu ! diposisikan sebagai pilihan terakhir. Dart juga melakukan type promotion (promosi tipe) pada variabel lokal di dalam blok if (nilai != null), yaitu memperlakukan tipenya sebagai non-nullable setelah pemeriksaan null, sehingga banyak kasus ! sebenarnya tidak diperlukan. Perbandingan ketiganya dapat diringkas sebagai berikut: ?. untuk membaca, ?? untuk memberi nilai bawaan, dan ! untuk menegaskan.
late dan required#
Kata kunci late memisahkan saat deklarasi dari saat pengisian untuk variabel non-nullable. Pada program, late String kesimpulan; dideklarasikan tanpa nilai awal, lalu diisi sebelum pertama kali dicetak. Variabel late yang diakses sebelum diisi melempar error saat program berjalan, sehingga pola ini menuntut kedisiplinan urutan. Manfaatnya, field yang nilainya baru diketahui belakangan tetap dapat dinyatakan non-nullable tanpa mengisi nilai tiruan di awal.
Kata kunci required bekerja pada parameter fungsi bernama, yaitu memaksa pemanggil mengisinya. Bentuk umumnya adalah void catat({required String judul}), yang membuat pemanggilan tanpa judul: ditolak Dart saat kompilasi. Parameter bernama tanpa required bersifat opsional dan lazim diberi nilai bawaan. Kedua kata kunci ini sering muncul berdampingan pada API Flutter, dan pembahasan lengkapnya tersedia pada topik Fungsi dan closure di modul yang sama.
Deklarasi late juga dapat langsung disertai pengisian nilai, misalnya late String laporan = buatLaporan();. Pada bentuk ini, ekspresi buatLaporan() baru dijalankan ketika variabel pertama kali dibaca, sehingga pekerjaan yang mahal dapat ditunda. Sifat penundaan inilah yang membuat late sering digunakan pada field kelas yang nilainya baru siap setelah beberapa tahap inisialisasi berjalan.
Ringkasan#
- Dart menyimpulkan tipe dari nilai awal, sedangkan
finalmengunci isi satu kali danconstmenetapkan nilai saat kompilasi. - Sound null safety menjadikan tipe non-nullable sebagai bawaan, dan tanda tanya seperti
String?menandai tipe yang boleh null. - Operator
?.membaca dengan aman,??menyediakan nilai pengganti, dan!menegaskan non-null dengan risiko error saat berjalan. latemenunda pengisian variabel non-nullable hingga sesaat sebelum digunakan, sedangkanrequiredmewajibkan parameter bernama diisi.
Referensi#
- Variables — Dart
— Dokumentasi resmi deklarasi variabel, nilai bawaan,
final,const, dan null safety. - Sound null safety — Dart — Penjelasan semantik null safety dan manfaatnya pada bahasa Dart.
- Language — Dart — Halaman induk dokumentasi bahasa Dart yang memuat ringkasan seluruh fitur inti.