Podstawy strumieni
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 77 z 110.
Podczas gdy Future dostarcza pojedynczą wartość, Stream dostarcza sekwencję wartości w czasie. Pomyśl o nim jak o rurze, która może emitować wiele porcji danych — idealnej do obsługi zdarzeń, aktualizacji w czasie rzeczywistym lub przetwarzania danych kawałek po kawałku.
Możesz utworzyć prosty strumień za pomocą Stream.fromIterable() lub funkcji generatora asynchronicznego z użyciem async* i yield:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}
// Wynik: 1, 2, 3Słowo kluczowe async* oznacza funkcję, która zwraca strumień, a yield emituje każdą wartość. Aby odbierać strumień, użyj await for, które przetwarza każdą wartość w miarę jej otrzymywania.
Możesz również nasłuchiwać strumienia za pomocą metody listen(), która przyjmuje funkcję zwrotną:
Stream<String> greetings() async* {
yield 'Hello';
yield 'Hi';
yield 'Hey';
}
void main() {
greetings().listen((message) {
print(message);
});
}Kluczowa różnica w porównaniu z obiektami Future: obiekt Future kończy działanie, zwracając jedną wartość, podczas gdy obiekt Stream może emitować wiele wartości, zanim zakończy działanie. Dzięki temu obiekty Stream idealnie nadają się do obsługi ciągle napływających danych, takich jak interakcje użytkownika, odczyty z czujników czy dane przychodzące w porcjach.
Wyzwanie
ŁatwyZbudujmy system timera odliczającego, który emituje wartości w czasie za pomocą strumieni! Utworzysz klasę generującą sekwencję liczb odliczania, aby pokazać, jak strumienie dostarczają wiele wartości, a nie tylko jedną.
Podzielisz kod na dwa pliki:
countdown.dart: Utwórz klasęCountdown, która generuje strumienie odliczania. Twoja klasa powinna mieć:- Pole
start(int), które przechowuje początkową liczbę odliczania - Konstruktor przyjmujący początkową liczbę
- Metodę
countDown(), która zwracaStream<int>. Użyjasync*iyield, aby emitować liczby odstartdo0(włącznie) - Metodę
countDownWithMessage(), która zwracaStream<String>. Powinna emitować ciągi znaków w formacie'T-minus [number]'dla każdej liczby odstartdo1, a następnie wyemitować'Liftoff!'jako wartość końcową
- Pole
main.dart: Zaimportuj plik z odliczaniem i zademonstruj działanie obu metod strumienia. Twoja funkcja main powinna być asynchroniczna i:- Utworzyć instancję
Countdownrozpoczynającą od3 - Wypisać
Number countdown: - Użyć
await for, aby iterować pocountDown()i wypisywać każdą liczbę - Wypisać pusty wiersz
- Wypisać
Launch sequence: - Użyć
await for, aby iterować pocountDownWithMessage()i wypisywać każdą wiadomość
- Utworzyć instancję
Zwróć uwagę, że każda instrukcja yield emituje wartość przez strumień, a await for przetwarza każdą wartość w chwili jej nadejścia. W przeciwieństwie do obiektu Future, który dostarcza jeden wynik, strumienie będą emitować wiele wartości po kolei!
Oczekiwany wynik:
Number countdown:
3
2
1
0
Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!Spróbuj swoich sił
import 'countdown.dart';
Future<void> main() async {
// TODO: Utwórz instancję Countdown, zaczynając od 3
// TODO: Wypisz 'Number countdown:'
// TODO: Użyj await for, aby przejść przez wartości zwracane przez countDown() i wypisać każdą liczbę
// TODO: Wypisz pustą linię
// TODO: Wypisz 'Launch sequence:'
// TODO: Użyj await for, aby przejść przez wartości zwracane przez countDownWithMessage() i wypisać każdy komunikat
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatności12Asynchroniczne OOP
Futures i async/awaitPodstawy strumieniKontrolery strumieniKonstruktory asynchroniczneAsynchroniczność w metodach klasyPodsumowanie — pobieranie danychPoćwicz samodzielnie: Kompilator Dart online