scheduleMicrotask în Dart

Programează o funcție să ruleze imediat după codul sincron curent, înaintea timerelor și a altor evenimente.

Sintaxă
import 'dart:async';

void scheduleMicrotask(void callback())

Ce face scheduleMicrotask

Dart rulează codul asincron cu o buclă de evenimente care are două cozi: coada de microtask-uri și coada de evenimente (timere, intrare/ieșire, Future.delayed). După fiecare bucată de cod sincron, toate microtask-urile rulează înaintea următorului eveniment.

scheduleMicrotask(f) pune funcția în coada de microtask-uri. Este util pentru lucruri care trebuie făcute „imediat după”, dar nu în mijlocul codului curent. Un microtask care programează la nesfârșit alte microtask-uri blochează timerele.

Parametri

Parametru Descriere
callback Funcția rulată ca microtask.

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Ordinea în bucla de evenimente

import 'dart:async';

Future<void> main() async {
  print('1. cod sincron');
  Timer.run(() => print('4. timer (coada de evenimente)'));
  scheduleMicrotask(() => print('3. microtask'));
  print('2. tot cod sincron');
  await Future.delayed(const Duration(milliseconds: 10));
}

Rezultat

1. cod sincron
2. tot cod sincron
3. microtask
4. timer (coada de evenimente)

Exemplul 2: Gruparea mai multor schimbări într-o singură notificare

Trei schimbări rapide produc o singură salvare, făcută după ce codul sincron s-a terminat.

import 'dart:async';

class Document {
  final _linii = <String>[];
  bool _programat = false;

  void adauga(String linie) {
    _linii.add(linie);
    if (!_programat) {
      _programat = true;
      scheduleMicrotask(_salveaza);
    }
  }

  void _salveaza() {
    _programat = false;
    print('Salvez ${_linii.length} linii: $_linii');
  }
}

Future<void> main() async {
  final doc = Document();
  doc.adauga('Titlu');
  doc.adauga('Paragraf 1');
  doc.adauga('Paragraf 2');
  print('Am terminat de scris');
  await Future.delayed(Duration.zero);
}

Rezultat

Am terminat de scris
Salvez 3 linii: [Titlu, Paragraf 1, Paragraf 2]

Greșeli frecvente

  • Programezi microtask-uri dintr-un microtask, la nesfârșit. Timerele și evenimentele nu mai ajung să ruleze, iar programul pare blocat.

Comenzi înrudite

  • Future.sync: Future.sync rulează funcția imediat și pune rezultatul într-un future; Future.microtask o rulează ca microtask.
  • Timer.run: Rulează o funcție cât mai curând, ca eveniment nou, după codul curent și după microtask-uri (Timer cu durata zero).
  • Future: O valoare care va fi gata mai târziu (citirea unui fișier, un răspuns de la server); o aștepți cu await.
  • Zone: Contextul în care rulează codul asincron; Zone.current este zona de acum, din care poți citi valori atașate.