Análisis de un gestor de descargas en Flutter: Implementación de pausa, cancelación y resumen

Se analiza aquí un enfoque para construir un gestor de descargas que soporte características críticas como pausa, cancelación y reanudación, basado en principios observados en bibliotecas existentes pero con implementaciones modificadas.

Conceptos básicos del gestor

Un gestor de descargas eficiente debe manejar tareas de forma centralizada. Se puede modelar con una clase principal que administre múltiples instancias de tareas, cada una representando una descarga individual.

Estructura de clases

La clase GestorDescargas actúa como controlador central. Internamente, utiliza un mapa para vincular URLs con objetos de tarea (TareaDescarga). Cada tarea contiene un token de cancelación (CancelToken) proporcionado por la biblioteca de red, que permite interrumpir solicitudes HTTP.

Flujo de gestión de tareas

Las solicitudes de descarga se agregan a una cola interna. Antes de procesar una nueva solicitud, el gestor verifica el estado de la tarea en su caché: si ya se completó, deveulve el resultado existente; si está en progreso, puede decidir reanudarla desde el último byte recibido o iniciarla de nuevo según la configuración.

Ejemplos de uso con código modificado

A continuación, se muestran fragmentos de código reestructurados con nombres de variables y lógica alterados para ilustrar los conceptos.

Iniciar una descarga


final gestor = GestorDescargas();
final enlace = "https://servidor-ejemplo.com/archivo.zip";
final rutaDestino = "./descargas/archivo.zip";

gestor.agregarDescarga(enlace, rutaDestino);

final tarea = gestor.obtenerTarea(enlace);
tarea?.estado.addListener(() {
  print("Estado: ${tarea.estado.value}");
});

tarea?.progreso.addListener(() {
  print("Progreso: ${tarea.progreso.value * 100}%");
});

await gestor.esperarFinalizacion(enlace);

Cancelar una tarea


gestor.cancelarDescarga(enlace);

Pausar y reanudar


gestor.pausarDescarga(enlace);
// Más tarde...
gestor.reanudarDescarga(enlace);

Implementación interna de pausa y cancelación

La clave para el control de descargas radica en la gestión del CancelToken. Cada solicitud HTTP se asocia a un token, que puede invocarse para abortar la conexión.

Pausa: Al pausar, se cancela la solicitud HTTP actual mediante el token, pero se guarda el progreso (bytes recibidos). Al reanudar, se crea un nuevo token y se establece un encabezado Range para continuar desde el byte correspondiente.

Cancelación: Se invoca el token y se elimina la tarea de la caché del gestor, reiniciando el proceso si se solicita nuevamente.

La diferencia principal entre pausa y cancelación radica en cómo se preserva el progreso. En pausa, el archivo parcial se conserva; en cancelación, se descarta.

Ventajas de este enfoque

  • Reutilización lógica: Toda la implementación es en Dart puro, evitando puentes nativos y facilitando el mantenimiento multiplataforma.
  • Gestión centralizada: Permite manejar múltiples descargas concurrentes con límites configurables.
  • Código modular: Las clases se separan por responsabilidades: gestión, tarea y solicitud.

Limitaciones observadas

  • Persistencia: La caché de tareas es solo en memoria. Si la aplicación se cierra, el estado se pierde. Podría extenderse con almacenamiento local.
  • Dependencias: El uso directo de bibliotecas como Dio acopla la implementación. Desacoplarlo permitiría mayor flexibilidad en la capa de red.

Consideraciones para la mejora

Para una implementación de producción, se recomienda añadir persistencia en disco para el estado de descargas, desacoplar la biblioteca HTTP mediante interfaces, y manejar errores de red de forma más granular.

Etiquetas: Flutter Dart gestor_descargas cancel_token Dio

Publicado el 6-20 21:11