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>
}Sfida
FacileCostruiamo 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 classeWeatherServiceche simula il recupero delle informazioni meteorologiche. La classe dovrebbe avere:- Un metodo
fetchTemperature(String city)che restituisce unFuture<int>. UsaFuture.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 unFuture<String>. UsaFuture.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 unFuture<String>. Questo metodo dovrebbe attendere siafetchTemperaturesiafetchCondition, quindi restituire una stringa formattata:'[city]: [temperature]C, [condition]'
- Un metodo
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!
- Creare un'istanza di
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!'
}
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
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online