Sobes.tech
Junior

Wofür werden Streams in Flutter verwendet?

sobes.tech KI

Antwort von AI

Streams in Flutter werden verwendet, um Sequenzen asynchroner Ereignisse zu verarbeiten.

Hauptanwendungsfälle:

  1. Reagieren auf Datenänderungen: Redux, BLoC-Muster verwenden Streams, um den Zustand der Anwendung zu verwalten und die UI bei Änderungen reaktiv zu aktualisieren.
  2. Arbeiten mit Datenströmen: Daten über das Netzwerk (z.B. WebSocket), Lesen aus Dateien, Arbeiten mit Gerätesensoren.
  3. Verarbeitung von Benutzerinteraktionen: Verfolgung des Scrollens, Draggable / DragTarget.
  4. Asynchrone Operationen: Ausführen von Aufgaben im Hintergrund und Erhalten der Ergebnisse, sobald sie bereit sind.

Schlüsselkonzepte:

  • Stream: Sequenz asynchroner Ereignisse. Ein Stream kann 0 oder mehr Ereignisse emittieren und dann beendet werden (mit Erfolg oder Fehler).
  • StreamSubscription: Repräsentiert eine Abonnement an einen Stream. Ermöglicht das Empfangen von Ereignissen und die Steuerung des Abonnements (pausieren, fortsetzen, abbrechen).
  • Sink: Wird verwendet, um Daten in den Stream einzufügen.
  • StreamBuilder: Widget, das sich neu aufbaut, wenn neue Daten vom Stream empfangen werden.
// Beispiel für die Verwendung von StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // Dein Stream
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Fehler: \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('Warten...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Wert: \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Stream beendet. Letzter Wert: \\${snapshot.data}');
    }
  },
)
// Beispiel eines einfachen Streams, der Zahlen emittiert
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Emittiert den Wert
  }
}