Pemrograman Dart
Pengenalan Dart, DartPad, Variabel, dan Tipe Data
Pelajari fondasi pemrograman Dart 3 mulai dari struktur fungsi main(), menjalankan kode di DartPad, deklarasi variabel, tipe data dasar, string interpolation, hingga perbedaan final dan const.

Saat baru ingin mempelajari pengembangan aplikasi lintas platform dengan Flutter atau membangun layanan backend modern, langkah pertama yang wajib dikuasai adalah bahasa pemrograman di baliknya: Dart. Banyak pemula langsung melompat menyusun antarmuka pengguna di Flutter tanpa memahami cara Dart menyimpan data, mengenali tipe nilai, atau membedakan variabel yang dapat berubah dan yang bernilai tetap. Akibatnya, pesan kesalahan kompilasi yang sederhana saja terasa membingungkan. Materi pembuka ini memandu kita menulis program Dart 3 pertama langsung dari peramban (browser) menggunakan DartPad dan memahami cara kerja variabel serta tipe data dasar secara menyeluruh.
Yang akan dipelajari
- Mengenal bahasa pemrograman Dart 3, hubungannya dengan Flutter, serta cara menjalankan kode di DartPad tanpa instalasi.
- Memahami titik masuk program (entry point) melalui fungsi
main()dan menampilkan teks denganprint(). - Membedakan deklarasi menggunakan inferensi tipe (
var) dan penulisan tipe data eksplisit (int,double,num,String,bool). - Menyisipkan nilai variabel dan ekspresi ke dalam teks menggunakan string interpolation (
$namadan${ekspresi}). - Memilih pengunci nilai yang tepat antara
final(ditentukan saat program berjalan) danconst(konstanta waktu kompilasi).
Mengenal Dart dan lingkungan DartPad
Dart adalah bahasa pemrograman berorientasi objek (object-oriented) dan bertipe kuat (statically typed) yang dikembangkan oleh Google. Keunggulan utama Dart terletak pada fleksibilitas kompilasinya:
- JIT (Just-In-Time Compilation): Kode dikompilasi saat program berjalan, memungkinkan fitur Hot Reload di Flutter sehingga perubahan kode terlihat dalam hitungan milidetik.
- AOT (Ahead-Of-Time Compilation): Kode diterjemahkan langsung menjadi kode mesin asli (native machine code) untuk performa tinggi saat aplikasi siap dirilis ke pengguna.
Untuk lima materi pertama di Bab 1 hingga Bab 2, kita belum perlu memasang perangkat lunak apa pun di komputer. Cukup buka dartpad.dev melalui peramban. DartPad menyediakan editor kode di sisi kiri dan panel Console di sisi kanan untuk melihat hasil eksekusi setelah menekan tombol Run.
Struktur fungsi main()
Setiap program Dart wajib memiliki satu fungsi tingkat atas bernama main(). Fungsi inilah yang pertama kali dipanggil ketika program dijalankan.
void main() {
// Menampilkan teks ke konsol
print('Halo, selamat datang di jalur belajar Dart 3!');
}
// Output:
// Halo, selamat datang di jalur belajar Dart 3!
Kata kunci void di depan main() menandakan bahwa fungsi tersebut tidak mengembalikan nilai apa pun setelah selesai dieksekusi, sedangkan tanda titik koma (;) wajib ditulis di akhir setiap pernyataan (statement) di Dart.
Variabel dan Tipe Data Dasar
Variabel adalah wadah bernama di memori komputer untuk menyimpan nilai. Sebagai bahasa type-safe, Dart memastikan setiap variabel memiliki tipe data yang jelas sehingga variabel penyimpan angka tidak bisa tiba-tiba diisi teks tanpa sengaja.
Berikut perbandingan tipe data dasar yang paling sering digunakan di Dart:
| Tipe Data | Kegunaan | Contoh Nilai |
|---|---|---|
int |
Bilangan bulat (tanpa koma) positif maupun negatif | 20, -5, 150000 |
double |
Bilangan desimal (floating-point 64-bit) | 3.14, 99.5, -0.02 |
num |
Tipe induk dari int dan double (bisa menampung keduanya) |
10 lalu diubah menjadi 10.5 |
String |
Rangkaian karakter/teks (diapit tanda kutip tunggal '...' atau ganda "...") |
'Belajar Dart', "Flutter" |
bool |
Nilai kebenaran logika, hanya memiliki dua kemungkinan | true, false |
Inferensi tipe (var) vs tipe eksplisit
Di Dart, kita bisa mendeklarasikan variabel dengan dua gaya: menggunakan kata kunci var (membiarkan kompilator menebak tipe datanya berdasarkan nilai awal) atau menuliskan nama tipe datanya secara eksplisit.
void main() {
// 1. Menggunakan inferensi tipe (var)
// Dart otomatis mengunci 'namaMahasiswa' sebagai String
var namaMahasiswa = 'Budi Santoso';
var semester = 3; // Otomatis dikenali sebagai int
// 2. Menggunakan tipe data eksplisit
int sksLulus = 64;
double ipk = 3.78;
num nilaiUjian = 88; // num bisa menerima int maupun double
nilaiUjian = 88.5; // Valid karena bertipe num
bool statusAktif = true;
print(namaMahasiswa);
print(semester);
print(sksLulus);
print(ipk);
print(nilaiUjian);
print(statusAktif);
}
// Output:
// Budi Santoso
// 3
// 64
// 3.78
// 88.5
// true
Panduan resmi Effective Dart menyarankan penggunaan var untuk variabel lokal di dalam fungsi apabila nilai awalnya sudah jelas terlihat, dan menggunakan tipe eksplisit ketika kita ingin memperjelas niat tipe data (misalnya saat menginginkan num atau double meskipun nilai awalnya terlihat bulat).
Catatan Penting: Jangan tertukar antara
vardandynamic. Variabelvaryang sudah diberi nilai awalvar umur = 20;akan terkunci selamanya sebagaiint. Jika baris berikutnya diisiumur = 'dua puluh';, Dart akan menolak kode tersebut saat kompilasi.
String Interpolation
Menggabungkan teks dan nilai variabel menggunakan operator tambah (+) sering kali membuat kode sulit dibaca dan mengharuskan kita memanggil .toString() pada variabel angka. Dart menyediakan fitur string interpolation yang jauh lebih bersih menggunakan tanda dolar ($):
- Gunakan
$namaVariabeluntuk menyisipkan nilai variabel secara langsung. - Gunakan
${ekspresi}jika ingin melakukan perhitungan atau memanggil properti/method dari suatu objek di dalam teks.
void main() {
String produk = 'Buku Algoritma & Struktur Data';
int hargaSatuan = 85000;
int jumlahBeli = 3;
// Menyisipkan variabel dengan $ dan ekspresi perhitungan dengan ${...}
String ringkasan = 'Pesanan: $produk ($jumlahBeli eks) - Total: Rp${hargaSatuan * jumlahBeli}';
print(ringkasan);
// Memanggil properti .length dan method .toUpperCase() di dalam interpolasi
print('Nama produk dalam huruf kapital: ${produk.toUpperCase()}');
print('Panjang karakter judul buku: ${produk.length} karakter');
}
// Output:
// Pesanan: Buku Algoritma & Struktur Data (3 eks) - Total: Rp255000
// Nama produk dalam huruf kapital: BUKU ALGORITMA & STRUKTUR DATA
// Panjang karakter judul buku: 30 karakter
Untuk menulis teks panjang yang terdiri dari beberapa baris (multi-line string), kita juga dapat mengapit teks menggunakan tiga tanda kutip berturut-turut ('''...''' atau """...""").
Variabel Bernilai Tetap: final vs const
Dalam praktik pemrograman modern, sebaiknya variabel dibuat tidak dapat diubah (immutable) kecuali kita memang berencana memperbarui nilainya. Dart memiliki dua kata kunci untuk mengunci nilai variabel agar hanya bisa diisi satu kali: final dan const.
| Aspek | final |
const |
|---|---|---|
| Waktu penentuan nilai | Saat program berjalan (runtime) | Wajib sudah pasti saat kode dikompilasi (compile-time) |
Bisa diisi hasil fungsi dinamis (mis. DateTime.now())? |
Bisa | Tidak bisa (menyebabkan compile error) |
| Contoh penggunaan | Waktu transaksi dibuat, data profil dari server | Nilai matematika pi = 3.14159, konfigurasi warna/margin statis |
Mari kita perhatikan perbedaannya melalui kode berikut:
void main() {
// const: nilainya sudah 100% pasti sebelum program dijalankan
const double pajakPpn = 0.11;
const String namaKampus = 'Universitas Nusantara';
// final: nilainya baru diketahui saat baris kode ini dieksekusi (runtime)
final DateTime waktuAkses = DateTime.now();
final double totalTagihan = 200000 + (200000 * pajakPpn);
print('Kampus : $namaKampus');
print('Tarif PPN : ${pajakPpn * 100}%');
print('Total Tagihan : Rp$totalTagihan');
print('Waktu Akses : $waktuAkses');
}
// Output (waktuAkses menyesuaikan waktu saat dijalankan):
// Kampus : Universitas Nusantara
// Tarif PPN : 11.0%
// Total Tagihan : Rp222000.0
// Waktu Akses : 2026-10-25 14:30:12.451
Jika kita mencoba mengubah pajakPpn = 0.12; atau totalTagihan = 100000; pada baris berikutnya, kompilator Dart akan langsung menghentikan program dan memberikan peringatan bahwa variabel final atau const tidak dapat diisi ulang.
Coba sendiri
Buka dartpad.dev, hapus contoh kode bawaan di dalamnya, lalu salin kode tentang final dan const di atas. Lakukan eksperimen kecil berikut:
- Ubah kata kunci
finalpada barisfinal DateTime waktuAkses = DateTime.now();menjadiconst DateTime waktuAkses = DateTime.now();. Perhatikan pesan kesalahan merah yang muncul di panel bawah DartPad (Const variables must be initialized with a constant value). - Kembalikan menjadi
final, lalu tambahkan variabel baruvar diskon = 15000;dan kurangitotalTagihandengandiskon. Tekan Run dan amati hasilnya di konsol.
Kesalahan yang sering terjadi
| Kesalahan Pemula | Penyebab | Solusi yang Benar |
|---|---|---|
Mengubah tipe data variabel yang dideklarasikan dengan var (misal var x = 10; x = 'sepuluh';) |
Mengira var sama dengan tipe dinamis di JavaScript atau Python. |
Gunakan variabel baru dengan tipe yang sesuai, atau gunakan num jika hanya berpindah antara int dan double. |
Memakai const untuk menyimpan nilai yang dihitung saat runtime (seperti DateTime.now()) |
Belum membedakan waktu kompilasi (compile-time) dan waktu eksekusi (runtime). | Gunakan final untuk nilai yang hanya diisi sekali tetapi baru diketahui saat aplikasi berjalan. |
Menulis $produk.length tanpa kurung kurawal di dalam string |
Dart hanya membaca $produk sebagai variabel, sedangkan .length dianggap teks biasa. |
Gunakan kurung kurawal ${produk.length} setiap kali mengakses properti, method, atau ekspresi matematika. |
Lupa membubuhkan tanda titik koma (;) di akhir baris pernyataan |
Terbiasa dengan bahasa seperti Python atau Kotlin yang tidak mewajibkan titik koma. | Pastikan setiap pernyataan deklarasi dan pemanggilan fungsi diakhiri dengan ;. |
Kaitannya dengan Flutter / Dunia Nyata: Di Flutter, kata kunci
constdanfinalmuncul di hampir setiap baris kode. Saat membangun tampilan seperticonst Text('Beranda')atauconst EdgeInsets.all(16), kata kunciconstmemberi tahu Flutter bahwa komponen antarmuka tersebut tidak akan pernah berubah sehingga tidak perlu digambar ulang (rebuild) ketika layar diperbarui. Penguasaanfinaldanconstsejak hari pertama akan membuat kode Flutter kita jauh lebih hemat memori dan responsif.
Latihan
Kerjakan tiga soal bertingkat berikut di DartPad untuk menguji pemahaman Anda:
- Latihan 1 (Profil Kartu Mahasiswa): Buatlah program di dalam
main()yang menyimpan nama lengkap (String), tahun angkatan (int), IPK sementara (double), dan status beasiswa (bool). Cetak seluruh informasi tersebut dalam 2 baris teks rapi menggunakan string interpolation. - Latihan 2 (Kalkulator Konversi Suhu): Deklarasikan sebuah konstanta
const double suhuCelsius = 36.5;. Hitung nilai konversinya ke Fahrenheit dengan rumus(suhuCelsius * 9 / 5) + 32dan ke Kelvin dengan rumussuhuCelsius + 273.15menggunakan variabelfinal. Tampilkan hasilnya ke layar. - Latihan 3 (Audit
finalvsconst): Diberikan skenario kasir toko buku yang memiliki tarif pajak tetap11%, nama toko tetap'Toko Buku Cendekia', harga buku120000yang masih bisa diubah bila ada revisi harga, serta waktu cetak struk menggunakanDateTime.now(). Tuliskan deklarasi keempat variabel tersebut menggunakan kata kunci paling tepat (var/int,final, atauconst) lalu cetak struk pembayarannya.
Kunci jawaban dan pembahasan
Latihan 1
void main() {
String namaLengkap = 'Nadia Putri Rahmawati';
int tahunAngkatan = 2025;
double ipk = 3.85;
bool penerimaBeasiswa = true;
print('Mahasiswa: $namaLengkap (Angkatan $tahunAngkatan)');
print('IPK: $ipk | Status Beasiswa: $penerimaBeasiswa');
}
// Output:
// Mahasiswa: Nadia Putri Rahmawati (Angkatan 2025)
// IPK: 3.85 | Status Beasiswa: true
Pembahasan: Kita memilih tipe eksplisit yang paling spesifik untuk tiap data: String untuk nama, int untuk tahun karena tidak mungkin memiliki nilai desimal, double untuk IPK, dan bool untuk status biner (ya/tidak). Interpolasi $namaVariabel menggabungkan semuanya tanpa satu pun operator +.
Latihan 2
void main() {
const double suhuCelsius = 36.5;
final double suhuFahrenheit = (suhuCelsius * 9 / 5) + 32;
final double suhuKelvin = suhuCelsius + 273.15;
print('Suhu Awal : $suhuCelsius °C');
print('Fahrenheit : $suhuFahrenheit °F');
print('Kelvin : $suhuKelvin K');
}
// Output:
// Suhu Awal : 36.5 °C
// Fahrenheit : 97.7 °F
// Kelvin : 309.65 K
Pembahasan: Nilai suhuCelsius sudah ditetapkan secara literal di dalam kode, sehingga aman dideklarasikan sebagai const. Hasil perhitungan suhuFahrenheit dan suhuKelvin disimpan ke dalam variabel final karena nilainya tidak akan diubah lagi setelah dihitung.
Latihan 3
void main() {
const String namaToko = 'Toko Buku Cendekia';
const double tarifPajak = 0.11;
int hargaBuku = 120000;
// Misalkan ada koreksi harga sebelum struk dicetak
hargaBuku = 115000;
final DateTime waktuCetak = DateTime.now();
final double totalBayar = hargaBuku + (hargaBuku * tarifPajak);
print('=== $namaToko ===');
print('Waktu Transaksi : $waktuCetak');
print('Harga Buku : Rp$hargaBuku');
print('PPN (11%) : Rp${hargaBuku * tarifPajak}');
print('Total Bayar : Rp$totalBayar');
}
// Output (waktuCetak menyesuaikan waktu eksekusi):
// === Toko Buku Cendekia ===
// Waktu Transaksi : 2026-10-25 14:40:05.112
// Harga Buku : Rp115000
// PPN (11%) : Rp12650.0
// Total Bayar : Rp127650.0
Pembahasan: namaToko dan tarifPajak menggunakan const karena nilainya tetap dan sudah diketahui saat kompilasi. hargaBuku dideklarasikan sebagai variabel biasa (int) karena skenario menyebutkan nilainya masih dapat direvisi. Sementara itu, waktuCetak dan totalBayar wajib menggunakan final karena bergantung pada nilai runtime (DateTime.now() dan variabel hargaBuku yang dapat berubah).
Discussion (0)
We store your optional name, your comment, and technical hashes (not your raw IP address) to prevent spam. A functional cookie lets you edit or delete your own comments from this browser. To request deletion, use the contact page.
No comments yet. Start the discussion.