Zone în Dart

Contextul în care rulează codul asincron; Zone.current este zona de acum, din care poți citi valori atașate.

Sintaxă
import 'dart:async';

abstract final class Zone
static Zone get current
static const Zone root
dynamic operator [](Object? key)

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.