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