Ce face Zone
O zonă este un context care „însoțește” codul, inclusiv callback-urile asincrone pornite din el: timere, future-uri, stream-uri. O zonă poate ține valori (citite cu Zone.current[cheie]), poate prinde erorile netratate și poate intercepta operații ca print.
Orice program pornește în Zone.root. Zone noi creezi cu runZoned, runZonedGuarded sau Zone.current.fork(...). Le folosesc mai ales framework-urile și testele; în codul obișnuit le întâlnești rar.
Ce returnează
Zone.current returnează zona în care rulează codul acum; zona[cheie] returnează valoarea atașată sau null.
Exemple
Exemplul 1: Valori care urmează codul asincron
Funcția jurnal nu primește utilizatorul ca parametru, dar îl citește din zona curentă, chiar și după await.
import 'dart:async';
void jurnal(String mesaj) => print('[${Zone.current[#utilizator] ?? 'anonim'}] $mesaj');
Future<void> cerere() async {
jurnal('cerere primită');
await Future.delayed(const Duration(milliseconds: 10));
jurnal('răspuns trimis');
}
Future<void> main() async {
await runZoned(cerere, zoneValues: {#utilizator: 'Ana'});
await runZoned(cerere, zoneValues: {#utilizator: 'Mihai'});
jurnal('în afara zonelor');
}
Rezultat
[Ana] cerere primită
[Ana] răspuns trimis
[Mihai] cerere primită
[Mihai] răspuns trimis
[anonim] în afara zonelor
Exemplul 2: Zona curentă și zona rădăcină
import 'dart:async';
void main() {
print('main rulează în root: ${identical(Zone.current, Zone.root)}');
runZoned(() {
print('în runZoned, root: ${identical(Zone.current, Zone.root)}');
print('părintele este root: ${identical(Zone.current.parent, Zone.root)}');
});
}
Rezultat
main rulează în root: true
în runZoned, root: false
părintele este root: true
Greșeli frecvente
- Folosești zone ca să transmiți date pe care le-ai putea da simplu ca parametri. Codul devine greu de urmărit; zonele sunt pentru infrastructură (jurnale, teste, erori).
Comenzi înrudite
Zone.run: fork creează o zonă copil cu valori sau reguli proprii; run execută o funcție în interiorul unei zone.runZonedGuarded: Rulează cod într-o zonă nouă și prinde toate erorile asincrone netratate din ea, cu o singură funcție.scheduleMicrotask: Programează o funcție să ruleze imediat după codul sincron curent, înaintea timerelor și a altor evenimente.