Future.value în Dart

Future.value creează un future deja terminat cu o valoare, iar Future.error unul terminat cu o eroare.

Sintaxă
factory Future<T>.value([FutureOr<T>? value])
factory Future<T>.error(Object error, [StackTrace? stackTrace])

Ce face Future.value

Future.value(x) este un future gata făcut cu valoarea x. Îl folosești când o funcție trebuie să returneze Future, dar ai deja rezultatul (de exemplu din cache), sau în teste.

Future.error(e) este un future terminat cu eroarea e. Când îl aștepți, eroarea este aruncată. Ascultătorii lor rulează tot asincron, nu imediat.

Parametri

Parametru Descriere
value Valoarea future-ului (poate fi chiar un alt future).
error / stackTrace Eroarea și, opțional, stiva de apeluri.

Ce returnează

Un Future<T> terminat.

Exemple

Exemplul 1: Cache: valoarea există deja

final cache = <String, String>{'IS': 'Iași'};

Future<String> numeJudet(String cod) {
  final dinCache = cache[cod];
  if (dinCache != null) return Future.value(dinCache);
  return Future.delayed(const Duration(milliseconds: 10), () {
    print('  (citit de pe server)');
    return cache[cod] = 'Cluj';
  });
}

Future<void> main() async {
  print(await numeJudet('IS'));
  print(await numeJudet('CJ'));
  print(await numeJudet('CJ'));
}

Rezultat

Iași
  (citit de pe server)
Cluj
Cluj

Exemplul 2: Future.error într-o funcție fără async

Future<int> imparte(int a, int b) {
  if (b == 0) return Future.error(ArgumentError('împărțire la zero'));
  return Future.value(a ~/ b);
}

Future<void> main() async {
  print(await imparte(10, 3));
  try {
    await imparte(5, 0);
  } on ArgumentError catch (e) {
    print('Eroare: ${e.message}');
  }
}

Rezultat

3
Eroare: împărțire la zero

Greșeli frecvente

  • Creezi un Future.error și nu îl aștepți și nu îl tratezi. Eroarea devine netratată și oprește programul.
  • Crezi că then pe un Future.value rulează imediat. Rulează tot după codul sincron curent.

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.sync: Future.sync rulează funcția imediat și pune rezultatul într-un future; Future.microtask o rulează ca microtask.
  • Completer: Creează un Future pe care îl termini tu, manual, mai târziu; leagă codul cu callback-uri de codul cu await.
  • Stream.value: Stream-uri gata făcute: unul cu o singură valoare, unul cu o singură eroare și unul gol.