Menu
Coddy logo textTech

Futures et async/await

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

Dans les applications réelles, de nombreuses opérations prennent du temps - récupérer des données depuis un serveur, lire des fichiers ou attendre une saisie de l'utilisateur. Dart gère cela avec Future, qui représente une valeur qui sera disponible à un moment donné dans le futur.

Un Future est comme une promesse : « Je vous donnerai le résultat quand il sera prêt. » Vous pouvez en créer un en utilisant Future.delayed() pour simuler une opération qui prend du temps :

Future<String> fetchUserName() {
  return Future.delayed(
    Duration(seconds: 1),
    () => 'Alice',
  );
}

Pour travailler avec le résultat d’un Future, utilisez async et await. Marquez votre fonction comme async, puis utilisez await pour mettre l’exécution en pause jusqu’à ce que le Future soit terminé :

Future<void> main() async {
  print('Fetching user...');
  String name = await fetchUserName();
  print('Hello, $name!');
}

Future<String> fetchUserName() {
  return Future.delayed(
    Duration(seconds: 1),
    () => 'Alice',
  );
}

Sans await, vous obtiendriez un Future<String> au lieu de la chaîne réelle. Le mot-clé await décompresse le Future et vous donne la valeur qu’il contient. Notez que toute fonction utilisant await doit être marquée async, et qu’elle renvoie automatiquement un Future.

Vous pouvez également retourner des valeurs directement depuis des fonctions async : Dart les enveloppe automatiquement dans un Future :

Future<int> calculateTotal() async {
  var a = await fetchNumber();
  var b = await fetchNumber();
  return a + b;  // Automatiquement encapsulé dans Future<int>
}
challenge icon

Défi

Facile

Construisons un service météo qui simule la récupération de données météorologiques depuis différentes villes ! Tu t’exerceras à utiliser Future, async et await pour gérer les opérations qui prennent du temps à se terminer.

Tu organiseras ton code en deux fichiers :

  • weather_service.dart : crée une classe WeatherService qui simule la récupération d’informations météorologiques. Ta classe doit comporter :
    • Une méthode fetchTemperature(String city) qui renvoie un Future<int>. Utilise Future.delayed() avec une durée de 100 millisecondes pour simuler le délai réseau. La méthode doit renvoyer une température basée sur le nom de la ville : renvoie la longueur du nom de la ville multipliée par 3.
    • Une méthode fetchCondition(String city) qui renvoie un Future<String>. Utilise Future.delayed() avec un délai de 100 millisecondes. Renvoie 'Sunny' si le nom de la ville comporte un nombre pair de caractères, sinon renvoie 'Cloudy'.
    • Une méthode asynchrone getFullReport(String city) qui renvoie un Future<String>. Cette méthode doit attendre fetchTemperature et fetchCondition, puis renvoyer une chaîne formatée : '[city]: [temperature]C, [condition]'
  • main.dart : importe ton service météo et montre comment fonctionnent les opérations asynchrones. Ta fonction principale doit être asynchrone et :
    • Créer une instance de WeatherService
    • Afficher Fetching weather data...
    • Attendre et afficher le rapport complet pour 'Paris'
    • Attendre et afficher le rapport complet pour 'Tokyo'
    • Attendre et afficher le rapport complet pour 'London'
    • Afficher Done!

Remarque que chaque appel à getFullReport attend que la température et les conditions soient récupérées avant de renvoyer le résultat combiné. Le mot-clé await interrompt l’exécution jusqu’à ce que chaque Future soit terminé !

Sortie attendue :

Fetching weather data...
Paris: 15C, Cloudy
Tokyo: 15C, Cloudy
London: 18C, Sunny
Done!

Essayez vous-même

import 'weather_service.dart';

Future<void> main() async {
  // TODO: Créer une instance de WeatherService
  
  // TODO: Afficher 'Fetching weather data...'
  
  // TODO: Attendre et afficher le rapport complet pour 'Paris'
  
  // TODO: Attendre et afficher le rapport complet pour 'Tokyo'
  
  // TODO: Attendre et afficher le rapport complet pour 'London'
  
  // TODO: Afficher 'Done!'
}
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