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.