FutureOr în Dart

Tip care acceptă fie o valoare T, fie un Future<T>; util pentru funcții care pot fi sincrone sau asincrone.

Sintaxă
import 'dart:async';

FutureOr<T>   // fie T, fie Future<T>

Ce face FutureOr

FutureOr<int> înseamnă „un int sau un Future<int>”. Îl vezi în semnăturile din biblioteca standard (de exemplu la then), unde funcția ta poate returna direct o valoare sau un future.

Când primești un FutureOr, cel mai simplu este să-l aștepți cu await: pe o valoare simplă, await o returnează pe ea, iar pe un future așteaptă rezultatul. Poți verifica și explicit cu is Future.

Ce returnează

Nu este o clasă cu obiecte proprii, ci un tip „uniune” folosit la verificarea tipurilor.

Exemple

Exemplul 1: Funcții de validare sincrone sau asincrone

import 'dart:async';

typedef Validator = FutureOr<bool> Function(String);

bool nuEGol(String s) => s.isNotEmpty;
Future<bool> numeLiber(String s) async {
  await Future.delayed(const Duration(milliseconds: 10));
  return s != 'ana';
}

Future<void> verifica(String nume, List<Validator> reguli) async {
  for (final regula in reguli) {
    if (!await regula(nume)) {
      print('"$nume" respins');
      return;
    }
  }
  print('"$nume" acceptat');
}

Future<void> main() async {
  await verifica('mihai', [nuEGol, numeLiber]);
  await verifica('ana', [nuEGol, numeLiber]);
  await verifica('', [nuEGol, numeLiber]);
}

Rezultat

"mihai" acceptat
"ana" respins
"" respins

Exemplul 2: Verificare cu is Future

import 'dart:async';

void descrie(FutureOr<int> x) {
  if (x is Future<int>) {
    print('am primit un future');
  } else {
    print('am primit direct valoarea $x');
  }
}

void main() {
  descrie(7);
  descrie(Future.value(7));
}

Rezultat

am primit direct valoarea 7
am primit un future

Greșeli frecvente

  • Folosești un FutureOr<int> ca pe un int (de exemplu x + 1). Analizorul nu permite; aștept-l întâi cu await.

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.then: Înregistrează o funcție care primește valoarea future-ului când e gata și returnează un future nou cu rezultatul ei.
  • async și await: async marchează o funcție asincronă (întoarce Future), iar await așteaptă rezultatul unui Future fără să blocheze programul.