Menu
Coddy logo textTech

Constructores asíncronos

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 79 de 110.

Los constructores en Dart no pueden marcarse como async; deben devolver una instancia de la clase inmediatamente, no un Future. ¿Entonces, cómo se crean objetos que necesitan una inicialización asíncrona, como cargar datos de una base de datos o recuperar una configuración?

La solución consiste en usar un método de fábrica estático y asíncrono. Mantén el constructor privado (o simple) y proporciona un método estático que realice el trabajo asíncrono y devuelva un Future de tu clase:

class UserProfile {
  final String name;
  final int age;
  
  UserProfile._(this.name, this.age);  // Constructor privado
  
  static Future<UserProfile> create(String userId) async {
    // Simular la obtención de datos
    await Future.delayed(Duration(seconds: 1));
    return UserProfile._('Alice', 25);
  }
}

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

El constructor privado UserProfile._ se encarga de la creación real del objeto, mientras que el método estático create() se encarga de todo el trabajo asíncrono. Los llamadores usan await para obtener el objeto completamente inicializado.

Este patrón asegura que su objeto esté completamente listo para usar una vez que lo tenga: sin estados parcialmente inicializados ni datos faltantes. Se utiliza comúnmente para clases que necesitan cargar recursos, conectarse a servicios o realizar cualquier configuración que lleve tiempo.

challenge icon

Desafío

Fácil

¡Construyamos un cargador de configuración que demuestre cómo manejar la inicialización asíncrona en las clases! Como los constructores no pueden ser asíncronos, usarás el patrón de método de fábrica estático para crear objetos que necesitan tiempo para «cargar» sus datos.

Organizarás tu código en dos archivos:

  • config_loader.dart: Crea una clase ConfigLoader que simule la carga asíncrona de los ajustes de configuración. Tu clase debe tener:
    • Tres campos finales: appName (String), version (String) y maxUsers (int)
    • Un constructor privado que inicialice los tres campos
    • Un método de fábrica estático asíncrono llamado load que acepte un parámetro String configId y devuelva un Future<ConfigLoader>. Este método debe:
      • Usar Future.delayed() con 100 milisegundos para simular el tiempo de carga
      • Generar los valores de configuración según configId:
        • appName: el configId con " App" añadido
        • version: "1.0." seguido de la longitud de configId
        • maxUsers: la longitud de configId multiplicada por 10
      • Devolver una nueva instancia de ConfigLoader con estos valores
    • Un método displayInfo() que imprima la configuración con este formato: Config: [appName] v[version] (max [maxUsers] users)
  • main.dart: Importa tu cargador de configuración y demuestra el patrón de inicialización asíncrona:
    • Imprime Loading configurations...
    • Carga una configuración con el configId "Production" y llama a su displayInfo()
    • Carga una configuración con el configId "Dev" y llama a su displayInfo()
    • Imprime All configs loaded!

Observa cómo el método estático load gestiona todo el trabajo asíncrono, mientras que el constructor privado simplemente asigna los valores. ¡Las personas que llaman usan await para obtener un objeto completamente inicializado!

Salida esperada:

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

Pruébalo tú mismo

import 'config_loader.dart';

void main() async {
  // TODO: Imprimir "Loading configurations..."
  
  // TODO: Cargar una configuración con configId "Production"
  // y llamar a su método displayInfo()
  
  // TODO: Cargar una configuración con configId "Dev"
  // y llamar a su método displayInfo()
  
  // TODO: Imprimir "All configs loaded!"
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online