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.
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.
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>.
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.
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");
});
}
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);
}
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"));
}
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();
}
Para más detalles, consulta la documentación oficial de Dart sobre Future.
Jorge García
Fullstack developer