Sobes.tech
Junior

À quoi servent les streams dans Flutter?

sobes.tech IA

Réponse de l'IA

Les flux (streams) dans Flutter sont utilisés pour gérer des séquences d'événements asynchrones.

Cas d'utilisation principaux :

  1. Réagir aux changements de données : Redux, modèles BLoC utilisent des flux pour gérer l'état de l'application et mettre à jour l'interface utilisateur de manière réactive lors des changements.
  2. Travailler avec des données en flux : Récupération de données via le réseau (par exemple, WebSocket), lecture de fichiers, interaction avec les capteurs de l'appareil.
  3. Traiter les interactions utilisateur : Suivi du défilement, Draggable / DragTarget.
  4. Opérations asynchrones : Exécuter des tâches en arrière-plan et obtenir les résultats à mesure qu'ils sont prêts.

Concepts clés :

  • Stream : Séquence d'événements asynchrones. Un flux peut émettre 0 ou plusieurs événements, puis se terminer (avec succès ou erreur).
  • StreamSubscription : Représente un abonnement à un flux. Permet de recevoir des événements du flux et de gérer l'abonnement (pause, reprise, annulation).
  • Sink : Utilisé pour ajouter des données au flux.
  • StreamBuilder : Widget qui se reconstruit lors de la réception de nouvelles données du flux.
// Exemple d'utilisation de StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // Votre flux
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Erreur : \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('En attente...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Valeur : \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Flux terminé. Dernière valeur : \\${snapshot.data}');
    }
  },
)
// Exemple d'un flux simple qui émet des nombres
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Émet la valeur
  }
}