Sobes.tech
Junior

Kokia yra srautų naudojimo Flutter?

sobes.tech AI

Atsakymas iš AI

Flutter'e naudojami srautai (streams) asinchroninių įvykių sekos apdorojimui:

Pagrindiniai taikymai:

  1. Duomenų pokyčių reagavimas: Redux, BLoC modeliai naudoja srautus valdyti programos būseną ir reaguojamai atnaujinti UI pokyčių metu:
  2. Srautinių duomenų apdorojimas: Tinklo duomenų gavimas (pvz., WebSocket), failų skaitymas, jutiklių naudojimas:
  3. Vartotojo sąveikos apdorojimas: Slinkimo stebėjimas, Draggable / DragTarget:
  4. 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ę
  }
}