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 unint(de exemplux + 1). Analizorul nu permite; aștept-l întâi cuawait.
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.