Menu
Coddy logo textTech

Contrôleurs de Streams

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 78 sur 110.

Alors que les générateurs async* sont excellents pour créer des flux avec des données prédéfinies, vous avez parfois besoin de plus de contrôle - comme ajouter des données à un flux à partir de différentes parties de votre code. C'est là que StreamController intervient.

Un StreamController agit comme un gestionnaire pour un flux. Il vous fournit un « sink » auquel ajouter des données et un « stream » auquel les écouteurs peuvent s’abonner :

import 'dart:async';

void main() {
  var controller = StreamController<String>();
  
  // Écouter le flux
  controller.stream.listen((data) {
    print('Received: $data');
  });
  
  // Ajouter des données via le sink
  controller.add('Hello');
  controller.add('World');
  
  controller.close();  // Toujours fermer une fois terminé
}

La méthode add() ajoute de nouvelles valeurs dans le flux, et tous les écouteurs les reçoivent immédiatement. Vous devriez toujours appeler close() lorsque vous avez terminé pour libérer les ressources.

Par défaut, un flux ne peut avoir qu’un seul écouteur. Pour plusieurs écouteurs, utilisez un contrôleur de diffusion :

import 'dart:async';

void main() {
  var controller = StreamController<int>.broadcast();
  
  controller.stream.listen((n) => print('Listener 1: $n'));
  controller.stream.listen((n) => print('Listener 2: $n'));
  
  controller.add(42);
  controller.close();
}

Les StreamControllers sont essentiels en POO pour construire des classes pilotées par les événements - comme notifier plusieurs parties de votre application lorsque les données changent, gérer les actions de l'utilisateur ou gérer les mises à jour en temps réel au sein de vos objets.

challenge icon

Défi

Facile

Construisons un système de hub de messages qui permet à plusieurs abonnés de recevoir des messages en temps réel ! Vous utiliserez un StreamController pour gérer le flux des messages et découvrir comment les flux de diffusion permettent à plusieurs écouteurs de s’abonner.

Vous organiserez votre code en deux fichiers :

  • message_hub.dart : créez une classe MessageHub qui gère la distribution des messages à l’aide d’un StreamController. Votre hub doit :
    • utiliser en interne un StreamController<String> de diffusion afin que plusieurs écouteurs puissent s’abonner
    • fournir un accesseur appelé messages qui renvoie le flux auquel les écouteurs peuvent s’abonner
    • posséder une méthode broadcast(String message) qui ajoute un message au flux
    • posséder une méthode shutdown() qui ferme le contrôleur
  • main.dart : importez votre hub de messages et mettez en place un scénario avec plusieurs abonnés qui écoutent le même flux :
    • créez une instance de MessageHub
    • ajoutez un premier écouteur qui affiche les messages au format suivant : Subscriber A: [message]
    • ajoutez un deuxième écouteur qui affiche les messages au format suivant : Subscriber B: [message]
    • diffusez trois messages : Hello everyone, Welcome to the hub et Goodbye
    • arrêtez le hub

N’oubliez pas d’importer dart:async dans votre fichier de hub de messages pour accéder à StreamController. Remarquez comment les deux abonnés reçoivent chaque message diffusé : c’est toute la puissance des flux de diffusion !

Sortie attendue :

Subscriber A: Hello everyone
Subscriber B: Hello everyone
Subscriber A: Welcome to the hub
Subscriber B: Welcome to the hub
Subscriber A: Goodbye
Subscriber B: Goodbye

Essayez vous-même

import 'message_hub.dart';

void main() {
  // TODO: Créer une instance de MessageHub
  
  // TODO: Ajouter un premier écouteur qui affiche : Subscriber A: [message]
  
  // TODO: Ajouter un deuxième écouteur qui affiche : Subscriber B: [message]
  
  // TODO: Diffuser trois messages :
  // - "Hello everyone"
  // - "Welcome to the hub"
  // - "Goodbye"
  
  // TODO: Fermer le hub
}
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

Entraînez-vous par vous-même : Compilateur Dart en ligne