Todos los proyectos

Archive Reader

Lector y gestor de archivos MHTML multiplataforma

Rol
Desarrollador único (arquitectura, diseño y desarrollo)
Cliente
Uso personal / distribución pública
Duración
15-07-2026 — 20-08-2026
Año
2026
Equipo
1 persona
MobileDesktopUtilidades
FlutterDartRiverpodDrift (SQLite)flutter_inappwebviewShelfpackage:archivepackage:httppackage:mimefile_selector
Archive Reader

Problema

¿Qué había que resolver?

La gestión de archivos MHTML es complicada y poco intuitiva en plataformas móviles y de escritorio, especialmente al trabajar con grandes volúmenes de datos.

Solución

¿Cómo se resolvió?

Desarrollar una aplicación multiplataforma que facilite la lectura, gestión y creación de archivos MHTML, con un enfoque en la experiencia del usuario y el rendimiento.

Características

Lo que hace

  • Sistema de múltiples bibliotecas con historial de carpetas y metadatos persistentes
  • Parser MIME multipart propio, compatible con archivos MHTML reales de distintos navegadores
  • Detección de encoding robusta (UTF-8, Windows-1252, ISO-8859-1) con sniffing de charset en el propio HTML
  • Estrategia de lectura dual: servidor HTTP local en Android/iOS, archivo file:// en Windows
  • Barra de desplazamiento personalizada con posición proporcional al contenido real
  • Creación de archivos MHTML desde carpeta de imágenes, archivo .zip o un enlace web
  • Captura de páginas web completas (HTML + imágenes + estilos) vía WebView invisible
  • Generación de archivos en Isolates dedicados con escritura atómica, sin bloquear la UI
  • Manejo estable de archivos de +130MB sin fugas de memoria

Responsabilidades

Mi rol en el proyecto

  • Diseño completo de la arquitectura de la aplicación
  • Desarrollo end-to-end en Flutter (UI, lógica de negocio, persistencia)
  • Diseño e implementación del parser MIME/MHTML propio
  • Resolución de bugs de bajo nivel (encodings, manejo de memoria, comportamiento nativo de WebView por plataforma)
  • Pruebas manuales en Android y Windows

Retos técnicos

Lo que no fue trivial

Compatibilidad MHTML

Lograr compatibilidad real entre archivos MHTML generados por la app y lectores externos (Chrome, Edge, otras apps), ajustando el esquema de referencias (Content-Location vs. cid:) y la codificación CRLF

Optimización de memoria

Evitar bloqueos de UI y fugas de memoria al procesar archivos de más de 130MB, moviendo el trabajo pesado a Isolates y escribiendo recursos de a uno en vez de cargarlos completos en RAM

Media Scanner Android

Diagnosticar interferencia del escáner de medios de Android con archivos siendo escritos en almacenamiento público

Gestos WebView vs Flutter

Resolver conflictos entre gestos nativos del WebView (selección de texto) y GestureDetector de Flutter

Limitaciones CORS

Sortear limitaciones de CORS al capturar recursos de páginas web externas sin depender de un servidor backend

Resultado

Qué se logró

  • Aplicación funcional en Android y Windows, con paridad de funcionalidades entre ambas plataformas
  • Archivos MHTML generados por la app abren correctamente en navegadores de escritorio y otros lectores externos
  • Manejo estable de bibliotecas con archivos de gran tamaño sin degradar el rendimiento de la interfaz
  • getSaveLocation de file_selector no está implementado en Android/iOS; getDirectoryPath es la alternativa multiplataforma real
  • Escribir archivos grandes primero en un directorio temporal privado y copiarlos al destino final evita corrupción por interferencia externa (escáner de medios, antivirus, etc.)
  • Los eventos nativos de WebView no tienen paridad garantizada entre backends; un canal de mensajes JS↔Dart es más confiable multiplataforma que depender de callbacks nativos específicos
  • Validar de forma crítica sugerencias técnicas de fuentes externas (incluyendo otras IAs) antes de aplicarlas, especialmente cuando son internamente contradictorias
  • Preferir manipulación de HTML basada en DOM sobre reemplazos de string para mayor robustez ante marcado real y variado