Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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
  • 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 hub oraz Goodbye
    • Zamknij centrum

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: Goodbye

Spró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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online