Menu
CoddyTech

Asincronía en métodos de clase

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

Ahora que sabes cómo gestionar la inicialización asíncrona con métodos de fábrica, veamos cómo hacer que los métodos de instancia normales sean asíncronos. Es sencillo: solo tienes que añadir async a cualquier método y hacer que devuelva 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');
}

Los métodos asíncronos pueden acceder a las variables de instancia y modificarlas, igual que los métodos normales. La diferencia clave es que quienes los llaman deben usar await para esperar el resultado. Los métodos que devuelven Future<void> no devuelven ningún valor, pero aun así hay que esperarlos si quieres asegurarte de que terminen antes de continuar.

También puedes combinar varias llamadas asíncronas dentro de un método o llamar a otros métodos asíncronos de la misma clase:

Future<String> getFullReport() async {
  var temp = await fetchTemperature();
  var humidity = await fetchHumidity();
  return '$temp, Humidity: $humidity';
}

Este patrón es esencial para las clases que interactúan con recursos externos —API, bases de datos o cualquier operación que lleve tiempo.

challenge icon

Desafío

Fácil

¡Vamos a crear un gestor de cartera de acciones que administra los precios de las acciones y calcula el valor de la cartera mediante métodos asíncronos! Crearás una clase que simula la obtención de datos bursátiles en tiempo real y combina varias operaciones asíncronas para generar informes.

Organizarás tu código en dos archivos:

  • portfolio.dart: Crea una clase StockPortfolio que realiza un seguimiento de las acciones y sus cantidades. Tu clase debe tener:
    • Un Map<String, int> privado llamado _holdings que almacena los símbolos de las acciones y el número de acciones que se poseen
    • Un constructor que inicializa _holdings como un mapa vacío
    • Un método addStock(String symbol, int quantity) que añade o actualiza una posición en acciones (no es asíncrono)
    • Un método asíncrono fetchPrice(String symbol) que devuelve un Future<double>. Simula una demora de 50 milisegundos y después devuelve un precio calculado así: la longitud del símbolo multiplicada por 25.5
    • Un método asíncrono getStockValue(String symbol) que devuelve un Future<double>. Debe esperar a fetchPrice para el símbolo, multiplicar el resultado por la cantidad que se posee y devolver el valor total. Si el símbolo no está en las posiciones, devuelve 0.0
    • Un método asíncrono getTotalValue() que devuelve un Future<double>. Debe calcular el valor combinado de todas las posiciones esperando a getStockValue para cada acción y sumando los resultados
    • Un método asíncrono generateReport() que devuelve un Future<String>. Debe generar un informe que muestre el valor de cada acción y el total. Da formato a cada línea como [symbol]: $[value] (valor con 1 decimal), seguida de una línea final Total: $[totalValue] (también con 1 decimal)
  • main.dart: Importa el archivo de la cartera y demuestra cómo funcionan juntos los métodos asíncronos dentro de una clase:
    • Crea una instancia de StockPortfolio
    • Añade estas posiciones: AAPL con 10 acciones, GOOGL con 5 acciones, MSFT con 8 acciones
    • Imprime Fetching portfolio data...
    • Espera el resultado de generateReport() e imprímelo

Observa cómo generateReport() llama a otros métodos asíncronos dentro de la misma clase y cómo cada método se basa en los demás. ¡Usa toStringAsFixed(1) para dar formato a los valores decimales!

Salida esperada:

Fetching portfolio data...
AAPL: $1020.0
GOOGL: $637.5
MSFT: $816.0
Total: $2473.5

Pruébalo tú mismo

import 'portfolio.dart';

void main() async {
  // TODO: Crea una instancia de StockPortfolio

  // TODO: Añade las posiciones:
  // - AAPL con 10 acciones
  // - GOOGL con 5 acciones
  // - MSFT con 8 acciones

  // TODO: Imprime "Fetching portfolio data..."

  // TODO: Espera e imprime el resultado de generateReport()
}
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