Menu
Coddy logo textTech

Future e async/await

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 76 di 110.

Nelle applicazioni reali, molte operazioni richiedono tempo: recuperare dati da un server, leggere file o attendere l'input dell'utente. Dart gestisce queste operazioni con Future, che rappresenta un valore che sarà disponibile in futuro.

Un Future è come una promessa: "Ti darò il risultato quando sarà pronto." Puoi crearne uno usando Future.delayed() per simulare un'operazione che richiede tempo:

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

Per lavorare con il risultato di un Future, usa async e await. Contrassegna la tua funzione come async, quindi usa await per mettere in pausa l'esecuzione finché il Future non viene completato:

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

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

Senza await, otterresti un Future<String> invece della stringa effettiva. La parola chiave await estrae il valore dal Future e ti restituisce il valore contenuto al suo interno. Nota che qualsiasi funzione che usa await deve essere contrassegnata con async e restituisce automaticamente un Future.

Puoi anche restituire valori direttamente dalle funzioni asincrone: Dart li racchiude automaticamente in un Future:

Future<int> calculateTotal() async {
  var a = await fetchNumber();
  var b = await fetchNumber();
  return a + b;  // Automaticamente racchiuso in Future<int>
}
challenge icon

Sfida

Facile

Costruiamo un servizio meteo che simula il recupero dei dati meteorologici da diverse città! Ti eserciterai a usare Future, async e await per gestire operazioni che richiedono tempo per essere completate.

Organizzerai il codice in due file:

  • weather_service.dart: crea una classe WeatherService che simula il recupero delle informazioni meteorologiche. La classe dovrebbe avere:
    • Un metodo fetchTemperature(String city) che restituisce un Future<int>. Usa Future.delayed() con una durata di 100 millisecondi per simulare la latenza di rete. Il metodo dovrebbe restituire una temperatura basata sul nome della città: restituisci la lunghezza del nome della città moltiplicata per 3.
    • Un metodo fetchCondition(String city) che restituisce un Future<String>. Usa Future.delayed() con un ritardo di 100 millisecondi. Restituisci 'Sunny' se il nome della città ha un numero pari di caratteri, altrimenti restituisci 'Cloudy'.
    • Un metodo asincrono getFullReport(String city) che restituisce un Future<String>. Questo metodo dovrebbe attendere sia fetchTemperature sia fetchCondition, quindi restituire una stringa formattata: '[city]: [temperature]C, [condition]'
  • main.dart: importa il servizio meteo e mostra come funzionano le operazioni asincrone. La funzione principale dovrebbe essere asincrona e:
    • Creare un'istanza di WeatherService
    • Stampare Fetching weather data...
    • Attendere e stampare il report completo per 'Paris'
    • Attendere e stampare il report completo per 'Tokyo'
    • Attendere e stampare il report completo per 'London'
    • Stampare Done!

Nota come ogni chiamata a getFullReport attenda che siano recuperate sia la temperatura sia la condizione prima di restituire il risultato combinato. La parola chiave await mette in pausa l'esecuzione finché ogni Future non viene completato!

Output previsto:

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

Provalo tu

import 'weather_service.dart';

Future<void> main() async {
  // TODO: Crea un'istanza di WeatherService
  
  // TODO: Stampa 'Fetching weather data...'
  
  // TODO: Attendi e stampa il report completo per 'Paris'
  
  // TODO: Attendi e stampa il report completo per 'Tokyo'
  
  // TODO: Attendi e stampa il report completo per 'London'
  
  // TODO: Stampa 'Done!'
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online