Ce face Stream.timeout
timeout pornește un cronometru la ascultare și după fiecare valoare. Dacă următoarea valoare nu vine în timpul dat, stream-ul nou emite o TimeoutException. Stream-ul original nu se oprește din cauza asta.
Cu onTimeout decizi tu ce se întâmplă: primești un EventSink în care poți adăuga o valoare de rezervă, o eroare, sau poți închide stream-ul cu close().
Parametri
| Parametru | Descriere |
|---|---|
timeLimit |
Pauza maximă permisă între două valori. |
onTimeout |
Opțional: ce faci la expirare, prin sink. |
Ce returnează
Un Stream<T> nou.
Exemple
Exemplul 1: Senzor care tace prea mult
import 'dart:async';
Stream<int> senzor() async* {
yield 20;
await Future.delayed(const Duration(milliseconds: 10));
yield 21;
await Future.delayed(const Duration(milliseconds: 300));
yield 22;
}
Future<void> main() async {
try {
await for (final t in senzor().timeout(const Duration(milliseconds: 100))) {
print('$t °C');
}
} on TimeoutException {
print('Senzorul nu mai răspunde');
}
}
Rezultat
20 °C
21 °C
Senzorul nu mai răspunde
Exemplul 2: Închidere elegantă cu onTimeout
Stream<String> mesaje() async* {
yield 'Bună!';
await Future.delayed(const Duration(milliseconds: 300));
yield 'Mai ești acolo?';
}
Future<void> main() async {
final s = mesaje().timeout(const Duration(milliseconds: 50), onTimeout: (sink) {
sink.add('[conversație închisă din lipsă de activitate]');
sink.close();
});
await s.forEach(print);
}
Rezultat
Bună!
[conversație închisă din lipsă de activitate]
Greșeli frecvente
- Crezi că
timeoutlimitează durata totală a stream-ului. Limitează pauza dintre două valori consecutive.
Comenzi înrudite
Future.timeout: Limitează cât aștepți un future: după timpul dat, aruncă TimeoutException sau folosește onTimeout.TimeoutException: Excepția aruncată când un Future sau un Stream nu a terminat în timpul dat cu timeout.Stream.handleError: Creează un stream nou care prinde erorile (toate sau doar unele) și lasă să treacă mai departe doar valorile.