Acquista per guardare questa e tutte le altre video lezioni del corso, illimitatamente.
Acquista il corso per 14,99 €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.
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.
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.
markdown1--------------------------------------------------2 |Dato| |Dato| |Dato| |Dato|3--------------------------------------------------
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.
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:
dart1// 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}
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:
dart1Stream<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}
Per ricevere i dati emessi da uno stream, devi metterti in ascolto usando il metodo listen.
dart1void main() {2 riceviMessaggiDaServer().listen((messaggio) {3 print('Ricevuto: ${messaggio.text}');4 });5}
Questo codice stamperà:
markdown1Ricevuto: "Hey!"2Ricevuto: "Ci sei per stasera?"3Ricevuto: "Andiamo tutti a mangiare una pizza!"
Acquista il corso per accedere alle Domande & Risposte.