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:
- Reagowanie na zmiany danych: Redux, wzorce BLoC używają strumieni do zarządzania stanem aplikacji i reaktywnej aktualizacji UI przy zmianach.
- Praca z danymi strumieniowymi: Pobieranie danych przez sieć (np. WebSocket), odczyt z plików, praca z czujnikami urządzenia.
- Obsługa interakcji użytkownika: Śledzenie przewijania, Draggable / DragTarget.
- 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
}
}