dartimportlibraryMahir4 mnt baca

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

dart
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 Admin
  • dart:: library inti SDK, selalu tersedia.
  • package:: package pub.dev atau file dalam lib/ proyek sendiri.
  • Relatif ('model/user.dart'): file dalam proyek yang sama.
  • as: prefix agar model.User tidak bentrok dengan User lain.
  • show/hide: batasi apa yang masuk, kurangi polusi namespace.

Contoh kedua, prefix menyelesaikan tabrakan nyata:

dart
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

dart
// 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;
dart
// 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 via package:belajarku/model/user.dart.
  • bin/: entry point CLI (dart run bin/belajarku.dart).
  • test/: unit test (dijalankan dart test).

Import antar file dalam lib/ sebaiknya pakai package: agar tidak rusak saat file dipindah:

dart
// Di lib/service/api.dart:
import 'package:belajarku/model/user.dart';

Kesalahan umum

1. Import cycle

dart
// 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.

text
// File geometri.dart:
// TODO

// File main.dart:
// TODO: import 'geometri.dart' as g; pakai semuanya