Junior
Kokia yra srautų naudojimo Flutter?
sobes.tech AI
Atsakymas iš AI
Flutter'e naudojami srautai (streams) asinchroninių įvykių sekos apdorojimui:
Pagrindiniai taikymai:
- Duomenų pokyčių reagavimas: Redux, BLoC modeliai naudoja srautus valdyti programos būseną ir reaguojamai atnaujinti UI pokyčių metu:
- Srautinių duomenų apdorojimas: Tinklo duomenų gavimas (pvz., WebSocket), failų skaitymas, jutiklių naudojimas:
- Vartotojo sąveikos apdorojimas: Slinkimo stebėjimas, Draggable / DragTarget:
- Asinchroninės operacijos: Užduočių vykdymas fone ir rezultatų gavimas jų paruošimo metu:
Pagrindinės sąvokos:
- Stream: Asinchroninių įvykių seka. Srautas gali išleisti 0 ar daugiau įvykių, tada užbaigti (sėkmingai ar su klaida):
- StreamSubscription: Reprezentuoja prenumeratą srautui. Leidžia gauti įvykius iš srauto ir valdyti prenumeratą (paleisti, atnaujinti, atšaukti):
- Sink: Naudojamas duomenų pridėjimui į srautą:
- StreamBuilder: Widget'as, kuris perkonstruojamas gaunant naujus duomenis iš srauto:
// Pavyzdys naudojant StreamBuilder
StreamBuilder<int>(
stream: counterStream, // Jūsų srautas
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (snapshot.hasError) {
return Text('Klaida: ${snapshot.error}');
}
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('Laukiama...');
case ConnectionState.waiting:
return CircularProgressIndicator();
case ConnectionState.active:
return Text('Reikšmė: ${snapshot.data}');
case ConnectionState.done:
return Text('Srautas baigtas. Paskutinė reikšmė: ${snapshot.data}');
}
},
)
// Paprastas srauto pavyzdys, kuris išmeta skaičius
Stream<int> countStream(int max) async* {
for (int i = 0; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i; // Išmetame reikšmę
}
}