¿Cuáles son sus conocimientos sobre asincronía en Dart?
sobes.tech AI
Respuesta de la IA
La asincronía en Dart se implementa mediante:
-
Concepto de "aislantes" (Isolates): Procesos de trabajo independientes, cada uno con su propia memoria. Se utilizan para ejecutar tareas intensivas en recursos en paralelo sin bloquear el hilo principal de la interfaz de usuario. La comunicación entre aislantes se realiza a través de puertos (ReceivePort, SendPort).
-
Palabras clave
async,await:asyncmarca una función que realizará operaciones asíncronas y devolverá unFuture.awaitse usa dentro de una funciónasyncpara esperar a que unFuturetermine. Cuando se alcanzaawait, la ejecución de la función se suspende, permitiendo que otras operaciones se ejecuten mientras elFuturetermina con un valor o error.
Future<String> fetchData() async { // Simulación de retardo await Future.delayed(Duration(seconds: 2)); return 'Datos recibidos'; } void main() async { print('Inicio'); String result = await fetchData(); // Espera a que fetchData termine print(result); print('Fin'); } -
Clase
Future<T>: Representa el resultado de una operación asíncrona que estará disponible en el futuro.Futurepuede estar en uno de tres estados:- No completado (uncompleted)
- Completado con un valor (completed with a value)
- Completado con un error (completed with an error)
La gestión de la finalización de un
Futurese realiza mediantethen(),catchError(),whenComplete()oawait. -
Clase
Stream<T>: Representa una secuencia de eventos asíncronos. Se usa para manejar flujos de datos, por ejemplo, lectura de archivos, recepción de datos por red, eventos de interfaz de usuario. El flujo puede ser de una sola suscripción (single-subscription) o de múltiples suscripciones (broadcast). La gestión de eventos del flujo se realiza conlisten(),async*,yield.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Envío de valor al flujo } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Recibido: $data'), onError: (error) => print('Error: $error'), onDone: () => print('El flujo ha terminado'), ); }
La asincronía en Dart se basa en el modelo de "bucle de eventos" (event loop). El hilo principal ejecuta el código de forma secuencial, pero al encontrar una operación asíncrona (por ejemplo, await o Future.then), la delega al "pool de eventos" (event queue) y continúa ejecutando el siguiente código. Cuando la operación asíncrona termina, su resultado se envía de vuelta al "pool de eventos". El ciclo de eventos revisa continuamente el "pool de eventos" y ejecuta las tareas cuando el hilo principal está libre.