Flutter et les streams

  • Données asynchrones

Définition d’un stream #

Comme le rappelle le site du langage Dart, un stream est un moyen de recevoir une séquence d’événements. Les événements transmis sont dits asynchrones c’est à dire que les données n’arrivent pas de manière régulières, continues ou en direct.

Pour expliquer cela on peut prendre l’exemple d’un robinet. Soit il est ouvert soit il est fermé. L’eau circule de manière aléatoire, puisqu’à certains moments on peut décider d’augmenter le flux d’eau ou simplement fermer le robinet pendant plusieurs heures. Il n’y a pas de régularité.

Il a deux types de de streams: les “single-subscription” streams et les “broadcast” stream.

Les différents types de Streams #

Les streams “singles-subscription” #

Il commence à envoyer des événements dès qu’il est écouté et arrête lorsqu’il n’est plus écouté. Il ne peut être écouté qu’une fois par un seul listener sinon on obtient une erreur.

Les streams “broadcast” #

Les broadcast streams permettent plusieurs listeners. Les listeners ajoutés au moment de l’apparition d’un événement ne recevra pas l’événement.

Capter les événements relatifs au flux #

Plusieurs méthodes permettent de gérer le flux du stream.

  • monStream.listen: elle permet d’écouter le stream et donc de réagir en conséquence.
  • onError: En cas d’erreur, on va utiliser la méthode onError et on pourra ensuite régir le comportement de l’application par exemple montrer un CircularProgressIndicator().

On peut surveiller le cas

  • onDone: c’est le cas ou notre stream a fini. Le stream va alors cesser de recevoir les events.

Gérer le flux d’un stream #

Ce stream on va pouvoir soit le mettre en pause, le faire reprendre ou bien l’annuler. Voici les 3 méthodes:

  • subscription.pause();
  • subscription.resume();
  • subscription.cancel();

Gérer les données obtenues #

Une fois que nous avons notre stream, nous pouvons effectuer certaines tâches à chaque apparition d’un événement. Par exemple

NumberCreator().stream
     .map((i) => 'String §i')
     .listen(print);

Ici à chaque événement on va utiliser les int du stream pour les convertir en String et puis ensuite pour imprimer ce que le stream dit.