Sobes.tech
Junior

¿Cómo funciona la palabra clave await en la programación asíncrona en Flutter?

sobes.tech AI

Respuesta de la IA

La palabra clave await se usa en funciones asíncronas (marcadas con la palabra clave async) para pausar la ejecución de la función hasta que el Future se complete y devuelva un resultado.

Principio de funcionamiento:

  1. Cuando la ejecución llega a la línea con await, la función actual se pausa.
  2. El control vuelve al código que llamó (o al bucle de eventos), permitiendo que otras partes del programa se ejecuten. Esto evita bloquear la interfaz de usuario.
  3. Cuando el Future al que hace referencia await se completa (es decir, realiza su operación asíncrona y devuelve un valor o lanza una excepción), la función suspendida se reanuda desde donde fue interrumpida.
  4. Si el Future se completó con éxito, el valor devuelto por el Future se convierte en el resultado de la expresión await.
  5. Si el Future terminó con un error (lanzó una excepción), esa excepción se lanzará en el lugar donde se llamó a await.

Ejemplo:

// Función asíncrona marcada con async
Future<String> fetchData() async {
  // Simulación de operación asíncrona (por ejemplo, una solicitud de red)
  await Future.delayed(Duration(seconds: 2));
  return '¡Datos recibidos de la red!';
}

void main() async {
  print('Inicio de obtención de datos...');

  // Uso de await para esperar la finalización del Future
  try {
    String data = await fetchData();
    print('Recibido: $data');
  } catch (e) {
    print('Error al obtener datos: $e');
  }

  print('La programación ha terminado (aunque await aún puede estar en ejecución)');
}

En este ejemplo, main está marcada como async para poder usar await. La llamada a await fetchData() pausa la ejecución de main durante 2 segundos, sin bloquear el hilo principal de la interfaz de usuario. Mientras fetchData espera, otras partes de la aplicación pueden seguir funcionando. Cuando fetchData termina, la ejecución de main se reanuda, y la variable data recibe el valor devuelto.