Menu
Coddy logo textTech

Stream-Controller

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 78 von 110.

Während async*-Generatoren hervorragend geeignet sind, um Streams mit vordefinierten Daten zu erstellen, benötigst du manchmal mehr Kontrolle – etwa um Daten aus verschiedenen Teilen deines Codes zu einem Stream hinzuzufügen. Hier kommt StreamController ins Spiel.

Ein StreamController fungiert als Verwalter für einen Stream. Er stellt dir einen „Sink“ zum Hinzufügen von Daten und einen „Stream“ bereit, den Listener abonnieren können:

import 'dart:async';

void main() {
  var controller = StreamController<String>();
  
  // Den Stream abhören
  controller.stream.listen((data) {
    print('Received: $data');
  });
  
  // Daten über den Sink hinzufügen
  controller.add('Hello');
  controller.add('World');
  
  controller.close();  // Immer schließen, wenn fertig
}

Die Methode add() fügt neue Werte in den Stream ein, und alle Listener erhalten sie sofort. Du solltest immer close() aufrufen, wenn du fertig bist, um Ressourcen freizugeben.

Standardmäßig kann ein Stream nur einen Listener haben. Für mehrere Listener verwendest du einen Broadcast-Controller:

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();
}

StreamControllers sind in der OOP unerlässlich für die Erstellung ereignisgesteuerter Klassen – etwa um mehrere Teile Ihrer App zu benachrichtigen, wenn sich Daten ändern, Benutzeraktionen zu verarbeiten oder Echtzeit-Updates innerhalb Ihrer Objekte zu verwalten.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Message-Hub-System, das mehreren Abonnenten ermöglicht, Nachrichten in Echtzeit zu empfangen! Du verwendest einen StreamController, um den Nachrichtenfluss zu verwalten, und zeigst, wie Broadcast-Streams mehrere Listener ermöglichen.

Du organisierst deinen Code in zwei Dateien:

  • message_hub.dart: Erstelle eine MessageHub-Klasse, die die Nachrichtenverteilung mithilfe eines StreamControllers verwaltet. Dein Hub sollte:
    • Intern einen Broadcast-StreamController<String> verwenden, damit sich mehrere Listener anmelden können
    • Einen Getter namens messages bereitstellen, der den Stream zurückgibt, bei dem sich Listener anmelden können
    • Eine Methode broadcast(String message) besitzen, die eine Nachricht zum Stream hinzufügt
    • Eine Methode shutdown() besitzen, die den Controller schließt
  • main.dart: Importiere deinen Message Hub und richte ein Szenario mit mehreren Abonnenten ein, die denselben Stream abhören:
    • Erstelle eine MessageHub-Instanz
    • Füge einen ersten Listener hinzu, der Nachrichten im Format Subscriber A: [message] ausgibt
    • Füge einen zweiten Listener hinzu, der Nachrichten im Format Subscriber B: [message] ausgibt
    • Veröffentliche drei Nachrichten: Hello everyone, Welcome to the hub und Goodbye
    • Fahre den Hub herunter

Denke daran, dart:async in deine Hub-Datei zu importieren, um auf StreamController zugreifen zu können. Beachte, wie beide Abonnenten jede veröffentlichte Nachricht erhalten – das ist die Stärke von Broadcast-Streams!

Erwartete Ausgabe:

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

Probier es selbst

import 'message_hub.dart';

void main() {
  // TODO: Erstelle eine MessageHub-Instanz
  
  // TODO: Füge den ersten Listener hinzu, der Folgendes ausgibt: Subscriber A: [message]
  
  // TODO: Füge den zweiten Listener hinzu, der Folgendes ausgibt: Subscriber B: [message]
  
  // TODO: Übertrage drei Nachrichten:
  // - "Hello everyone"
  // - "Welcome to the hub"
  // - "Goodbye"
  
  // TODO: Fahre den Hub herunter
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler