Ce face deferred
Un import deferred as prefix nu încarcă biblioteca la pornire. Înainte s-o folosești, apelezi await prefix.loadLibrary(); după aceea numele ei sunt disponibile prin prefix. Prefixul este obligatoriu.
Avantajul real apare pe web (dart compile js, Flutter web): biblioteca amânată este pusă într-un fișier JavaScript separat, descărcat doar când e nevoie de ea. Așa pagina se deschide mai repede. Pe VM-ul Dart (dart run) și în executabilele native, loadLibrary funcționează, dar nu aduce economii.
Folosirea unui nume din biblioteca amânată înainte de loadLibrary() aruncă o eroare. Tipurile din ea nu pot fi folosite în declarații (de exemplu ca tip al unei variabile).
Exemple
Exemplul 1: Încărcare la cerere
dart:convert este importată amânat și încărcată abia când trebuie să generăm JSON.
import 'dart:convert' deferred as conversie;
Future<void> main() async {
print('Aplicația a pornit.');
final comanda = {'client': 'Andreea', 'oras': 'Iași', 'total': 249.9};
await conversie.loadLibrary();
print('Biblioteca a fost încărcată.');
print(conversie.jsonEncode(comanda));
}
Rezultat
Aplicația a pornit.
Biblioteca a fost încărcată.
{"client":"Andreea","oras":"Iași","total":249.9}
Exemplul 2: Un modul mare încărcat doar când este deschis
Rapoartele sunt într-un fișier separat. Pe web, codul lor se descarcă doar când utilizatorul cere un raport.
// rapoarte.dart
String raportAnual(int an) => 'Raport $an: vânzări 1.250.000 lei';
// main.dart
import 'rapoarte.dart' deferred as rapoarte;
Future<void> main() async {
print('Aplicația a pornit.');
await rapoarte.loadLibrary();
print(rapoarte.raportAnual(2025));
}
Rezultat (proiect cu mai multe fișiere)
Aplicația a pornit.
Raport 2025: vânzări 1.250.000 lei
Greșeli frecvente
- Apelul unei funcții amânate fără
loadLibrary(): excepțiaDeferred library rapoarte was not loaded. - Import
deferredfărăas: prefixul este obligatoriu. - Să aștepți economii de memorie pe
dart run: beneficiul apare la compilarea pentru web.
Comenzi înrudite
import: Face disponibile în fișierul curent numele publice ale altei biblioteci: din SDK, dintr-un pachet sau din proiect.async și await: async marchează o funcție asincronă (întoarce Future), iar await așteaptă rezultatul unui Future fără să blocheze programul.dart compile: Compilează un program Dart într-un executabil nativ, în JavaScript, WebAssembly sau într-un snapshot.