Import & Membuat Library
Mengorganisir kode: import, export, part, dan struktur project.
Merapikan kode antar file
Program kecil muat dalam satu file. Program besar tidak. Import menghubungkan file, library mengelompokkan kode terkait, dan struktur folder standar membuat proyek bisa dinavigasi siapa saja.
Analogi: import itu seperti pintu antar ruangan. Tiap ruangan (file) punya fungsi sendiri, pintu memungkinkan penghuni lewat tanpa merobohkan tembok.
Kenapa organisasi kode penting?
Karena kode dibaca 10x lebih sering daripada ditulis. File 2000 baris adalah labirin; 20 file 100 baris dengan nama jelas adalah peta. Organisasi yang baik membuat bug mudah dilacak dan fitur mudah ditambah.
Jenis-jenis import
import 'dart:math'; // library bawaan SDK
import 'dart:convert'; // JSON, utf8, base64
import 'package:http/http.dart'; // package pub.dev
import 'model/user.dart'; // file relatif (satu proyek)
import 'model/user.dart' as model; // prefix: cegah tabrakan nama
import 'model/user.dart' show User; // hanya impor User
import 'model/user.dart' hide Admin; // impor semua KECUALI Admindart:: library inti SDK, selalu tersedia.package:: package pub.dev atau file dalamlib/proyek sendiri.- Relatif (
'model/user.dart'): file dalam proyek yang sama. as: prefix agarmodel.Usertidak bentrok denganUserlain.show/hide: batasi apa yang masuk, kurangi polusi namespace.
Contoh kedua, prefix menyelesaikan tabrakan nyata:
import 'gudang_a.dart';
import 'gudang_b.dart' as b;
void main() {
var a1 = Produk(); // dari gudang_a
var b1 = b.Produk(); // dari gudang_b, dibedakan prefix
print('${a1.runtimeType} vs ${b1.runtimeType}');
}Membuat library sendiri
// File: matematika.dart
library matematika;
int tambah(int a, int b) => a + b;
int kurang(int a, int b) => a - b;
const double phi = 3.14;// File: main.dart
import 'matematika.dart' as m;
void main() {
print(m.tambah(2, 3)); // 5
print(m.phi); // 3.14
}Kata kunci library memberi nama pada file sebagai satu kesatuan. Untuk library besar multi-file, ada part/part of, tapi pola modern lebih suka file-file kecil yang saling import.
Struktur proyek standar
belajarku/
pubspec.yaml
lib/
main.dart
model/
user.dart
produk.dart
service/
api.dart
test/
user_test.dart
bin/
belajarku.dart
lib/: kode library, diimpor viapackage:belajarku/model/user.dart.bin/: entry point CLI (dart run bin/belajarku.dart).test/: unit test (dijalankandart test).
Import antar file dalam lib/ sebaiknya pakai package: agar tidak rusak saat file dipindah:
// Di lib/service/api.dart:
import 'package:belajarku/model/user.dart';Kesalahan umum
1. Import cycle
// a.dart: import 'b.dart';
// b.dart: import 'a.dart'; // ERROR: siklus!Dart menolak siklus import. Solusi: gabungkan kedua file, atau pindahkan bagian bersama ke file ketiga c.dart yang diimpor keduanya.
2. Import relatif keluar dari lib/
Pakai package: untuk file di lib/, relatif hanya untuk file yang berdekatan. Import seperti ../../lib/x.dart rapuh dan ditolak linter pada proyek package.
3. Lupa library name menyebabkan warning
File tanpa deklarasi library tetap jalan, tapi untuk package yang dipublikasikan, nama library membantu dokumentasi. Untuk proyek belajar, tidak wajib.
Kesimpulan
Organisir sejak dini: satu file satu tanggung jawab, import eksplisit (dart:, package:, relatif), struktur folder standar (lib/, bin/, test/). Kode rapi hari ini = debugging mudah bulan depan.
Catatan teknis: Dart mengevaluasi library secara malas (lazy): library yang diimpor tapi tidak dipakai tidak menunda startup secara signifikan. Namun import yang tidak dipakai tetap memicu warning linter, bersihkan dengan
dart fix.
Tantangan
Library geometri mini
Buat file geometri.dart berisi fungsi luasPersegi, kelilingPersegi, dan konstanta namaLib = 'GeometriKu'. Di main.dart, import dengan prefix g dan pakai semuanya.
// File geometri.dart:
// TODO
// File main.dart:
// TODO: import 'geometri.dart' as g; pakai semuanya