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ă
whenCompleteprinde eroarea. Nu o prinde: eroarea continuă și trebuie tratată mai departe cucatchErrorsautry/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.