Sobes.tech
Junior

A cosa servono gli stream in Flutter?

sobes.tech AI

Risposta dell'AI

Gli stream in Flutter vengono utilizzati per gestire sequenze di eventi asincroni.

Principali casi d'uso:

  1. Rispondere alle modifiche dei dati: Redux, pattern BLoC utilizzano gli stream per gestire lo stato dell'applicazione e aggiornare l'UI in modo reattivo quando ci sono modifiche.
  2. Lavorare con dati in streaming: Ottenere dati tramite rete (ad esempio, WebSocket), leggere da file, lavorare con i sensori del dispositivo.
  3. Gestire le interazioni dell'utente: Monitorare lo scorrimento, Draggable / DragTarget.
  4. Operazioni asincrone: Eseguire compiti in background e ottenere i risultati man mano che sono pronti.

Concetti chiave:

  • Stream: Sequenza di eventi asincroni. Uno stream può emettere 0 o più eventi e poi terminare (con successo o errore).
  • StreamSubscription: Rappresenta una sottoscrizione a uno stream. Permette di ricevere eventi dallo stream e di gestire la sottoscrizione (pausare, riprendere, cancellare).
  • Sink: Usato per aggiungere dati allo stream.
  • StreamBuilder: Widget che si ricostruisce quando riceve nuovi dati dallo stream.
// Esempio di utilizzo di StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // Il tuo stream
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Errore: \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('In attesa...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Valore: \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Stream terminato. Ultimo valore: \\${snapshot.data}');
    }
  },
)
// Esempio di uno stream semplice che emette numeri
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Emette il valore
  }
}