Menu
Coddy logo textTech

Costruttori asincroni

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

I costruttori in Dart non possono essere contrassegnati come async: devono restituire immediatamente un'istanza della classe, non un Future. Quindi, come si creano oggetti che richiedono un'inizializzazione asincrona, come il caricamento di dati da un database o il recupero della configurazione?

La soluzione consiste nell'usare un metodo factory statico asincrono. Mantieni il costruttore privato (o semplice) e fornisci un metodo statico che esegua il lavoro asincrono e restituisca un Future della tua classe:

class UserProfile {
  final String name;
  final int age;
  
  UserProfile._(this.name, this.age);  // Costruttore privato
  
  static Future<UserProfile> create(String userId) async {
    // Simula il recupero dei dati
    await Future.delayed(Duration(seconds: 1));
    return UserProfile._('Alice', 25);
  }
}

Future<void> main() async {
  var user = await UserProfile.create('123');
  print(user.name);  // Alice
}

Il costruttore privato UserProfile._ gestisce la creazione effettiva dell’oggetto, mentre il metodo statico create() gestisce tutto il lavoro asincrono. Chi chiama usa await per ottenere l’oggetto completamente inizializzato.

Questo schema assicura che il tuo oggetto sia completamente pronto all'uso non appena lo ottieni: niente stati inizializzati solo parzialmente né dati mancanti. È comunemente usato per le classi che devono caricare risorse, connettersi a servizi o eseguire operazioni di configurazione che richiedono tempo.

challenge icon

Sfida

Facile

Costruiamo un caricatore di configurazione che mostri come gestire l’inizializzazione asincrona nelle classi! Poiché i costruttori non possono essere asincroni, userai il modello del metodo factory statico per creare oggetti che hanno bisogno di tempo per "caricare" i propri dati.

Organizzerai il codice in due file:

  • config_loader.dart: crea una classe ConfigLoader che simula il caricamento asincrono delle impostazioni di configurazione. La classe dovrebbe avere:
    • Tre campi final: appName (String), version (String) e maxUsers (int)
    • Un costruttore privato che inizializza tutti e tre i campi
    • Un metodo factory statico asincrono chiamato load che accetta un parametro String configId e restituisce un Future<ConfigLoader>. Questo metodo dovrebbe:
      • Usare Future.delayed() con 100 millisecondi per simulare il tempo di caricamento
      • Generare i valori di configurazione in base a configId:
        • appName: configId seguito da " App"
        • version: "1.0." seguito dalla lunghezza di configId
        • maxUsers: la lunghezza di configId moltiplicata per 10
      • Restituire una nuova istanza di ConfigLoader con questi valori
    • Un metodo displayInfo() che stampa la configurazione in questo formato: Config: [appName] v[version] (max [maxUsers] users)
  • main.dart: importa il caricatore di configurazione e mostra il modello di inizializzazione asincrona:
    • Stampa Loading configurations...
    • Carica una configurazione con configId "Production" e chiama il suo metodo displayInfo()
    • Carica una configurazione con configId "Dev" e chiama il suo metodo displayInfo()
    • Stampa All configs loaded!

Nota come il metodo statico load gestisce tutto il lavoro asincrono, mentre il costruttore privato si limita ad assegnare i valori. Chi chiama il metodo usa await per ottenere un oggetto completamente inizializzato!

Output previsto:

Loading configurations...
Config: Production App v1.0.10 (max 100 users)
Config: Dev App v1.0.3 (max 30 users)
All configs loaded!

Provalo tu

import 'config_loader.dart';

void main() async {
  // TODO: Stampa "Loading configurations..."
  
  // TODO: Carica una configurazione con configId "Production"
  // e chiama il suo metodo displayInfo()
  
  // TODO: Carica una configurazione con configId "Dev"
  // e chiama il suo metodo displayInfo()
  
  // TODO: Stampa "All configs loaded!"
}
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