Back to IF3210 Pengembangan Aplikasi Piranti Bergerak
Dart Language Fundamentals - Types, Variables, and Functions
Questions/Cues
- Apa perbedaan antara
var,final, danconstdalam deklarasi variabel?- Bagaimana Dart mendukung dua mode kompilasi (JIT dan AOT)?
- Mengapa tipe dasar seperti
intdanStringdianggap sebagai objek di Dart?- Apa kegunaan named parameters dan kapan menggunakan kata kunci
required?- Bagaimana Dart menangani multiple return values dan anonymous functions?
Reference Points
- IF3210 Pengembangan Aplikasi Piranti Bergerak (Slides 13a: 3-21)
Evolusi dan Fitur Utama Dart
Dart adalah bahasa pemrograman yang dikembangkan oleh Google, pertama kali dirilis sebagai Dart 1.0 pada November 2013 sebagai alternatif JavaScript untuk web. Evolusinya berlanjut ke Dart 2.0 (Agustus 2018) yang memperkenalkan strong typing, null safety, dan dukungan penuh untuk Flutter, kemudian mencapai Dart 3.0 (Mei 2023) di mana null safety menjadi perilaku bawaan tanpa bisa dinonaktifkan.
Dart dirancang sebagai bahasa platform-independent dengan sejumlah fitur unggulan: dukungan garbage collection untuk manajemen memori otomatis, fungsi sebagai first-class citizens (dapat disimpan dalam variabel dan diteruskan sebagai argumen), sound null safety yang menjamin variabel tidak bisa bernilai
nullkecuali dideklarasikan eksplisit, OOP penuh dengan enkapsulasi/pewarisan/polimorfisme, pemrograman asinkron viaasync/awaitdanIsolates, serta FFI (Foreign Function Interface) untuk berinteraksi dengan kode native C.Mode Kompilasi Dart: JIT dan AOT
Dart mendukung dua mode kompilasi yang melayani kebutuhan berbeda:
flowchart TD A["Kode Dart"] --> B{"Mode?"} B -->|"Development"| C["JIT</br>(Just-In-Time)"] B -->|"Production"| D["AOT</br>(Ahead-Of-Time)"] C --> E["Dart VM</br>(bytecode dieksekusi</br>langsung)"] D --> F["Native Code</br>(binary spesifik</br>platform)"] E --> G["Hot Reload</br>(perubahan kode</br>langsung terlihat)"] F --> H["Performa Tinggi</br>(startup cepat,</br>tanpa VM overhead)"]JIT (Just-In-Time) digunakan saat pengembangan: kode dikompilasi saat dijalankan oleh Dart VM, memungkinkan fitur hot reload yang sangat produktif — perubahan kode langsung terlihat tanpa restart aplikasi. AOT (Ahead-Of-Time) digunakan untuk produksi: kode dikompilasi penuh ke native code sebelum dijalankan, menghasilkan performa startup yang cepat dan konsumsi memori yang lebih efisien.
Variabel: var, final, dan const
Dart menyediakan tiga cara utama mendeklarasikan variabel, masing-masing dengan semantik yang berbeda:
var— variabel biasa dengan type inference; tipe disimpulkan dari nilai awal dan tidak bisa berubah, tetapi nilainya bisa diubah kapan saja. Contoh:var name = 'Dart';membuat variabel bertipeString.final— variabel yang hanya bisa diassign satu kali (single assignment). Nilai dievaluasi saat runtime. Setelah diassign, variabel tidak bisa menunjuk ke objek lain, tetapi isi objek tersebut masih bisa berubah.const— konstanta compile-time: nilai harus diketahui saat kompilasi. Tidak hanya referensinya yang tetap, tetapi seluruh objek bersifat deeply immutable dan di-canonicalize (hanya satu salinan di memori untuk nilai yang sama).Tipe Bawaan Dart
Dart memperlakukan semua nilai sebagai objek, termasuk tipe primitif. Tipe-tipe dasar meliputi:
Tipe Keterangan Contoh boolNilai benar/salah, immutable true,falseintBilangan bulat 42,-7doubleBilangan desimal 3.14numSupertype dari intdandoublenum x = 1;StringTeks Unicode, immutable 'Halo',"Dunia"ListKoleksi terurut (array) [1, 2, 3]SetKoleksi unik tak terurut {1, 2, 3}MapPasangan kunci-nilai {'a': 1}FunctionFungsi sebagai objek () => print('hi')Karena
bool,int,double, danStringbersifat immutable, setiap operasi seperti penggabungan string atau aritmatika menghasilkan objek baru, bukan memodifikasi yang lama. Meski demikian, tipe-tipe ini tetap memiliki methods dan dapat diperlakukan layaknya objek biasa.Manajemen Memori dan Garbage Collection
Dart menggunakan garbage collection (GC) untuk manajemen memori otomatis. Objek dialokasikan di heap dan GC secara periodik menelusuri referensi aktif — objek yang tidak lagi dapat dijangkau dari referensi manapun (unreachable) akan dibebaskan memorinya. Pengembang tidak perlu memanggil
free()ataudelete()secara manual. Pemahaman ini penting untuk menghindari memory leak: selama ada referensi aktif ke suatu objek (misalnya callback yang tersimpan), GC tidak akan membebaskannya.Fungsi: Parameter, Default, dan Named
Fungsi di Dart mendukung berbagai pola parameter:
- Parameter posisional wajib: dideklarasikan langsung dalam tanda kurung.
- Parameter posisional opsional: dibungkus
[], dapat diberi nilai default.- Named parameters: dibungkus
{}, dipanggil dengan nama eksplisit. Gunakan kata kuncirequireduntuk mewajibkannya.Dart juga mendukung generics pada fungsi, memungkinkan fungsi bekerja dengan berbagai tipe secara type-safe. Contoh:
T first<T>(List<T> list) => list[0];.Multiple return values dicapai menggunakan records — tipe literal
(Type1, Type2). Contoh:(String, int) getInfo() => ('Dart', 3);. Nilai dikembalikan sebagai tuple dan bisa didestrukturisasi:var (lang, version) = getInfo();.Arrow function
=>adalah sintaks ringkas untuk fungsi satu ekspresi:int kuadrat(int x) => x * x;setara dengan fungsi berblok yang mengembalikanx * x.Anonymous Functions dan Closures
Anonymous function (lambda) adalah fungsi tanpa nama yang sering digunakan sebagai argumen. Contoh umum:
list.forEach((item) { print(item); });atau denganmap:list.map((x) => x * 2).toList().Closure adalah fungsi yang menangkap variabel dari lexical scope di mana ia didefinisikan — bukan dari scope pemanggil. Dart menangani bad closure in loops dengan benar: setiap iterasi loop
formendapatkan salinan variabeli-nya sendiri, sehingga closure yang dibuat di dalam loop masing-masing menangkap nilaiiyang berbeda. Perilaku ini berbeda dari JavaScript (pre-let) yang sering menyebabkan bug di mana semua closure berbagi referensi variabel yang sama.
Dart berevolusi dari alternatif JavaScript (2013) menjadi bahasa modern dengan sound null safety bawaan (2023), mendukung JIT untuk hot reload saat development dan AOT untuk native code performa tinggi di produksi. Deklarasi variabel memiliki tiga tingkat:
var(mutable dengan type inference),final(single assignment, dievaluasi runtime), danconst(compile-time constant, deeply immutable). Semua tipe dasar (bool,int,String, dll.) adalah objek immutable yang dikelola oleh garbage collector. Fungsi mendukung named parameters denganrequired, multiple return values via records(Type1, Type2), dan arrow functions=>. Anonymous functions dan closures memungkinkan gaya pemrograman fungsional, dengan Dart secara aman menangkap salinan variabel loop untuk menghindari bug bad closure.
Additional Information
Dart di Luar Flutter
Meskipun Dart paling dikenal sebagai bahasa Flutter, Dart juga dapat digunakan untuk server-side programming via Dart on the server (framework seperti Shelf atau Dart Frog), command-line tools, dan kompilasi ke JavaScript untuk aplikasi web. Ekosistem Dart dikelola melalui pub.dev, repositori paket resmi Dart/Flutter.
Sound Null Safety: Dampak Kompiler
Dengan sound null safety, kompiler Dart dapat melakukan optimasi flow analysis: setelah sebuah variabel nullable diperiksa
!= null, kompiler secara otomatis mempromosikannya ke tipe non-nullable dalam blok kode berikutnya tanpa cast manual. Ini disebut type promotion dan sangat mengurangi kode boilerplate.Perbedaan List vs Array
Listdi Dart secara konseptual setara dengan array dinamis di bahasa lain. Dart tidak memiliki tipe array tetap seperti di Java (int[]). Untuk performa maksimum dengan data numerik, gunakanUint8Listatau tipe lain daridart:typed_datayang menggunakan memori contigous.Proyek Eksplorasi Mandiri
- Buat program Dart yang mendemonstrasikan perbedaan
var,final, danconst— coba modifikasi setiap jenis dan amati error kompiler- Tulis fungsi dengan named parameters, optional positional parameters, dan records sebagai return value, lalu panggil dari fungsi
main()- Implementasikan contoh closure dalam loop dan bandingkan perilakunya dengan JavaScript menggunakan
var(gunakan DartPad di dartpad.dev)Bacaan Lanjutan
- Dokumentasi Resmi Dart: “Language Tour” (dart.dev/language)
- Dart: “Sound null safety” (dart.dev/null-safety)
- DartPad (dartpad.dev) untuk eksperimen interaktif
- “Flutter & Dart: The Complete Guide” — Bab Dart Fundamentals