Future.then în Dart

Înregistrează o funcție care primește valoarea future-ului când e gata și returnează un future nou cu rezultatul ei.

Sintaxă
Future<R> then<R>(FutureOr<R> onValue(T value), {Function? onError})

Ce face Future.then

then este forma veche, fără await, de a folosi un future: funcția onValue se cheamă cu valoarea, când aceasta este gata. Rezultatul lui then este un nou Future, deci poți înlănțui mai mulți pași.

Dacă onValue returnează un alt Future, lanțul îl așteaptă. Parametrul onError prinde erorile, dar de obicei se folosește catchError sau, mai simplu, await cu try/catch.

Parametri

Parametru Descriere
onValue Funcția chemată cu valoarea future-ului.
onError Opțional: funcția chemată dacă future-ul se termină cu eroare.

Ce returnează

Un Future<R> cu rezultatul lui onValue.

Exemple

Exemplul 1: Lanț de pași

Future<int> citesteNota() => Future.delayed(const Duration(milliseconds: 10), () => 9);

Future<void> main() async {
  await citesteNota()
      .then((nota) => nota * 10)
      .then((procent) => '$procent%')
      .then((text) => print('Rezultat: $text'));
  print('Lanțul s-a terminat.');
}

Rezultat

Rezultat: 90%
Lanțul s-a terminat.

Exemplul 2: then față de await

Cele două variante fac același lucru. Varianta cu await se citește de sus în jos, ca un cod obișnuit.

Future<String> oras() async => 'Cluj';
Future<int> temperatura(String oras) async => oras == 'Cluj' ? 24 : 20;

Future<void> main() async {
  await oras().then(temperatura).then((t) => print('cu then: $t °C'));

  final o = await oras();
  final t = await temperatura(o);
  print('cu await: $t °C');
}

Rezultat

cu then: 24 °C
cu await: 24 °C

Greșeli frecvente

  • Nu aștepți future-ul returnat de then, iar programul trece mai departe (sau se termină) înainte ca lanțul să ruleze.
  • Amesteci then și await în același cod fără motiv. Alege o variantă; await este de obicei mai clar.

Comenzi înrudite

  • 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.
  • Future.catchError: Prinde eroarea unui future și o înlocuiește cu o valoare de rezervă (echivalentul lui catch pentru lanțuri then).
  • Future.whenComplete: Rulează o funcție când future-ul se termină, fie cu succes, fie cu eroare (echivalentul lui finally).
  • async și await: async marchează o funcție asincronă (întoarce Future), iar await așteaptă rezultatul unui Future fără să blocheze programul.