Pustaka Libraries

Setiap berkas Dart secara otomatis merupakan sebuah pustaka, meskipun tidak menulis arahan library;

Aturan privasi: Pengidentifikasi yang diawali garis bawah _ bersifat privat pustaka, hanya dapat dilihat di dalam pustaka yang sama, tidak dapat diakses lintas berkas/pustaka;

Tidak ada kata kunci public/protected/private; izin akses hanya dibedakan dengan garis bawah;

Pustaka dapat dikemas menjadi package dan dikelola melalui pub;

Kelebihan: Mendukung Tree Shaking untuk menghapus kode mati yang tidak terpakai.

import

Gunakan kata kunci import untuk mengimpor pustaka lain.

import digunakan untuk memuat API dari pustaka lain

Tiga jenis URI:

  1. dart:xxx: Pustaka standar bawaan Dart (dart:core, dart:async, dart:js_interop)
  2. package:xxx: Pustaka pihak ketiga yang dikelola pub
  3. Jalur berkas relatif: Berkas .dart buatan lokal
// Pustaka standar bawaan
import 'dart:js_interop';
import 'dart:math';

// Paket pihak ketiga
import 'package:test/test.dart';

// Pustaka berkas lokal
import './utils.dart';Code language: JavaScript (javascript)

Alias pustaka as

Jika dua pustaka memiliki kelas/fungsi dengan nama yang sama, gunakan as alias untuk memisahkan dan menghindari konflik nama.

Contoh

Di berkas lib1.dart

class Element {}Code language: JavaScript (javascript)

lib2.dart memiliki kelas dengan nama sama

class Element {}Code language: JavaScript (javascript)

Berkas utama main.dart

// Impor langsung, namespace bawaan
import 'lib1.dart';
// Tetapkan alias lib2
import 'lib2.dart' as lib2;

void main() {
  Element e1 = Element(); // Element milik lib1
  lib2.Element e2 = lib2.Element(); // Element milik lib2
}Code language: JavaScript (javascript)

Untuk menghindari kebingungan, kita berikan alias lib2 pada lib2.dart, lalu tambahkan awalan alias saat mengakses kelas di dalamnya.

Impor selektif show / hide

show: Hanya impor nama yang ditentukan, semuanya yang lain disembunyikan

// Hanya impor foo, variabel/kelas lain tidak dapat digunakan
import 'lib1.dart' show foo;

void main() {
  foo();
  // bar(); // Error, tidak diimpor lewat show, tidak dapat diakses
}Code language: JavaScript (javascript)

hide: Impor semuanya, kecuali nama yang ditentukan

// Impor semua, hanya blokir foo
import 'lib2.dart' hide foo;

void main() {
  bar();
  // foo(); // Error, disembunyikan oleh hide
}Code language: JavaScript (javascript)

Pemuatan tertunda deferred as

Hanya berfungsi pada platform Web

  • Mengurangi ukuran muat awal halaman web;
  • Digunakan untuk popup jarang dipakai, halaman opsional;
  • Mengunduh potongan kode secara dinamis sesuai kebutuhan.
  1. Sintaks impor: import jalur deferred as namespace
  2. Panggil namespace.loadLibrary() yang mengembalikan Future, gunakan await untuk menunggu proses muat selesai
  3. Pemanggilan berulang loadLibrary() untuk pustaka yang sama hanya akan memuat satu kali
  4. Batasan: Konstanta dan tipe data di dalam pustaka tertunda tidak dapat digunakan langsung sebelum dimuat

Contoh lengkap

hello.dart (pustaka pemuatan tertunda)

void printGreeting() {
  print("Hello from deferred library wellcome to foxdevelop.com");
}
Code language: JavaScript (javascript)

main.dart

// Impor tertunda, alias hello
import 'hello.dart' deferred as hello;

Future<void> greet() async {
  // Muat pustaka secara dinamis
  await hello.loadLibrary();
  // Hanya setelah muat selesai dapat memanggil metode internal
  hello.printGreeting();
}

void main() async {
  await greet();
}
Code language: JavaScript (javascript)

Hasil keluaran:

Hello from deferred library wellcome to foxdevelop.com
Code language: JavaScript (javascript)

Simpan kedua berkas di folder yang sama

Bagaimana jika hello.dart berada di direktori lain, misal folder lib tingkat atas?

Contoh jalur: D:\dartdemo\firstdart\lib

main.dart ada di D:\dartdemo\firstdart\bin

firstdart/
├─ bin/
│  └─ firstdart.dart       // Titik masuk program
└─ lib/
   └─ hello.dart      // Pustaka pemuatan tertundaCode language: JavaScript (javascript)

Maka tulis impor seperti ini

// ../ berarti direktori induk
import '../lib/hello.dart' deferred as hello;Code language: JavaScript (javascript)

Deklarasi pustaka paling atas library

Ditulis di bagian paling atas berkas, digunakan untuk komentar dokumentasi pustaka dan anotasi tingkat pustaka (contoh: batasan platform pengujian).

/// Pustaka alat uji khusus browser
@TestOn('browser')
library;
Code language: JavaScript (javascript)

export

Ekspor (enkapsulasi API publik terpadu)

Sering dipakai saat membuat paket alat, menggabungkan beberapa subpustaka dan hanya mengekspos satu titik impor luar.

Struktur berkas

src/math.dart

int add(int a, int b) => a + b;
int sub(int a, int b) => a - b;
Code language: PHP (php)

src/string.dart

String upper(String s) => s.toUpperCase();
Code language: JavaScript (javascript)

utils.dart (titik ekspor terpadu)

export 'src/math.dart';
export 'src/string.dart';
// Sembunyikan alat internal privat
export 'src/internal.dart' hide helper;
Code language: JavaScript (javascript)

utils.dart tidak dapat dijalankan sendiri hanya berkas penggabung ekspor tanpa fungsi masuk main(), tidak bisa menjalankan dart run lib/utils.dart;

Fungsi export

  • Menggabungkan API dari beberapa subberkas src;
  • Pengguna hanya perlu mengimpor satu berkas utils.dart untuk mendapatkan semua metode yang diekspos;
  • hide xxx menyembunyikan alat internal, mengenkapsulasi detail implementasi dan mengontrol API publik yang terpapar.

Penggunaan di main.dart

import 'utils.dart';

void main() {
  print(add(1,2));
  print(upper("dart"));
}
Code language: JavaScript (javascript)

Catatan penting

export/import hanya melakukan impor dan ekspor tingkat kode sumber, jika mendistribusikan berkas sumber .dart, orang lain dapat melihat seluruh kode sumber;

Untuk menyembunyikan kode sumber, Anda harus tidak mempublikasikan berkas sumber .dart, hanya mendistribusikan Snapshot biner hasil kompilasi.

Snapshot adalah berkas biner hasil kompilasi Dart, tidak dapat dibalik menjadi kode sumber terbaca secara utuh, hanya dapat memanggil API yang diekspos.

Materi ini dibahas di modul lain.

part

Pisah satu pustaka menjadi beberapa berkas

Satu pustaka dipisah menjadi beberapa berkas yang saling berbagi pengidentifikasi privat garis bawah. Wajib pasangkan part 'xxx.dart' / part of 'berkas_utama.dart'

main_lib.dart (berkas pustaka utama)

library; // Nyatakan berkas ini adalah pustaka
part 'logic.dart'; // Gabungkan logic.dart ke pustaka saat ini, keduanya satu pustaka

int _secret = 999; // Variabel privat pustaka
Code language: JavaScript (javascript)

logic.dart (berkas bagian terpisah)

part of 'main_lib.dart'; // Nyatakan berkas ini milik main_lib.dart, bukan pustaka mandiri.

void printSecret() {
  // Dapat mengakses _secret dari berkas utama, variabel privat satu pustaka saling terlihat
  print(_secret);
}
Code language: JavaScript (javascript)

Cara pemanggilan

import 'main_lib.dart'; // Impor pustaka utama, JANGAN impor berkas bagian

void main() {
  printSecret(); // Keluaran 999
}
Code language: JavaScript (javascript)

Impor bersyarat

Otomatis ganti berkas implementasi sesuai platform eksekusi

import 'platform_stub.dart'
    if (dart.library.io) 'platform_mobile.dart'
    if (dart.library.js_interop) 'platform_web.dart';
Code language: JavaScript (javascript)

Previous:

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *