Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 classe StockPortfolio che tiene traccia delle azioni e delle relative quantità. La classe dovrebbe avere:
    • Una Map<String, int> privata chiamata _holdings che memorizza i simboli azionari e il numero di azioni possedute
    • Un costruttore che inizializza _holdings come 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 un Future<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 un Future<double>. Il metodo dovrebbe attendere fetchPrice per 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 un Future<double>. Il metodo dovrebbe calcolare il valore complessivo di tutte le posizioni attendendo getStockValue per ogni azione e sommando i risultati
    • Un metodo asincrono generateReport() che restituisce un Future<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 finale Total: $[totalValue] (anch'esso con 1 cifra decimale)
  • 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: AAPL con 10 azioni, GOOGL con 5 azioni, MSFT con 8 azioni
    • Stampa Fetching portfolio data...
    • Attendi e stampa il risultato di generateReport()

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.5

Provalo 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()
}
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