Pemrograman · Bahasa pemrograman
Tutorial Dart untuk pemula
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 projectAnda 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
}| Tipe | Contoh | Catatan |
|---|---|---|
int | 42 | bilangan bulat; 64-bit di platform native |
double | 3.14 | bilangan floating point 64-bit |
num | 7 or 7.5 | supertipe dari int dan double |
bool | true | hanya true dan false yang boleh dipakai dalam kondisi |
String | 'hi' | UTF-16; mendukung interpolasi $x dan ${expr} |
dynamic | apa saja | mematikan 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 abcProgram 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.50Langkah 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.