Nozioni di base sugli stream
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 77 di 110.
Mentre un Future restituisce un singolo valore, uno Stream restituisce una sequenza di valori nel tempo. Pensalo come a un tubo che può emettere più elementi di dati: perfetto per gli eventi, gli aggiornamenti in tempo reale o l’elaborazione dei dati un elemento alla volta.
Puoi creare uno stream semplice usando Stream.fromIterable() oppure una funzione generatrice asincrona con async* e yield:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}
// Output: 1, 2, 3La parola chiave async* contrassegna una funzione che restituisce uno Stream, e yield emette ogni valore. Per consumare lo stream, usa await for, che elabora ogni valore man mano che arriva.
Puoi anche ascoltare uno stream usando il metodo listen(), che accetta una funzione di callback:
Stream<String> greetings() async* {
yield 'Hello';
yield 'Hi';
yield 'Hey';
}
void main() {
greetings().listen((message) {
print(message);
});
}La differenza fondamentale rispetto ai Future: un Future si completa una sola volta con un singolo valore, mentre uno Stream può emettere molti valori prima di terminare. Questo rende gli Stream ideali per gestire dati continui come le interazioni degli utenti, le letture dei sensori o i dati che arrivano in blocchi.
Sfida
FacileCreiamo un sistema di timer per il conto alla rovescia che emette valori nel tempo usando gli stream! Creerai una classe che genera una sequenza di numeri per il conto alla rovescia, mostrando come gli stream forniscano più valori invece di uno solo.
Organizzerai il codice in due file:
countdown.dart: crea una classeCountdownche genera stream per il conto alla rovescia. La classe dovrebbe avere:- Un campo
start(int) che memorizza il numero di partenza del conto alla rovescia - Un costruttore che accetta il numero di partenza
- Un metodo
countDown()che restituisce unoStream<int>. Usaasync*eyieldper emettere numeri dastartfino a0(incluso) - Un metodo
countDownWithMessage()che restituisce unoStream<String>. Dovrebbe emettere stringhe nel formato'T-minus [number]'per ogni numero dastartfino a1, poi emettere'Liftoff!'come valore finale
- Un campo
main.dart: importa il file del conto alla rovescia e mostra entrambi i metodi dello stream. La funzione main dovrebbe essere async e:- Creare un'istanza di
Countdowncon valore iniziale3 - Stampare
Number countdown: - Usare
await forper iterare sucountDown()e stampare ogni numero - Stampare una riga vuota
- Stampare
Launch sequence: - Usare
await forper iterare sucountDownWithMessage()e stampare ogni messaggio
- Creare un'istanza di
Nota come ogni istruzione yield emetta un valore attraverso lo stream e await for elabori ogni valore man mano che arriva. A differenza di un Future, che fornisce un solo risultato, i tuoi stream emetteranno più valori in sequenza!
Output previsto:
Number countdown:
3
2
1
0
Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!Provalo tu
import 'countdown.dart';
Future<void> main() async {
// TODO: Crea un'istanza di Countdown che inizi da 3
// TODO: Stampa 'Number countdown:'
// TODO: Usa await for per iterare su countDown() e stampare ogni numero
// TODO: Stampa una riga vuota
// TODO: Stampa 'Launch sequence:'
// TODO: Usa await for per iterare su countDownWithMessage() e stampare ogni messaggio
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online