Sobes.tech
Junior

Pentru ce sunt folosiți stream-urile în Flutter?

sobes.tech AI

Răspuns de la AI

Stream-urile în Flutter sunt utilizate pentru a procesa secvențe de evenimente asincrone.

Cazurile principale de utilizare:

  1. Reacționarea la modificările datelor: Redux, modelele BLoC folosesc stream-uri pentru a gestiona starea aplicației și pentru a actualiza UI-ul în mod reactiv la modificări.
  2. Lucrul cu date în flux: Obținerea datelor prin rețea (de exemplu, WebSocket), citirea din fișiere, lucrul cu senzorii dispozitivului.
  3. Procesarea interacțiunilor utilizatorului: Urmărirea derulării, Draggable / DragTarget.
  4. Operații asincrone: Executarea de sarcini în fundal și obținerea rezultatelor pe măsură ce sunt gata.

Concepte cheie:

  • Stream: Secvență de evenimente asincrone. Un stream poate emite 0 sau mai multe evenimente și apoi se încheie (cu succes sau cu eroare).
  • StreamSubscription: Reprezintă o abonare la un stream. Permite primirea evenimentelor din stream și gestionarea abonamentului (pauză, reluare, anulare).
  • Sink: Folosit pentru a adăuga date în stream.
  • StreamBuilder: Widget care se reconstruiște la primirea de noi date din stream.
// Exemplu de utilizare a StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // Stream-ul tău
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Eroare: \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('Așteaptă...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Valoare: \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Stream încheiat. Ultima valoare: \\${snapshot.data}');
    }
  },
)
// Exemplu de stream simplu care emite numere
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Emite valoarea
  }
}