Ce face Stream.take
take(n) emite primele n valori, apoi închide stream-ul nou și anulează ascultarea celui original. Este modul obișnuit de a limita un stream infinit, cum este Stream.periodic.
skip(n) ignoră primele n valori și le emite pe toate celelalte. Dacă stream-ul are mai puține valori, rezultatul este gol.
Parametri
| Parametru | Descriere |
|---|---|
count |
Câte valori se păstrează (la take) sau se sar (la skip). |
Ce returnează
Un Stream<T> nou.
Exemple
Exemplul 1: Primele 3 ticuri ale unui stream infinit
Future<void> main() async {
final ticuri = Stream.periodic(const Duration(milliseconds: 20), (i) => 'tic ${i + 1}');
await for (final t in ticuri.take(3)) {
print(t);
}
print('am terminat după 3');
}
Rezultat
tic 1
tic 2
tic 3
am terminat după 3
Exemplul 2: Paginare cu skip și take
Future<void> main() async {
Stream<String> produse() => Stream.fromIterable(['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7']);
const peLaPagina = 3;
for (var pagina = 0; pagina < 3; pagina++) {
final elemente = await produse().skip(pagina * peLaPagina).take(peLaPagina).toList();
print('pagina ${pagina + 1}: $elemente');
}
}
Rezultat
pagina 1: [p1, p2, p3]
pagina 2: [p4, p5, p6]
pagina 3: [p7]
Greșeli frecvente
- Chemi
skipșitakede mai multe ori pe același stream obișnuit. Fiecare apel are nevoie de un stream nou (de aceea exemplul folosește o funcție care creează stream-ul).
Comenzi înrudite
Stream.takeWhile: takeWhile emite valori cât timp testul este adevărat și apoi se închide; skipWhile sare peste ele până la primul fals.Stream.periodic: Creează un stream infinit care emite o valoare la fiecare interval de timp, calculată din numărul pasului.Iterable.take: take păstrează primele n elemente, skip sare peste primele n elemente.Stream.first: first, last, single și elementAt dau un Future cu o anumită valoare din stream: prima, ultima, singura sau a n-a.