Course image
Stream

Dart Begin

Lesson image blurred

Lezione premium

Acquista per guardare questa e tutte le altre video lezioni del corso, illimitatamente.

Acquista il corso per 14,99 €

Risorse

Aggiornamento 1/10/2024: sulla base dei feedback ricevuti su questa lezione, abbiamo deciso di registrarla da zero, con un altro approccio, così da renderla più chiara. Intanto, di seguito c'è una spiegazione testuale che può essere d'aiuto per comprendere meglio la spiegazione fornita nell'attuale lezione.

Applicazioni degli stream

Prima di partire con la spiegazione degli Stream, cerchiamo di fare qualche esempio sul perché ci sono utili: gli Stream sono il modo in cui app come WhatsApp e giochi come Clash Royale funzionano. Uno stream è uno scambio di messaggi ed informazioni in tempo reale.

Introduzione agli Stream

Andiamo ora più tecnici. Gli Stream in Flutter (e in Dart) sono un modo per gestire flussi di dati asincroni. Immagina uno stream come un tubo attraverso il quale i dati passano uno alla volta, in ordine.

1--------------------------------------------------2 |Dato|     |Dato|             |Dato| |Dato|3--------------------------------------------------
markdown

Questo è particolarmente utile quando i dati non sono disponibili tutti subito, ma arrivano man mano, come eventi dell'utente, aggiornamenti da una rete o altri cambiamenti nel tempo.

Come creare uno Stream?

Per creare uno Stream che emette una sequenza di valori nel tempo, ci basta creare una funzione.

Questa funzione però deve essere dichiarata come Stream, come fare questo?

Basta aggiungere la keyword async*, cosi:

1// Immaginiamo di voler definire uno Stream di messaggi per un app di chat (come WhatsApp):2Stream<MessageModel> riceviMessaggiDaServer() async* {3
4}5
6// Nota come questa funzione (che è uno Stream) assomigli molto ad una funzione asincrona:7Future<MessageModel[]> riceviMessaggiDaServer() async {8
9}
dart

Come emettere nuovi valori dallo Stream?

Cosi come nelle normali funzoni usiamo il return <valore> per ritornare un valore da una funzione, nelle funzioni dichiarate come Stream usiamo yield <valore> per emettere un nuovo valore dallo stream.

Ricorda però la differenza: il return segna la fine dell'esecuzione di una funzione, mentre yield emmette semplicemente un nuovo valore, ma non termina l'esecuzione dello Stream.

Facciamo un esempio:

1Stream<MessageModel> riceviMessaggiDaServer() async* {2 yield MessageModel(text: "Hey!");3 yield MessageModel(text: "Ci sei per stasera?");4 yield MessageModel(text: "Andiamo tutti a mangiare una pizza!");5
6 // Non ci sono altri yield da eseguire quindi la funzione termina qui.7}8
9// Se vogliamo avere uno Stream che non termina mai possiamo banalmente usare un while(true)10Stream<MessageModel> riceviMessaggiDaServer() async* {11 // Questa è una funzione (asincrona, quindi eseguita in background) che girerà in loop per sempre (while(true))12 // ed ad ogni ciclo bloccherà l'esecuzione fino a quando non c'è un nuovo messaggio che ottiene dalla funzione getMessageFromServer.13 while (true) {14   final message = await getMessageFromServer();15   yield message;16 }17}
dart

Ascoltare uno Stream

Per ricevere i dati emessi da uno stream, devi metterti in ascolto usando il metodo listen.

Esempio:

1void main() {2 riceviMessaggiDaServer().listen((messaggio) {3   print('Ricevuto: ${messaggio.text}');4 });5}
dart

Questo codice stamperà:

1Ricevuto: "Hey!"2Ricevuto: "Ci sei per stasera?"3Ricevuto: "Andiamo tutti a mangiare una pizza!"
markdown

Riepilogo

  • Stream: un tubo che contiene al suo interno un flusso di dati asincroni nel tempo.
  • async*: indica che la funzione è uno Stream.
  • yield: permette di emettere valori dallo stream senza terminare la funzione.
  • Ascoltare uno stream: con listen, passiamo una funzione che viene richiamata ogni volta che c'è un nuovo valore nello stream.

Esempi in cui gli Stream vengono utilizzati

  • WhatsApp
  • Slack
  • Netflix
  • Google Meet
  • Quasi tutti i videogiochi

Domande & Risposte

Sezione riservata agli iscritti al corso

Acquista il corso per accedere alle Domande & Risposte.