Completer.complete în Dart

complete termină future-ul cu o valoare, completeError cu o eroare; isCompleted spune dacă s-a terminat deja.

Sintaxă
void complete([FutureOr<T>? value])
void completeError(Object error, [StackTrace? stackTrace])
bool get isCompleted

Ce face Completer.complete

complete(valoare) termină completer.future cu valoarea dată. completeError(eroare) îl termină cu o eroare, care va fi aruncată la await.

Un completer se poate termina o singură dată. isCompleted devine true după primul complete sau completeError; un al doilea apel aruncă StateError.

Parametri

Parametru Descriere
value Valoarea cu care se termină future-ul.
error / stackTrace Eroarea și, opțional, stiva de apeluri.

Ce returnează

complete și completeError nu returnează nimic; isCompleted returnează bool.

Exemple

Exemplul 1: Succes sau eroare

import 'dart:async';

Future<int> verificaPin(String pin) {
  final c = Completer<int>();
  Timer(const Duration(milliseconds: 10), () {
    if (pin == '1234') {
      c.complete(500);
    } else {
      c.completeError(StateError('PIN greșit'));
    }
  });
  return c.future;
}

Future<void> main() async {
  for (final pin in ['1234', '0000']) {
    try {
      print('Sold: ${await verificaPin(pin)} lei');
    } on StateError catch (e) {
      print('Eroare: ${e.message}');
    }
  }
}

Rezultat

Sold: 500 lei
Eroare: PIN greșit

Exemplul 2: isCompleted și al doilea complete

import 'dart:async';

Future<void> main() async {
  final c = Completer<String>();
  print('înainte: ${c.isCompleted}');
  c.complete('primul');
  print('după: ${c.isCompleted}');
  try {
    c.complete('al doilea');
  } on StateError catch (e) {
    print('Eroare: ${e.message}');
  }
  print(await c.future);
}

Rezultat

înainte: false
după: true
Eroare: Future already completed
primul

Greșeli frecvente

  • Chemi completeError și nimeni nu așteaptă future. Eroarea devine netratată și oprește programul.

Comenzi înrudite

  • Completer: Creează un Future pe care îl termini tu, manual, mai târziu; leagă codul cu callback-uri de codul cu await.
  • Completer.sync: Completer care anunță ascultătorii imediat, în timpul apelului complete, nu mai târziu.
  • Future.value: Future.value creează un future deja terminat cu o valoare, iar Future.error unul terminat cu o eroare.