unawaited în Dart

unawaited marchează un future pe care intenționat nu-l aștepți; Future.ignore îl ignoră complet, cu tot cu erori.

Sintaxă
import 'dart:async';

void unawaited(Future<void>? future)
void ignore()   // în Future<T>, Dart 2.14

Ce face unawaited

Uneori pornești o operație și nu vrei să aștepți rezultatul, de exemplu trimiterea unei statistici. unawaited(f) spune clar cititorului (și lint-ului unawaited_futures) că lipsa lui await este intenționată. Dacă future-ul se termină cu eroare, eroarea rămâne netratată.

f.ignore() merge mai departe: ignoră atât valoarea, cât și eroarea. Folosește-l doar pentru operații a căror reușită chiar nu contează.

Parametri

Parametru Descriere
future Pentru unawaited: future-ul pe care nu-l aștepți.

Ce returnează

Nimic (void), în ambele cazuri.

Exemple

Exemplul 1: Jurnal trimis în fundal

main nu așteaptă jurnalul, dar așteaptă mai mult decât durează acesta, ca să vezi că s-a terminat.

import 'dart:async';

Future<void> trimiteJurnal(String eveniment) async {
  await Future.delayed(const Duration(milliseconds: 20));
  print('  jurnal trimis: $eveniment');
}

Future<void> main() async {
  print('Utilizatorul Ana s-a autentificat');
  unawaited(trimiteJurnal('autentificare Ana'));
  print('Afișez pagina principală');
  await Future.delayed(const Duration(milliseconds: 50));
  print('Sfârșit');
}

Rezultat

Utilizatorul Ana s-a autentificat
Afișez pagina principală
  jurnal trimis: autentificare Ana
Sfârșit

Exemplul 2: ignore: o eroare care nu contează

Fără ignore(), eroarea netratată ar opri programul.

Future<void> preincarcaImagine(String url) async {
  await Future.delayed(const Duration(milliseconds: 10));
  throw Exception('imagine indisponibilă: $url');
}

Future<void> main() async {
  preincarcaImagine('https://dexblog.ro/logo.png').ignore();
  await Future.delayed(const Duration(milliseconds: 30));
  print('Pagina merge și fără imaginea preîncărcată');
}

Rezultat

Pagina merge și fără imaginea preîncărcată

Greșeli frecvente

  • Folosești unawaited pe o operație care poate eșua. Eroarea devine „netratată” și poate opri programul; tratează-o înăuntru cu try/catch sau folosește ignore().
  • Programul se termină înainte ca operația neașteptată să ruleze. main nu așteaptă future-urile pe care nu le-ai așteptat.

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.
  • async și await: async marchează o funcție asincronă (întoarce Future), iar await așteaptă rezultatul unui Future fără să blocheze programul.
  • runZonedGuarded: Rulează cod într-o zonă nouă și prinde toate erorile asincrone netratate din ea, cu o singură funcție.