Kontrolery strumieni
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 78 z 110.
Generatory async* świetnie nadają się do tworzenia strumieni ze wstępnie zdefiniowanymi danymi, ale czasami potrzebujesz większej kontroli — na przykład możliwości dodawania danych do strumienia z różnych części kodu. Właśnie do tego służy StreamController.
StreamController pełni rolę menedżera strumienia. Udostępnia „ujście”, do którego możesz dodawać dane, oraz „strumień”, do którego mogą subskrybować słuchacze:
import 'dart:async';
void main() {
var controller = StreamController<String>();
// Nasłuchuj strumienia
controller.stream.listen((data) {
print('Received: $data');
});
// Dodaj dane przez sink
controller.add('Hello');
controller.add('World');
controller.close(); // Po zakończeniu zawsze zamknij
}Metoda add() dodaje nowe wartości do strumienia, a wszyscy nasłuchujący otrzymują je natychmiast. Po zakończeniu zawsze wywołuj close(), aby zwolnić zasoby.
Domyślnie strumień może mieć tylko jednego słuchacza. Aby umożliwić wielu słuchaczy, użyj kontrolera rozgłoszeniowego:
import 'dart:async';
void main() {
var controller = StreamController<int>.broadcast();
controller.stream.listen((n) => print('Listener 1: $n'));
controller.stream.listen((n) => print('Listener 2: $n'));
controller.add(42);
controller.close();
}StreamControllery są niezbędne w OOP do tworzenia klas sterowanych zdarzeniami — na przykład do powiadamiania różnych części aplikacji o zmianach danych, obsługi działań użytkownika lub zarządzania aktualizacjami w czasie rzeczywistym w obrębie obiektów.
Wyzwanie
ŁatwyZbudujmy system centrum wiadomości, który umożliwia wielu subskrybentom odbieranie wiadomości w czasie rzeczywistym! Użyjesz StreamController, aby zarządzać przepływem wiadomości i pokazać, jak strumienie rozgłoszeniowe umożliwiają wielu słuchaczom nasłuchiwanie.
Podzielisz swój kod na dwa pliki:
message_hub.dart: Utwórz klasęMessageHub, która zarządza dystrybucją wiadomości za pomocą StreamController. Twoje centrum powinno:- Wewnętrznie używać rozgłoszeniowego
StreamController<String>, aby wiele słuchaczy mogło subskrybować strumień - Udostępniać getter o nazwie
messages, który zwraca strumień, aby słuchacze mogli go subskrybować - Mieć metodę
broadcast(String message), która dodaje wiadomość do strumienia - Mieć metodę
shutdown(), która zamyka kontroler
- Wewnętrznie używać rozgłoszeniowego
main.dart: Zaimportuj swoje centrum wiadomości i skonfiguruj scenariusz, w którym wielu subskrybentów nasłuchuje tego samego strumienia:- Utwórz instancję
MessageHub - Dodaj pierwszego słuchacza, który wypisuje wiadomości w formacie:
Subscriber A: [message] - Dodaj drugiego słuchacza, który wypisuje wiadomości w formacie:
Subscriber B: [message] - Rozgłoś trzy wiadomości:
Hello everyone,Welcome to the huborazGoodbye - Zamknij centrum
- Utwórz instancję
Pamiętaj, aby zaimportować dart:async w pliku centrum wiadomości, by uzyskać dostęp do StreamController. Zwróć uwagę, że obaj subskrybenci otrzymują każdą rozgłaszaną wiadomość — na tym polega siła strumieni rozgłoszeniowych!
Oczekiwany wynik:
Subscriber A: Hello everyone
Subscriber B: Hello everyone
Subscriber A: Welcome to the hub
Subscriber B: Welcome to the hub
Subscriber A: Goodbye
Subscriber B: GoodbyeSpróbuj swoich sił
import 'message_hub.dart';
void main() {
// TODO: Utwórz instancję MessageHub
// TODO: Dodaj pierwszego nasłuchiwacza, który wypisuje: Subscriber A: [message]
// TODO: Dodaj drugiego nasłuchiwacza, który wypisuje: Subscriber B: [message]
// TODO: Nadaj trzy wiadomości:
// - "Hello everyone"
// - "Welcome to the hub"
// - "Goodbye"
// TODO: Zamknij hub
}
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