Mi experiencia usando Flutter para desarrollo de apps
Llevo desarrollando aplicaciones Android desde 2014, desde 2016 en modo freelance y siempre de forma nativa.
Desde 2019 he estado probando Fluter, hasta que finalmente he reescrito desde 0 mi aplicación Karate Stars utilizando flutter como framework.
No era un cambio sencillo, ni para hacer a la ligera por probar, ya que no era sobre una aplicación de cientos de descargas o menos, sino que en ese momento Karate Stars tenía más de 10.000 descargas y tenía que aportarme valor.
Las pruebas que había realizado me convencieron. En este artículo voy a contar el proceso y mis impresiones de Flutter después de reescribir una aplicación con miles de descargas.
Motivo del cambio
Por un lado supe de Flutter en algún evento y me llamo la atención que su estrategía era diferente a otras soluciones existentes.
No trataba de convertir a interfaz nativa en el proceso de compilación sino que tenía su propio motor de renderizado estilo unity para los video juegos.
Además creo que erróneamente, mi aplicación solo existía para Android, con un volumen muy alto de seguidores en redes sociales que me pedían la versión de iOS.
Tenía dos opciones, ponerme las pilas en desarrollo iOS donde más alla de algún proyecto hace años, no había tocado mucho o aprender Flutter y de este modo agilizar los procesos de desarrollo para las dos plataformas, Android e IOS.
Conociendo flutter
Inicialmente me decidí por Flutter debido a que los tiempos desarrollo serían mucho menores que desarrollado de forma nativa en ambas plataformas y que las capacidades de flutter se ajustaban muy bien al tipo de aplicación.
Esta aplicación aunque tenía miles de descargas, es algo en lo que avanzaba en mi tiempo libre o cuando tengo un pico no muy alto de trabajo, por lo tanto los tiempos de desarrollo eran un factor importante en mi decisión.
No me iba a lanzar a lo loco con Flutter a reescribir de 0 Karate Stars, así que lo que hice fue crear Torii Shopping a modo de prueba.
El objetivo era probar la tecnología desde 0 hasta el despliegue en Google Play y App Store, utilizando notificaciones push y características comunes en la aplicaciones móviles.
Por el camino fui dejando en el blog una seríe de artículos.
Una vez escrita la primera aplicación usando Flutter con resultados satisfactorios en cuanto a Flutter como plataforma de desarrollo, me decidí a reescribir Karate Stars desde 0.
Mis opniniones
Lenguaje
El lenguaje con el que se trabaja es Dart.
Asumiendo que es un lenguaje inferior en cuanto a capacidades respecto a Kotlin o Typescript, no he tenido grandes problemas con este lenguaje.
Es una especie de mix entre Java y Javascript, con alguna particularidad que no me gusta mucho como la forma de declarar variables o funciones privadas.
Se parece más a Java de lo que me gustaría.
Se va mejorando el lenguaje como añadir null safety, sin embargo todavía está lejos de otros desde mi punto de vista.
Open Source
Tanto Flutter como los paquetes y plugins son open source, lo que ayuda mucho al aprendizaje de la plataforma.
Me he inspirado en multitud de paquetes, plugins o proyectos en github para hacer mis propias soluciones o para aprender a usar código de terceros.
Generación de código mediante anotaciones
Esta parte me sorprendió que no viniera integrada en el proceso de compilación como si ocurre en Android.
Tienes que usar una librería externa para ejecutar generadores de código. Es cierto que una vez conocido es simplemente ejecutar un comando en el terminal.
Pero es algo que te tienes que acordar de ejecutar manualmente y que se agradecería que viniera integrado en el proceso de compilación de forma nativa.
Documentación
La documentación es bastante buena, no he tenido grandes bloqueos por no venir algo documentado correctamente o de forma insuficiente.
Oviamente los ejemplos que vienen son sencillos y hay documentaciones mejores pero la considero buena.
Gestor de paquetes
Para extender las capacidades del framework existen paquetes y plugins alojados en pub.dev.
Hay una gran variedad de paquetes, plugins para todo tipo de necesidades y creciendo.
Paquetes
Los paquetes están escritos en Dart y son como librerías en otras tecnologías.
Pueden existir dependientes de flutter o solo del lenguaje Dart.
Plugins
Un paquete especializado de Dart que contiene una API escrita en código Dart combinado con una implementación específica de plataforma para Android (usando Java o Kotlin), y/o para iOS (usando ObjC o Swift).
Se suelen utilizan para realizar acciones a bajo nivel desde cada plataforma de forma nativa y que pueden ser consumidos fácilmente desde tu aplicación Flutter.
Testing
En la parte de testing yo diferenciaria según tipo de tests.
Test unitarios
Ningún problema en este sentido, existen librerías que te permiten usar objetos dobles de igual forma que en otras tecnologías.
También he realizado test de integración con api en servidor utilizando este tipo de test usando mock web server.
Tests de widgets
Ningún problema tampoco, bastante similares a los test de componentes en React por ejemplo usando la testing library.
He realizado tanto test de widgets verificando comportamiento como test de widgets multiplataforma.
Test de integración
En este tipo de testing es donde he tenido más problemas.
Seguramente por el enfoque que uso en otras tecnologías como Android donde creaba escenarios de pruebas fácilmente.
Aquí me costo mucho hacer cosas similares porque el código de test de integración esta completamente aislado del de produción.
Además había muchos falsos errores hasta tal punto que quite todos los test de integración.
Volveré a retomarlos más adelante.
Integración Contínua
Aunque existen soluciones específicas para Flutter respecto a la integración contínua, he utilizado Github actions porque es la solución que estoy usando en todos mis proyectos independientemente de la tecnología.
Existen github actions para flutter al igual que para otras tecnologías, aqui que todo sea open source y poder ver soluciones que aplicaban en la comunidad fue de gran ayuda.
Velocidad de desarrollo
Hot Reload
Es una de las maravillas de Flutter, no require de añadir código específico de previews ni nada por el estilo como en Android Jetpack Compose.
Agiliza mucho el desarrollo y funciona de forma bastante similar a refresh de React.
Interfaz de usuario
Este es otro de los puntos fuertes de Flutter. Al tener un motor de renderización propio, las posibilidades son ilimitadas.
Por este motivo te aseguras que se va a ver exactamente igual en todas las versiones de Android, eliminando los problemas de fragmentación.
Existe integrado en el framework de Flutter una librería para usar widgets de material design y otra para Cupertino.
Widgets Multiplataforma
A nivel de crear widgets multiplataforma es posible crear aplicaciones que se muestren con el estilo apropiado en cada plataforma resultando más familiares a los usuarios.
Es cierto que se agradecería que hubiera una solución multiplataforma de forma nativa, en lugar de tener que manualmente usar unos widgets de Material o Cupertino según la plataforma.
Existen librerías que hacen esta función pero se echa de menos una solución nativa de Flutter.
Contexto
Flutter se a ajustado como un guante a mi contexto donde no trabajo a bajo nivel con el dispositivo y era más bien una aplicación estandar que muestra información renderizada de una API.
Con esto no quiero decir que no se pueda trabajar a bajo nivel con cada plataforma, solo que no lo he necesitado y desconozco si en esa parte hay problemas.
Solo he trabajado a bajo nivel con notificaciones push y no he tenido problema alguno y la documentación es bastante buena en este apartado sobre las acciones que tienes que realizar tanto para Android como iOS.
Para mí, era importante reducir al máximo los procesos y coste en tiempo de desarollo para Android e iOS. En ese sentido la inversión de apredizaje de Flutter creo que fue más que acertada.
Conclusiones
Mis conclusiones después de escribir una aplicación de 0 y reescribir otra con miles de descargas son muy buenas para mi contexto.
Mi aplicación no requería de mucha interacción con el dispositivo a bajo nivel y flutter se adapta de maravilla. He podido crear widgets adaptados según la plataforma sin problema.
No he tenido ningun problema al publicar la nueva versión de la app en Google Play reescribiendola desde 0 usando otro framework diferente.
Lo ideal para mi sería que se pudiera desarrollar usando Kotlin o TypeScript porque me parecen mejores lenguajes. Sin embargo las cosas positivas del framework globalmente compensa las carencias que puede tener el lenguaje Dart.
Si eres desarrollador freelance o una empresa pequeña, desarrollas aplicaciones bastante estándar y los ciclos de desarrollo más el coste de desarrollar una vez para dos plataformas es un handicap importante, creo que Flutter es la mejor opción a día de hoy.