Async nei metodi di classe
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 80 di 110.
Ora che sai come gestire l'inizializzazione asincrona con i metodi factory, vediamo come rendere asincroni i normali metodi di istanza. È semplice: basta aggiungere async a qualsiasi metodo e far sì che restituisca un Future.
class WeatherService {
String _location;
WeatherService(this._location);
Future<String> fetchTemperature() async {
await Future.delayed(Duration(seconds: 1));
return '22°C in $_location';
}
Future<void> updateLocation(String newLocation) async {
await Future.delayed(Duration(milliseconds: 500));
_location = newLocation;
print('Location updated to $_location');
}
}
Future<void> main() async {
var service = WeatherService('London');
var temp = await service.fetchTemperature();
print(temp);
await service.updateLocation('Paris');
}I metodi asincroni possono accedere alle variabili di istanza e modificarle proprio come i metodi normali. La differenza principale è che chi li chiama deve usare await sul risultato. I metodi che restituiscono Future<void> non restituiscono un valore, ma devono comunque essere attesi se vuoi assicurarti che vengano completati prima di continuare.
Puoi anche combinare più chiamate asincrone all'interno di un metodo, oppure chiamare altri metodi asincroni della stessa classe:
Future<String> getFullReport() async {
var temp = await fetchTemperature();
var humidity = await fetchHumidity();
return '$temp, Humidity: $humidity';
}Questo schema è essenziale per le classi che interagiscono con risorse esterne, come API e database, o con qualsiasi operazione che richieda tempo.
Sfida
FacileCostruiamo un tracker del portafoglio azionario che gestisce i prezzi delle azioni e calcola i valori del portafoglio usando metodi asincroni! Creerai una classe che simula il recupero di dati azionari in tempo reale e combina più operazioni asincrone per generare report.
Organizzerai il codice in due file:
portfolio.dart: crea una classeStockPortfolioche tiene traccia delle azioni e delle relative quantità. La classe dovrebbe avere:- Una
Map<String, int>privata chiamata_holdingsche memorizza i simboli azionari e il numero di azioni possedute - Un costruttore che inizializza
_holdingscome mappa vuota - Un metodo
addStock(String symbol, int quantity)che aggiunge o aggiorna una posizione azionaria (non asincrono) - Un metodo asincrono
fetchPrice(String symbol)che restituisce unFuture<double>. Simula un ritardo di 50 millisecondi, quindi restituisci un prezzo calcolato come: la lunghezza del simbolo moltiplicata per 25.5 - Un metodo asincrono
getStockValue(String symbol)che restituisce unFuture<double>. Il metodo dovrebbe attenderefetchPriceper il simbolo, moltiplicare il risultato per la quantità posseduta e restituire il valore totale. Se il simbolo non è tra le posizioni, restituisci 0.0 - Un metodo asincrono
getTotalValue()che restituisce unFuture<double>. Il metodo dovrebbe calcolare il valore complessivo di tutte le posizioni attendendogetStockValueper ogni azione e sommando i risultati - Un metodo asincrono
generateReport()che restituisce unFuture<String>. Il metodo dovrebbe creare un report che mostri il valore di ogni azione e il totale. Formatta ogni riga come[symbol]: $[value](valore con 1 cifra decimale), seguita da una riga finaleTotal: $[totalValue](anch'esso con 1 cifra decimale)
- Una
main.dart: importa il file del portafoglio e mostra come i metodi asincroni collaborano all'interno di una classe:- Crea un'istanza di
StockPortfolio - Aggiungi queste posizioni:
AAPLcon 10 azioni,GOOGLcon 5 azioni,MSFTcon 8 azioni - Stampa
Fetching portfolio data... - Attendi e stampa il risultato di
generateReport()
- Crea un'istanza di
Nota come generateReport() chiami altri metodi asincroni all'interno della stessa classe e come ogni metodo si basi sugli altri. Usa toStringAsFixed(1) per formattare i valori decimali!
Output previsto:
Fetching portfolio data...
AAPL: $1020.0
GOOGL: $637.5
MSFT: $816.0
Total: $2473.5Provalo tu
import 'portfolio.dart';
void main() async {
// TODO: Crea un'istanza di StockPortfolio
// TODO: Aggiungi le partecipazioni:
// - AAPL con 10 azioni
// - GOOGL con 5 azioni
// - MSFT con 8 azioni
// TODO: Stampa "Fetching portfolio data..."
// TODO: Attendi e stampa il risultato di generateReport()
}
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