cv.cm

Pemrograman · Bahasa pemrograman

Tutorial Dart untuk pemula

7 menit baca

Jawaban singkat

Dart adalah bahasa berorientasi objek bertipe statis dari Google, paling dikenal sebagai bahasa framework aplikasi Flutter. Dart punya sound null safety, dikompilasi ke kode native maupun ke JavaScript atau WebAssembly, dan mendukung hot reload yang cepat saat pengembangan. Halaman ini membahas setup, tipe, null safety, alur kontrol, fungsi, koleksi, class, kode async, dan penanganan error.

Apa itu Dart dan untuk apa digunakan

Dart adalah bahasa pemrograman yang dioptimalkan untuk klien, dikembangkan oleh Google. Dart bertipe statis dengan type inference, punya sound null safety, dan dikompilasi ke kode mesin native (untuk mobile, desktop, dan server) maupun ke JavaScript atau WebAssembly (untuk web). Saat pengembangan, Dart berjalan di virtual machine dengan hot reload, sehingga perubahan muncul di aplikasi yang sedang berjalan dalam hitungan detik.

Kebanyakan orang belajar Dart untuk membuat aplikasi dengan Flutter, UI toolkit dari Google untuk Android, iOS, web, Windows, macOS, dan Linux dari satu codebase. Dart juga dipakai untuk tool command line dan layanan backend.

Instal Dart dan jalankan Hello, world

Instal Dart SDK dari dart.dev (atau instal Flutter, yang sudah menyertakan Dart). Setiap program Dart dimulai dari fungsi main tingkat atas.

// hello.dart
void main() {
  print('Hello, world!');
}
dart run hello.dart
# Hello, world!
dart compile exe hello.dart   # builds a native executable
dart create my_app            # creates a new console project

Anda juga bisa mencoba semua contoh di halaman ini di DartPad, editor berbasis browser di dartpad.dev.

Variabel dan tipe dasar

Gunakan var agar compiler menebak tipenya, final untuk variabel yang diisi sekali, dan const untuk konstanta saat kompilasi. Anda selalu bisa menuliskan tipenya secara eksplisit.

void main() {
  var name = 'Dart';        // inferred as String
  int year = 2011;          // explicit type
  final now = DateTime.now(); // set once, at run time
  const pi = 3.14159;       // compile-time constant
  double ratio = 2;         // int literal becomes 2.0
  bool ok = year > 2000;
  print('$name since $year, pi=${pi.toStringAsFixed(2)}, ok=$ok, ratio=$ratio');
  // Dart since 2011, pi=3.14, ok=true, ratio=2.0
  print(now.year > 2000);   // true
}
TipeContohCatatan
int42bilangan bulat; 64-bit di platform native
double3.14bilangan floating point 64-bit
num7 or 7.5supertipe dari int dan double
booltruehanya true dan false yang boleh dipakai dalam kondisi
String'hi'UTF-16; mendukung interpolasi $x dan ${expr}
dynamicapa sajamematikan pengecekan statis; hindari di sebagian besar kode

Di web, nilai int direpresentasikan sebagai angka JavaScript, sehingga bilangan bulat yang sangat besar bisa kehilangan presisi di sana.

Sound null safety

Sejak Dart 3, semua kode Dart memakai sound null safety. Variabel bertipe String tidak pernah bisa null; untuk mengizinkan null, tulis String?. Compiler memeriksa setiap penggunaan, sehingga error null tertangkap sebelum program berjalan.

int lengthOf(String? s) {
  // return s.length;         // compile error: s might be null
  if (s == null) return 0;
  return s.length;            // promoted to String after the check
}
void main() {
  String? nickname;
  print(nickname?.length);    // null (null-aware access)
  print(nickname ?? 'guest'); // guest (default if null)
  nickname ??= 'dee';         // assign only if null
  print(lengthOf(nickname));  // 3
  late String config;         // initialized later, checked at run time
  config = 'loaded';
  print(config);              // loaded
}

Alur kontrol

Dart punya if, for, while, dan do-while seperti biasa, ditambah loop for-in untuk iterable apa pun. Sejak Dart 3, switch mendukung pattern matching dan bisa dipakai sebagai ekspresi.

void main() {
  var scores = [72, 95, 48];
  for (var s in scores) {
    if (s >= 90) {
      print('$s excellent');
    } else if (s >= 50) {
      print('$s pass');
    } else {
      print('$s fail');
    }
  }
  for (var i = 0; i < 3; i++) {
    print('i = $i');
  }
  var day = 6;
  var kind = switch (day) {
    6 || 7 => 'weekend',
    >= 1 && <= 5 => 'weekday',
    _ => 'invalid',
  };
  print(kind); // weekend
}

Fungsi

Fungsi adalah objek kelas satu (first-class). Parameter bisa positional, positional opsional dalam [], atau named dalam {}. Named parameter bersifat opsional kecuali ditandai required. Sintaks panah => adalah singkatan untuk fungsi yang mengembalikan satu ekspresi.

int add(int a, int b) => a + b;
String greet(String name, {String greeting = 'Hello', required bool loud}) {
  var text = '$greeting, $name';
  return loud ? text.toUpperCase() : text;
}
String label(String text, [int? width]) =>
    width == null ? text : text.padRight(width, '.');
void main() {
  print(add(2, 3));                              // 5
  print(greet('Ana', loud: false));              // Hello, Ana
  print(greet('Ana', greeting: 'Hi', loud: true)); // HI, ANA
  print(label('id', 5));                         // id...
  var twice = (int x) => x * 2;                  // anonymous function
  print([1, 2, 3].map(twice).toList());          // [2, 4, 6]
}

Koleksi: List, Set, Map, dan record

Koleksi inti adalah List (berurutan), Set (item unik), dan Map (pasangan key-value). Literal koleksi mendukung if, for, dan operator spread .... Record, yang ditambahkan di Dart 3, mengelompokkan beberapa nilai tanpa mendeklarasikan class.

void main() {
  var nums = [3, 1, 2];               // List<int>
  nums.add(4);
  nums.sort();
  print(nums);                        // [1, 2, 3, 4]
  var tags = {'dart', 'flutter', 'dart'};
  print(tags.length);                 // 2
  var ages = {'Ann': 31, 'Bo': 25};   // Map<String, int>
  ages['Cy'] = 40;
  print(ages['Bo']);                  // 25
  var showAll = false;
  var menu = ['Home', if (showAll) 'Admin', for (var n in nums) 'Item $n'];
  print(menu);  // [Home, Item 1, Item 2, Item 3, Item 4]
  (String, int) pair = ('Ann', 31);   // a record
  var (who, age) = pair;              // destructuring
  print('$who is $age');              // Ann is 31
}

Class dan async/await

Dart berorientasi objek: setiap nilai adalah objek. Class mendukung konstruktor dengan initializing formal (this.x), named constructor, getter, mixin, dan interface. Kode asinkron memakai Future dan Stream dengan async dan await, yang menjaga aplikasi Flutter tetap responsif saat menunggu file atau jaringan.

class Point {
  final double x, y;
  const Point(this.x, this.y);
  Point.origin() : x = 0, y = 0;     // named constructor
  double get sum => x + y;           // getter
  @override
  String toString() => 'Point($x, $y)';
}
Future<String> fetchUser() async {
  await Future.delayed(Duration(milliseconds: 100));
  return 'ana';
}
Future<void> main() async {
  print(Point(1, 2).sum);            // 3.0
  print(Point.origin());             // Point(0.0, 0.0)
  var user = await fetchUser();
  print('user: $user');              // user: ana
}

Penanganan error

Lempar exception dengan throw dan tangani dengan try, on, catch, dan finally. Gunakan on SomeType untuk menangkap tipe tertentu. Dart membedakan Exception (masalah yang diperkirakan dan bisa ditangani program) dari Error (bug, seperti assertion yang gagal atau range error) yang biasanya tidak perlu ditangkap.

int parseAge(String s) {
  var n = int.tryParse(s);            // null instead of throwing
  if (n == null || n < 0) {
    throw FormatException('Not a valid age: $s');
  }
  return n;
}
void main() {
  for (var input in ['42', 'abc']) {
    try {
      print(parseAge(input));
    } on FormatException catch (e) {
      print('Error: ${e.message}');
    } finally {
      print('checked $input');
    }
  }
}
// 42 / checked 42 / Error: Not a valid age: abc / checked abc

Program lengkap kecil: total keranjang belanja

Program ini memodelkan produk dengan class, menyimpan keranjang dalam map, dan mencetak struk. Program ini memadukan class, map, pemformatan string, dan method koleksi.

class Product {
  final String name;
  final double price;
  const Product(this.name, this.price);
}
void main() {
  const apple = Product('Apple', 0.5);
  const bread = Product('Bread', 2.25);
  final cart = <Product, int>{apple: 6, bread: 2};
  var total = 0.0;
  cart.forEach((product, qty) {
    final line = product.price * qty;
    total += line;
    print('${product.name.padRight(6)} x$qty  ${line.toStringAsFixed(2)}');
  });
  final count = cart.values.reduce((a, b) => a + b);
  print('$count items, total ${total.toStringAsFixed(2)}');
}
// Apple  x6  3.00
// Bread  x2  4.50
// 8 items, total 7.50

Langkah selanjutnya

  • Language tour dan tutorial Dart di dart.dev.
  • Effective Dart, panduan gaya dan desain resmi.
  • Dokumentasi Flutter di flutter.dev jika Anda ingin membuat aplikasi.
  • pub.dev, repositori package untuk Dart dan Flutter.

FAQ

Apakah Dart hanya untuk Flutter?

Tidak. Dart adalah bahasa serbaguna dan bisa dipakai untuk membuat tool command line, server, dan aplikasi web. Flutter hanyalah alasan paling populer untuk mempelajarinya.

Apakah Dart dikompilasi atau diinterpretasi?

Keduanya ada. Saat pengembangan Dart berjalan di VM dengan kompilasi just-in-time dan hot reload; untuk rilis, Dart dikompilasi ahead-of-time ke kode mesin native, atau ke JavaScript atau WebAssembly untuk web.

Apa perbedaan final dan const di Dart?

Variabel final diisi sekali, mungkin saat runtime. Nilai const harus diketahui saat kompilasi dan bersifat immutable secara mendalam, sehingga Flutter bisa memakai ulang widget konstan.

Apakah Dart mirip Java atau JavaScript?

Sintaks bergaya C dan class-nya terasa familier bagi developer Java, C#, dan JavaScript. Berbeda dari JavaScript, Dart bertipe statis dan punya sound null safety.

Apa fungsi operator ?? di Dart?

a ?? b mengembalikan a jika tidak null, dan jika tidak mengembalikan b. Operator terkait a ??= b mengisi a dengan b hanya ketika a null.

Semua tutorial pemrograman