Future.whenComplete în Dart

Rulează o funcție când future-ul se termină, fie cu succes, fie cu eroare (echivalentul lui finally).

Sintaxă
Future<T> whenComplete(FutureOr<void> action())

Ce face Future.whenComplete

whenComplete este pentru curățenie: închide o conexiune, ascunde un indicator de încărcare, scrie în jurnal. Funcția rulează în ambele cazuri și nu primește nici valoarea, nici eroarea.

Future-ul returnat are același rezultat ca originalul: valoarea trece mai departe, iar eroarea rămâne eroare. În codul cu await, echivalentul este blocul finally.

Parametri

Parametru Descriere
action Funcția de curățenie; dacă returnează un future, acesta este așteptat.

Ce returnează

Un Future<T> cu același rezultat ca originalul.

Exemple

Exemplul 1: Indicator de încărcare

Future<String> incarca(bool reuseste) async {
  await Future.delayed(const Duration(milliseconds: 10));
  if (!reuseste) throw Exception('conexiune pierdută');
  return 'date primite';
}

Future<void> main() async {
  for (final ok in [true, false]) {
    print('[se încarcă...]');
    try {
      final r = await incarca(ok).whenComplete(() => print('[gata încărcarea]'));
      print(r);
    } on Exception catch (e) {
      print('Eroare: $e');
    }
  }
}

Rezultat

[se încarcă...]
[gata încărcarea]
date primite
[se încarcă...]
[gata încărcarea]
Eroare: Exception: conexiune pierdută

Exemplul 2: Același lucru cu finally

Future<void> trimiteRaport() async {
  await Future.delayed(const Duration(milliseconds: 10));
  print('Raport trimis');
}

Future<void> main() async {
  try {
    await trimiteRaport();
  } finally {
    print('Conexiune închisă');
  }
}

Rezultat

Raport trimis
Conexiune închisă

Greșeli frecvente

  • Crezi că whenComplete prinde eroarea. Nu o prinde: eroarea continuă și trebuie tratată mai departe cu catchError sau try/catch.

Comenzi înrudite

  • Future.catchError: Prinde eroarea unui future și o înlocuiește cu o valoare de rezervă (echivalentul lui catch pentru lanțuri then).
  • Future.then: Înregistrează o funcție care primește valoarea future-ului când e gata și returnează un future nou cu rezultatul ei.
  • try, catch și finally: try prinde excepțiile din bloc; on alege tipul, catch dă acces la obiect, finally rulează mereu.