Les flux et les blocs sont des concepts Dart avancés qui vous permettent de manipuler des données de manière asynchrone et réactive, respectivement. Ces concepts sont fondamentaux pour créer des applications complexes et efficaces, et sont largement utilisés dans Flutter.
Flux
Dans Dart, un Stream est une séquence d'événements asynchrones. Il peut émettre zéro ou plusieurs événements de données, ainsi qu'un événement d'erreur ou d'achèvement. Les événements de données sont émis séquentiellement et peuvent être consommés par un écouteur, qui est une fonction qui traite les événements au fur et à mesure qu'ils se produisent.
Un flux peut être créé de plusieurs manières. Le moyen le plus simple consiste à utiliser la fonction Stream.fromIterable, qui crée un Stream à partir d'une collection itérable. Par exemple :
Ce code crée un Stream qui génère les nombres 1 à 5, un à la fois. La fonction d'écoute est utilisée pour enregistrer un auditeur qui imprime chaque numéro au fur et à mesure de son émission.
Des flux peuvent également être créés à partir de sources de données asynchrones, telles que des fichiers ou des connexions réseau. Par exemple, la classe File sur Dart possède une méthode openRead qui renvoie un Stream d'octets. Cette méthode peut être utilisée pour lire un fichier de manière asynchrone, comme dans cet exemple :
Ce code lit un fichier appelé « file.txt » et imprime son contenu sous forme de texte. Le Stream émet des événements de données au fur et à mesure que les octets sont lus dans le fichier, et l'écouteur les convertit en texte et les imprime.
Blocs
Dans Flutter, le modèle Bloc (Business Logic Component) est utilisé pour séparer la logique métier de l'interface utilisateur. Un Bloc est une classe qui expose un flux d'états et accepte des événements. La logique métier est implémentée sous la forme d'une fonction qui mappe les événements aux états.
Par exemple, considérons une application de liste de tâches. L'interface utilisateur peut émettre des événements tels que « ajouter une tâche » ou « supprimer une tâche », et l'état de l'application peut être la liste actuelle des tâches. Un Bloc pour cette application peut être implémenté comme suit :
- >();
final _eventController = StreamController
- > get stateStream => _stateController.stream;
Sink
Ce code définit un bloc qui a un flux d'états et un récepteur d'événements. Sink est une interface qui vous permet d'ajouter des événements au Stream. La méthode _mapEventToState est appelée pour chaque événement et est responsable de la mise à jour de l'état en fonction de l'événement.
En résumé, les Streams et les Blocs sont des concepts Dart puissants qui permettent de créer des applications réactives et efficaces. Les flux vous permettent de manipuler les données de manière asynchrone, tandis que les blocs vous permettent de séparer la logique métier de l'interface utilisateur. Les deux sont fondamentaux pour créer des applications complexes avec Flutter.