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 #

KeywordBisa diubah?Waktu penetapan
var✅ YaRuntime
final❌ TidakRuntime
const❌ TidakCompile 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 #

FiturDartKotlinSwiftJavaScript
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 →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact