Dart Language #
Dart adalah bahasa pemrograman yang menjadi fondasi seluruh ekosistem Flutter. Tanpa memahami Dart, kamu hanya akan menyalin kode tanpa benar-benar mengerti apa yang terjadi. Artikel ini adalah overview menyeluruh tentang Dart — dari sintaks dasar hingga fitur modern yang membuatnya istimewa.
Mengapa Perlu Belajar Dart? #
Dart bukan bahasa yang perlu ditakuti. Jika kamu sudah pernah menulis Java, Kotlin, JavaScript, atau C#, sebagian besar sintaks Dart akan terasa sangat familiar. Google merancang Dart agar mudah dipelajari oleh developer yang sudah punya pengalaman di bahasa-bahasa tersebut.
// Ini adalah program Dart pertamamu
void main() {
print('Halo, Dart!'); // Output: Halo, Dart!
}
Sesederhana itu. Tidak ada boilerplate yang berlebihan.
Variabel dan Tipe Data #
Dart adalah bahasa strongly typed — setiap variabel memiliki tipe yang jelas. Tapi Dart juga mendukung type inference, sehingga kamu tidak selalu harus menulis tipenya secara eksplisit.
Deklarasi Variabel #
// Explicit type
String nama = 'Budi';
int umur = 25;
double tinggi = 175.5;
bool aktif = true;
// Type inference dengan var (tipe diinfer otomatis)
var kota = 'Jakarta'; // String
var jumlah = 42; // int
var harga = 9999.99; // double
// final: nilai hanya bisa di-set sekali (runtime)
final DateTime sekarang = DateTime.now();
// const: nilai harus diketahui saat compile time
const double pi = 3.14159;
const String appName = 'MyApp';
Perbedaan var, final, dan const
#
| Keyword | Bisa diubah? | Waktu penetapan |
|---|---|---|
var | ✅ Ya | Runtime |
final | ❌ Tidak | Runtime |
const | ❌ Tidak | Compile time |
Tipe Data Bawaan #
// Numbers
int bilBulat = 100;
double bilDesimal = 3.14;
num bilApapun = 42; // bisa int atau double
// Strings
String nama = 'Flutter';
String pesan = "Halo $nama!"; // string interpolation
String multiline = '''
Ini adalah
teks multiline
''';
// Booleans
bool benar = true;
bool salah = false;
// Collections
List<String> buah = ['apel', 'mangga', 'jeruk'];
Set<int> angkaUnik = {1, 2, 3, 3}; // {1, 2, 3} — duplikat dihapus
Map<String, int> nilai = {
'matematika': 90,
'bahasa': 85,
};
Null Safety #
Null Safety adalah salah satu fitur terpenting Dart modern (stabil sejak Dart 2.12). Dengan Null Safety, compiler Dart memastikan bahwa variabel tidak bisa bernilai null kecuali kamu secara eksplisit mengizinkannya.
// NON-NULLABLE (default) — tidak bisa null
String nama = 'Budi';
nama = null; // ERROR saat compile time!
// NULLABLE — tambahkan ? untuk mengizinkan null
String? nama2 = 'Budi';
nama2 = null; // OK
// Null-aware operators
String? input = null;
// ?? — gunakan nilai default jika null
String hasil = input ?? 'Tidak ada input';
// ?. — akses property hanya jika tidak null
int? panjang = input?.length;
// ! — assert tidak null (hati-hati: bisa throw error)
String pasti = input!; // pastikan input tidak null sebelum ini
Hindari penggunaan!(null assertion operator) secara berlebihan. Jika kamu terlalu sering menggunakan!, itu tanda bahwa kamu belum menangani null dengan benar. Gunakan??,?., atau conditional check sebagai gantinya.
Fungsi #
Fungsi di Dart adalah first-class citizen — bisa disimpan dalam variabel, dikirim sebagai parameter, dan dikembalikan dari fungsi lain.
Deklarasi Fungsi #
// Fungsi biasa
int tambah(int a, int b) {
return a + b;
}
// Arrow function (untuk ekspresi tunggal)
int kali(int a, int b) => a * b;
// Fungsi tanpa nilai kembalian
void sapa(String nama) {
print('Halo, $nama!');
}
// Fungsi sebagai variabel
var hitung = (int x) => x * x;
print(hitung(5)); // 25
Parameter Opsional #
// Named parameters (direkomendasikan untuk Flutter)
void buatWidget({
required String judul, // wajib diisi
String? subjudul, // opsional, nullable
int padding = 16, // opsional, ada nilai default
}) {
// ...
}
// Pemanggilan dengan named parameters
buatWidget(
judul: 'Halo Flutter',
padding: 24,
);
// Positional optional parameters
void tampilkan(String pesan, [String? pengirim]) {
print('${pengirim ?? 'Anonim'}: $pesan');
}
Named parameters sangat umum di Flutter. Hampir semua widget Flutter menggunakan named parameters — itulah mengapa kamu sering melihat sintaks seperti Text('Halo', style: TextStyle(fontSize: 16)).OOP di Dart #
Dart adalah bahasa berorientasi objek penuh. Semua nilai di Dart adalah objek — bahkan int dan bool.
Class dan Constructor #
class Pengguna {
// Properties
final String nama;
final String email;
int umur;
// Constructor
Pengguna({
required this.nama,
required this.email,
this.umur = 0,
});
// Named constructor
Pengguna.tamu()
: nama = 'Tamu',
email = '[email protected]',
umur = 0;
// Method
void perkenalkan() {
print('Nama saya $nama, email: $email');
}
// Getter
String get info => '$nama ($email)';
// toString override
@override
String toString() => 'Pengguna($nama, $email)';
}
// Penggunaan
void main() {
final user = Pengguna(nama: 'Budi', email: '[email protected]', umur: 25);
user.perkenalkan();
final tamu = Pengguna.tamu();
print(tamu.info);
}
Inheritance dan Interface #
// Base class
abstract class Hewan {
String nama;
Hewan(this.nama);
// Abstract method — harus diimplementasi di subclass
void bersuara();
// Concrete method — bisa dioverride
void makan() => print('$nama sedang makan');
}
// Inheritance
class Kucing extends Hewan {
Kucing(super.nama);
@override
void bersuara() => print('$nama: Meow!');
}
class Anjing extends Hewan {
Anjing(super.nama);
@override
void bersuara() => print('$nama: Guk guk!');
}
// Polymorphism
void main() {
List<Hewan> hewan = [Kucing('Mimi'), Anjing('Rex')];
for (var h in hewan) {
h.bersuara();
}
}
Mixin — Komposisi Tanpa Inheritance #
// Mixin untuk menambahkan kemampuan tanpa inheritance
mixin BisaTerbang {
void terbang() => print('$this sedang terbang!');
}
mixin BisaBerenanng {
void berenang() => print('$this sedang berenang!');
}
class Bebek extends Hewan with BisaTerbang, BisaBerenanng {
Bebek(super.nama);
@override
void bersuara() => print('$nama: Kwek kwek!');
}
void main() {
final bebek = Bebek('Donald');
bebek.bersuara();
bebek.terbang();
bebek.berenang();
}
Collections dan Functional Operations #
Dart memiliki dukungan kuat untuk operasi fungsional pada collections:
void main() {
final angka = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// map — transformasi setiap elemen
final kuadrat = angka.map((n) => n * n).toList();
// [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
// where — filter elemen
final genap = angka.where((n) => n % 2 == 0).toList();
// [2, 4, 6, 8, 10]
// reduce — agregasi
final total = angka.reduce((sum, n) => sum + n);
// 55
// any dan every
bool adaYangBesar = angka.any((n) => n > 8); // true
bool semuaPositif = angka.every((n) => n > 0); // true
// Collection if dan for (sangat berguna di Flutter!)
bool tampilkanBonus = true;
final menu = [
'Home',
'Profile',
if (tampilkanBonus) 'Bonus', // conditional
for (var i = 1; i <= 3; i++) 'Item $i', // loop
];
// ['Home', 'Profile', 'Bonus', 'Item 1', 'Item 2', 'Item 3']
}
Fitur Modern Dart 3.x #
Records — Tipe Tuple #
// Records: mengembalikan beberapa nilai sekaligus
(String, int) getDimensi() {
return ('layar', 1080);
}
// Named records
({String nama, int umur}) getPengguna() {
return (nama: 'Budi', umur: 25);
}
void main() {
final (label, nilai) = getDimensi(); // destructuring
print('$label: $nilai');
final pengguna = getPengguna();
print(pengguna.nama); // Budi
}
Pattern Matching #
void proses(Object data) {
switch (data) {
case int n when n > 0:
print('Bilangan positif: $n');
case String s when s.isNotEmpty:
print('String tidak kosong: $s');
case [int a, int b]:
print('List dua integer: $a dan $b');
case _:
print('Tipe tidak dikenal');
}
}
Extension Methods #
// Tambahkan method ke tipe yang sudah ada
extension StringHelper on String {
String capitalize() {
if (isEmpty) return this;
return '${this[0].toUpperCase()}${substring(1)}';
}
bool get isPalindrome => this == split('').reversed.join();
}
void main() {
print('flutter'.capitalize()); // Flutter
print('kasak'.isPalindrome); // true — wait, 'katak' :)
print('katak'.isPalindrome); // true
}
Dart vs Bahasa Lain: Perbandingan Cepat #
| Fitur | Dart | Kotlin | Swift | JavaScript |
|---|---|---|---|---|
| Null Safety | ✅ Sound | ✅ Sound | ✅ Sound | ❌ Tidak ada |
| Type Inference | ✅ Ya | ✅ Ya | ✅ Ya | ⚠️ Lemah |
| AOT + JIT | ✅ Keduanya | ⚠️ JVM only | ✅ Keduanya | ❌ JIT only |
| Async/Await | ✅ Ya | ✅ Ya | ✅ Ya | ✅ Ya |
| Records/Tuples | ✅ Dart 3+ | ✅ Ya | ✅ Ya | ⚠️ Terbatas |
| Pattern Matching | ✅ Dart 3+ | ✅ Ya | ✅ Ya | ⚠️ Terbatas |
| Extension Methods | ✅ Ya | ✅ Ya | ✅ Ya | ❌ Tidak ada |
| Mixin | ✅ Ya | ⚠️ Interface | ✅ Protocol | ❌ Tidak ada |
Ringkasan #
- Dart adalah bahasa strongly typed dengan type inference — kamu bisa menulis tipe secara eksplisit atau biarkan compiler yang menyimpulkannya.
- Null Safety di Dart bersifat sound — compiler menjamin tidak ada null reference yang lolos tanpa pengecekan.
- Fungsi di Dart adalah first-class citizen — bisa disimpan dalam variabel dan dikirim sebagai argumen.
- Named parameters adalah pola yang sangat umum di Flutter — penting untuk dipahami sejak awal.
- Dart mendukung OOP penuh: class, inheritance, abstract class, interface, dan mixin untuk komposisi fleksibel.
- Dart 3.x membawa Records, Pattern Matching, dan Extension Types yang membuat kode lebih ekspresif dan aman.
- Kurva belajar Dart sangat landai — dalam 1–2 hari kamu sudah bisa menulis kode Dart yang produktif.
← Sebelumnya: UI Framework Berikutnya: Engine, Framework & Embedder →