Menu
Coddy logo textTech

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, 3

Le 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.

challenge icon

Défi

Facile

Construisons 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 classe Countdown qui 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 un Stream<int>. Utilisez async* et yield pour émettre des nombres de start jusqu'à 0 (inclus)
    • Une méthode countDownWithMessage() qui retourne un Stream<String>. Celle-ci doit émettre des chaînes de caractères au format 'T-minus [number]' pour chaque nombre de start jusqu'à 1, puis émettre 'Liftoff!' comme valeur finale
  • 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 Countdown commençant à partir de 3
    • Afficher Number countdown:
    • Utiliser await for pour itérer à travers countDown() et afficher chaque nombre
    • Afficher une ligne vide
    • Afficher Launch sequence:
    • Utiliser await for pour itérer à travers countDownWithMessage() et afficher chaque message

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
}
quiz iconTestez-vous

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