Bases des Streams
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 77 sur 110.
Alors qu'un Future fournit une valeur unique, un Stream fournit une séquence de valeurs au fil du temps. Considérez-le comme un tuyau qui peut émettre plusieurs éléments de données - parfait pour les événements, les mises à jour en temps réel ou le traitement des données morceau par morceau.
Vous pouvez créer un flux simple en utilisant Stream.fromIterable() ou une fonction génératrice asynchrone avec async* et yield :
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}
// Résultat : 1, 2, 3Le mot-clé async* marque une fonction qui retourne un Stream, et yield émet chaque valeur. Pour consommer le flux, utilisez await for qui traite chaque valeur au fur et à mesure qu'elle arrive.
Vous pouvez également écouter un flux en utilisant la méthode listen(), qui prend une fonction de rappel :
Stream<String> greetings() async* {
yield 'Hello';
yield 'Hi';
yield 'Hey';
}
void main() {
greetings().listen((message) {
print(message);
});
}La différence clé par rapport aux Futures : un Future se termine une seule fois avec une valeur unique, tandis qu'un Stream peut émettre de nombreuses valeurs avant de se terminer. Cela rend les Streams idéaux pour gérer des données continues telles que les interactions utilisateur, les lectures de capteurs ou les données arrivant par morceaux.
Défi
FacileConstruisons un système de compte à rebours qui émet des valeurs au fil du temps en utilisant des flux (streams) ! Vous allez créer une classe qui génère une séquence de nombres de compte à rebours, démontrant comment les flux délivrent plusieurs valeurs plutôt qu'une seule.
Vous organiserez votre code en deux fichiers :
countdown.dart: Créez une classeCountdownqui génère des flux de compte à rebours. Votre classe doit avoir :- Un champ
start(int) qui stocke le nombre de départ pour le compte à rebours - Un constructeur qui prend le nombre de départ
- Une méthode
countDown()qui retourne unStream<int>. Utilisezasync*etyieldpour émettre des nombres destartjusqu'à0(inclus) - Une méthode
countDownWithMessage()qui retourne unStream<String>. Celle-ci doit émettre des chaînes de caractères au format'T-minus [number]'pour chaque nombre destartjusqu'à1, puis émettre'Liftoff!'comme valeur finale
- Un champ
main.dart: Importez votre fichier de compte à rebours et démontrez les deux méthodes de flux. Votre fonction principale doit être async et :- Créer une instance de
Countdowncommençant à partir de3 - Afficher
Number countdown: - Utiliser
await forpour itérer à traverscountDown()et afficher chaque nombre - Afficher une ligne vide
- Afficher
Launch sequence: - Utiliser
await forpour itérer à traverscountDownWithMessage()et afficher chaque message
- Créer une instance de
Remarquez comment chaque instruction yield émet une valeur à travers le flux, et comment await for traite chaque valeur au fur et à mesure qu'elle arrive. Contrairement à un Future qui délivre un seul résultat, vos flux émettront plusieurs valeurs en séquence !
Sortie attendue :
Number countdown:
3
2
1
0
Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!Aide-mémoire
Un Stream délivre une séquence de valeurs au fil du temps, contrairement à un Future qui délivre une seule valeur. Les Streams sont idéaux pour les événements, les mises à jour en temps réel ou le traitement de données morceau par morceau.
Créez un flux (stream) en utilisant une fonction génératrice asynchrone avec async* et yield :
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}Consommez un flux en utilisant await for :
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}Alternativement, utilisez la méthode listen() avec un rappel (callback) :
void main() {
greetings().listen((message) {
print(message);
});
}Vous pouvez également créer un flux à partir d'un itérable en utilisant Stream.fromIterable().
Essayez vous-même
import 'countdown.dart';
Future<void> main() async {
// TODO: Créer une instance de Countdown commençant à 3
// TODO: Afficher 'Number countdown:'
// TODO: Utiliser await for pour itérer à travers countDown() et afficher chaque nombre
// TODO: Afficher une ligne vide
// TODO: Afficher 'Launch sequence:'
// TODO: Utiliser await for pour itérer à travers countDownWithMessage() et afficher chaque message
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository