Volver a la página principal
jueves 31 octubre 2024
10

Cómo usar Future en Dart

En Dart, un Future es una clase que representa el resultado de una operación asincrónica, como una llamada a una API, una lectura de archivo o una consulta a una base de datos. Los Future permiten manejar operaciones que pueden tardar en completarse sin bloquear la ejecución del programa, ayudando a escribir código eficiente y no bloqueante.

¿Qué es un Future en Dart?

Un Future es una promesa de que una operación devolverá un valor en algún momento en el futuro. Este valor puede ser el resultado de la operación o un error si algo falla. Un Future puede estar en tres estados:

1. Pendiente: El Future aún no se ha completado.

2. Completado con éxito: El Future se ha completado y devuelve un valor.

3. Completado con error: La operación falló y devuelve un error.

Sintaxis básica de un Future

Un Future puede crearse directamente o mediante una función que devuelva un Future, utilizando la sintaxis Future<T>, donde T es el tipo del valor que devolverá el Future.

Future<String> obtenerMensaje() async {
  return "Hola desde el futuro!";
}

En este ejemplo, obtenerMensaje es una función asincrónica que devuelve un Future<String>.

Ejemplos de uso de Future en Dart

Creación de un Future básico

Puedes crear un Future que se complete después de un cierto tiempo usando Future.delayed:

Future<void> mostrarMensajeConRetraso() async {
  await Future.delayed(Duration(seconds: 2));
  print("Este mensaje aparece después de 2 segundos");
}

void main() {
  mostrarMensajeConRetraso();
}

En este caso, el programa esperará 2 segundos antes de imprimir el mensaje en la consola.

Manejando un Future con then y catchError

then se usa para procesar el resultado de un Future cuando este se completa exitosamente, mientras que catchError captura posibles errores.

Future<int> calcularSuma(int a, int b) {
  return Future(() {
    if (a < 0 || b < 0) {
      throw Exception("Números negativos no permitidos");
    }
    return a + b;
  });
}

void main() {
  calcularSuma(5, 3).then((resultado) {
    print("Resultado: $resultado");
  }).catchError((e) {
    print("Error: $e");
  });
}

Manejando errores en un Future con try-catch

Otra manera de manejar errores en un Future es usando try-catch en funciones async.

Future<void> dividirNumeros(int a, int b) async {
  try {
    if (b == 0) throw Exception("No se puede dividir por cero");
    int resultado = a ~/ b;
    print("Resultado: $resultado");
  } catch (e) {
    print("Error: $e");
  }
}

void main() {
  dividirNumeros(10, 0);
}

Operaciones comunes con Future

Encadenamiento de Futures

Puedes encadenar múltiples operaciones asincrónicas usando then:

Future<void> procesarDatos() {
  return obtenerDatos()
      .then((datos) => procesar(datos))
      .then((resultado) => print("Resultado procesado: $resultado"))
      .catchError((e) => print("Error: $e"));
}

Ejemplo con múltiples Futures usando Future.wait

Future.wait permite ejecutar múltiples operaciones en paralelo y esperar a que todas se completen.

Future<void> ejecutarTareas() async {
  await Future.wait([
    Future.delayed(Duration(seconds: 2), () => print("Tarea 1 completada")),
    Future.delayed(Duration(seconds: 1), () => print("Tarea 2 completada")),
  ]);
  print("Todas las tareas completadas");
}

void main() {
  ejecutarTareas();
}

Referencia oficial

Para más detalles, consulta la documentación oficial de Dart sobre Future.

Etiquetas:
dart
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer