Sobes.tech
Junior

Do czego służą strumienie w Flutterze?

sobes.tech AI

Odpowiedź od AI

Strumienie w Flutterze służą do obsługi sekwencji zdarzeń asynchronicznych.

Główne przypadki użycia:

  1. Reagowanie na zmiany danych: Redux, wzorce BLoC używają strumieni do zarządzania stanem aplikacji i reaktywnej aktualizacji UI przy zmianach.
  2. Praca z danymi strumieniowymi: Pobieranie danych przez sieć (np. WebSocket), odczyt z plików, praca z czujnikami urządzenia.
  3. Obsługa interakcji użytkownika: Śledzenie przewijania, Draggable / DragTarget.
  4. Operacje asynchroniczne: Wykonywanie zadań w tle i pobieranie wyników w miarę ich dostępności.

Kluczowe pojęcia:

  • Stream: Sekwencja zdarzeń asynchronicznych. Strumień może emitować 0 lub więcej zdarzeń, a następnie się kończyć (sukcesem lub błędem).
  • StreamSubscription: Reprezentuje subskrypcję na strumień. Pozwala na odbieranie zdarzeń i zarządzanie subskrypcją (wstrzymywanie, wznawianie, anulowanie).
  • Sink: Używany do dodawania danych do strumienia.
  • StreamBuilder: Widget, który przebudowuje się po otrzymaniu nowych danych ze strumienia.
// Przykład użycia StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // Twój strumień
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Błąd: \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('Oczekiwanie...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Wartość: \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Strumień zakończony. Ostatnia wartość: \\${snapshot.data}');
    }
  },
)
// Przykład prostego strumienia, który emituje liczby
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Emisja wartości
  }
}