Actualización de un proyecto legacy en Flutter: Un caso de guerra

Enfrentamos el desafío de actualizar un proyecto Flutter con más de 60 dependencias obsoletas. Descubre paso a paso cómo abordamos este proceso, los problemas que encontramos y las estrategias que utilizamos para modernizar la aplicación sin romperla en el intento.

21.02.2025 — Edu Molins — 4 min read
Legacy code

El estado inicial: Diagnóstico del paciente

El diagnóstico inicial reveló múltiples puntos críticos:

  • Flutter version: 1.22.0
  • Más de 60 dependencias, muchas deprecadas
  • Versión de Java obsoleta
  • Pods de iOS desactualizados
  • Warnings por todos lados
  • Códigos deprecados en uso activo

Fase 1: Preparación y respaldo

1.1 Análisis de impacto

Antes de sumergirnos en la actualización, era crucial entender completamente a qué nos enfrentábamos. Dedicamos una semana completa a analizar el proyecto en profundidad. Durante esta fase, completamos las siguientes tareas críticas:

  • Realizamos un inventario completo de dependencias
  • Identificamos las funcionalidades críticas
  • Creamos una suite de tests de regresión
  • Respaldamos todo en una rama separada
1.2 Documentación del estado actual

La documentación se convirtió en nuestro salvavidas durante todo el proceso. Establecimos un sistema riguroso de documentación que incluía:

  • Screenshots de todas las pantallas principales
  • Lista de funcionalidades críticas
  • Registro de comportamientos específicos que debían mantenerse
  • Mapeo de flujos de usuario completos

Fase 2: La actualización base

2.1 Actualización del entorno de desarrollo

La actualización del entorno de desarrollo fue nuestro primer gran desafío. Este proceso requirió una secuencia específica de pasos que ejecutamos cuidadosamente:

  1. Actualización de Flutter a la última versión estable:

    flutter upgrade
    flutter channel stable
    flutter doctor
  2. Actualización de Java, asegurando compatibilidad con los plugins nativos existentes
  3. Actualización del Xcode y CocoaPods:

    pod repo update
    pod update
2.2 Primera ronda de dependencias

El proceso de actualización de dependencias fue como desactivar una bomba: cada cable cortado podía desencadenar una reacción en cadena. Abordamos este desafío con un plan estructurado:

  • Actualización del pubspec.yaml con las nuevas versiones compatibles
  • Resolución de conflictos entre dependencias interdependientes
  • Identificación y sustitución de paquetes deprecados

Fase 3: La guerra con las dependencias

3.1 Estrategia de actualización por capas

Adoptamos un enfoque sistemático, actualizando las dependencias en el siguiente orden:

  1. Dependencias core:
    • Cliente HTTP
    • Gestión de estado
    • Sistema de navegación
  2. Dependencias UI:
    • Widgets personalizados
    • Bibliotecas de componentes
    • Temas y estilos
  3. Dependencias funcionales:
    • Integraciones con APIs
    • Manejo de datos locales
    • Funcionalidades específicas del negocio
  4. Herramientas de soporte:
    • Analytics
    • Crash reporting
    • Monitoreo de rendimiento
3.2 Problemas comunes encontrados

Durante el proceso nos enfrentamos a diversos desafíos técnicos que requirieron soluciones creativas:

Los principales obstáculos incluyeron:

  • Conflictos de versiones entre paquetes interdependientes
  • Breaking changes en APIs populares
  • Incompatibilidades con nuevas versiones de iOS/Android
  • Métodos deprecados sin alternativas directas

Fase 4: Refactorización y modernización

4.1 Actualizaciones de código

La modernización del código base requirió varios cambios fundamentales:

  1. Migración a null safety: Un proceso que realizamos módulo por módulo, asegurando la estabilidad en cada paso.
  2. Actualización de widgets: Identificamos y reemplazamos componentes obsoletos por sus equivalentes modernos, mejorando tanto la funcionalidad como el rendimiento.
  3. Patrones y prácticas: Implementamos las últimas prácticas recomendadas por el equipo de Flutter, incluyendo:
    • Uso de nuevos widgets de plataforma
    • Implementación de nuevos patrones de estado
    • Optimización de la construcción de widgets
4.2 Mejoras de arquitectura

En esta fase aprovechamos para realizar mejoras arquitectónicas significativas:

  • Separación clara de responsabilidades usando Clean Architecture
  • Implementación de gestión de estado moderna
  • Optimización de la navegación y gestión de rutas
  • Mejora en el manejo de recursos y assets
Legacy code2

Fase 5: Testing y validación

La fase de testing fue crítica pero mantuvimos un enfoque pragmático, centrándonos en los aspectos más importantes para garantizar la estabilidad de la aplicación tras la actualización.

5.1 Plan de pruebas

Nos centramos en verificar que las funcionalidades core siguieran funcionando correctamente:

  • Pruebas manuales de los flujos principales de usuario
  • Verificación de integración con APIs externas
  • Validación de formularios y procesos críticos
  • Testing específico en áreas que fueron más afectadas por las actualizaciones
5.2 Monitoreo de rendimiento

Realizamos verificaciones básicas pero esenciales:

  • Comprobación de tiempos de carga en diferentes secciones
  • Verificación del tamaño final de la aplicación
  • Testing en diferentes dispositivos y versiones de OS

Lecciones aprendidas y recomendaciones finales

La experiencia nos dejó valiosas lecciones que han transformado nuestra aproximación al mantenimiento de aplicaciones Flutter:

  1. Documentación como prioridad: Mantener registros detallados de cada decisión y cambio realizado.
  2. Actualización gradual: No intentar actualizar todo de una vez, sino proceder por fases bien definidas.
  3. Testing continuo: Los tests automatizados son fundamentales para detectar problemas temprano.
  4. Comunicación clara: Mantener al cliente informado de los progresos y desafíos encontrados.

Conclusión

La actualización de un proyecto legacy en Flutter puede parecer abrumadora, pero con una estrategia bien planificada y una ejecución metódica, es posible modernizar incluso los proyectos más antiguos. La clave está en mantener un equilibrio entre la necesidad de actualizar y la estabilidad del sistema existente.

Si te encuentras ante un desafío similar con tu proyecto Flutter y necesitas ayuda profesional para actualizarlo o modernizarlo, nuestro equipo puede ayudarte. Contamos con la experiencia y metodología probada para llevar tu aplicación al siguiente nivel de manera segura y eficiente 🚀.

💡 ¿Cuánto cuesta desarrollar una app para tu negocio? Ver precios