Introducción a Flutter

sept. 15, 2023

Este artículo forma parte de una serie:

Flutter es un framework de desarrollo de aplicaciones móviles creado por Google, utiliza el motor de renderizado Skia para pintar cada vista de la aplicación directamente en la pantalla, lo que le permite crear interfaces de usuario personalizadas y altamente flexibles a partir de un solo código base.

Fue anunciado por primera vez por Google en el 2015 como un proyecto experimental para explorar las posibilidades de este tipo de frameworks, tras varios años en desarrollo y con feedback de la comunidad acumulado Google lanzó la primera versión estable, Flutter 1.0, en diciembre de 2018. Desde entonces, Flutter ha ganado mucha tracción en la comunidad de desarrolladores gracias a su enfoque único, su rendimiento y la promesa de escribir una vez y ejecutar en múltiples plataformas.

El principal propósito de Flutter es permitir a los desarrolladores crear aplicaciones atractivas y de alto rendimiento para iOS, Android y web desde un único código fuente. Esto reduce significativamente el tiempo y los recursos necesarios para desarrollar y mantener aplicaciones en múltiples plataformas. Además, al ofrecer un conjunto completo de widgets que se adhieren a las directrices de diseño de Material Design (Google) y Cupertino (Apple), Flutter facilita la creación de aplicaciones que se sienten naturales y familiares para los usuarios, independientemente de la plataforma que estén utilizando.

Aunque Flutter ha logrado grandes avances y se ha consolidado como una solución líder para el desarrollo móvil, aún se encuentra en una fase incipiente cuando se trata de plataformas web y de escritorio. En el ámbito móvil los desarrolladores pueden contar con una amplia variedad de herramientas y características robustas que hacen que la construcción de aplicaciones para iOS y Android sea eficiente y eficaz. Sin embargo, para la web y el escritorio, la plataforma todavía está atravesando su fase de maduración y puede carecer de algunas de las funcionalidades más habituales o la optimización que los desarrolladores esperan.

Uno de los atributos más distintivos y poderosos de Flutter es su capacidad para compilar a código nativo. A diferencia de algunas soluciones híbridas que dependen de “puentes” para interactuar con componentes del propio sistema operativo, Flutter traduce directamente el código fuente a instrucciones que el hardware puede ejecutar sin intermediarios. Esta aproximación directa significa que las aplicaciones construidas con Flutter pueden alcanzar niveles de rendimiento comparables a los de las aplicaciones nativas, beneficiándose de una ejecución fluida y aprovechando al máximo las capacidades del dispositivo. Además, al eliminar capas adicionales de abstracción, Flutter garantiza una mayor coherencia en la experiencia del usuario, independientemente de la plataforma en la que se ejecute la aplicación.

Sin embargo, es esencial señalar que esta versatilidad de Flutter tiene un precio. Aunque las aplicaciones compilan a código nativo y ofrecen un rendimiento óptimo, el ejecutable final tiende a ser más pesado en comparación con las aplicaciones nativas tradicionales. Esta diferencia de tamaño se debe a que Flutter tiene que incorporar su propio motor de renderizado y otros componentes esenciales para garantizar que la aplicación funcione de manera coherente en diversas plataformas. Esto significa que, aunque los desarrolladores ganan en portabilidad y coherencia de diseño, pueden enfrentar desafíos en términos de optimización de tamaño, especialmente en dispositivos con limitaciones de almacenamiento o en regiones donde la economía de datos es crucial.

Flutter es de código abierto y opera bajo una licencia BSD de 3 cláusulas, una de las licencias más permisivas en el mundo del software. Esto significa que los desarrolladores tienen la libertad de usar, modificar y distribuir el software en sus propios términos, con muy pocas restricciones. Esta licencia no solo demuestra el compromiso de Google con la comunidad de desarrolladores, sino que también asegura que Flutter puede ser adoptado y adaptado por empresas y desarrolladores individuales sin temor a limitaciones legales. El código fuente del framework está disponible en GitHub, donde los desarrolladores no solo tienen acceso al código, sino que también pueden contribuir con mejoras y correcciones, fortaleciendo aún más el ecosistema. Además, el hecho de ser de código abierto significa que, si en algún momento Google decide abandonar o dejar de dar prioridad al proyecto, la comunidad tiene la capacidad de continuar su desarrollo, asegurando la longevidad y evolución independientemente de las decisiones corporativas.

Desde su lanzamiento, la comunidad de Flutter ha experimentado un crecimiento exponencial. Esta comunidad activa ha contribuido con una ingente cantidad de paquetes y plugins que facilitan muchas de las tareas comunes y avanzadas del desarrollo de aplicaciones. Estos recursos adicionales, junto con una documentación exhaustiva y foros de discusión activos, aseguran que los desarrolladores tengan el soporte necesario para abordar los desafíos que puedan surgir durante el desarrollo. Numerosas empresas líderes en la industria han adoptado Flutter como su solución de desarrollo preferida, demostrando la viabilidad y confiabilidad del framework en entornos de producción de alto nivel.

Para aquellos con experiencia previa en programación, la adopción de Flutter se presenta como una transición fluida y eficiente. El framework, basado en el lenguaje Dart, capitaliza conceptos programáticos familiares permitiendo a los desarrolladores aprovechar su conocimiento preexistente.

Dart es un poderoso lenguaje de programación desarrollado por Google que se destaca por su versatilidad y eficiencia. Originalmente fue concebido como una alternativa a JavaScript para el desarrollo web, ha evolucionado para abarcar múltiples plataformas, siendo su uso más notorio en el desarrollo móvil con Flutter.

La elección de Dart como lenguaje principal no fue casual ya que ofrece características que facilitan el desarrollo de aplicaciones de alto rendimiento:

  • JIT (Just-In-Time) y AOT (Ahead-Of-Time) Compilation: Gracias a la compilación JIT, Dart permite la función “Hot Reload” acelerando enormemente el proceso de desarrollo al reflejar cambios casi en tiempo real. Por otro lado, la compilación AOT permite que las aplicaciones sean rápidas y eficientes una vez desplegadas.

  • Programación orientada a objetos: Dart utiliza un enfoque de programación orientado a objetos, lo que lo hace familiar para desarrolladores que provienen de lenguajes como Java, C#, entre otros.

  • Fuertemente tipado: Aunque Dart es flexible, es fuertemente tipado. Esto significa que se espera que definas el tipo de dato para tus variables y retornos de funciones, lo que puede ayudar a detectar errores en tiempo de compilación. Aunque también te permite omitir el tipo de dato y dejar que el compilador lo infiera por ti.

  • Librerías y Paquetes: Dart cuenta con un rico ecosistema de librerías y paquetes que facilitan tareas comunes y amplían las capacidades del lenguaje, pub.dev es el repositorio oficial donde los desarrolladores pueden encontrar y compartir paquetes.

  • Concurrencia: Dart utiliza “Isolates” en lugar de hilos tradicionales para lograr la concurrencia, lo que le permite realizar tareas múltiples sin compartir memoria y sin el riesgo de bloqueo.

Skia es una biblioteca gráfica de código abierto que proporciona APIs y utilidades de bajo nivel para dibujar gráficos. Desarrollada inicialmente por Skia Inc. y adquirida posteriormente por Google en 2005, esta biblioteca ha sido la base de numerosos productos de Google, entre ellos Chrome, Chrome OS y, por supuesto, Flutter.

Skia ejerce un papel fundamental ya que A diferencia de otros frameworks que dependen de las capacidades de renderizado nativas suministradas por las plataformas subyacentes, como iOS o Android, Flutter emplea Skia para pintar widgets y otros elementos gráficos directamente en la pantalla. Esta elección de diseño tiene varias implicaciones significativas.

Una de las más evidentes es la consistencia entre plataformas. Al hacer uso del mismo motor de renderizado en todos los dispositivos, Flutter garantiza que las aplicaciones tengan un aspecto y comportamiento uniformes, sin importar el sistema operativo en el que se ejecuten. Esta uniformidad es esencial para mantener una experiencia de usuario coherente en todas las plataformas.

Por otro lado, el rendimiento es otra área donde Skia brilla. Optimizado para la rapidez, el motor permite que Flutter renderice interfaces, incluso las más complejas, a una tasa de 60fps o incluso 120fps en dispositivos compatibles. Esto asegura una experiencia de usuario suave y fluida, esencial para la interacción moderna en aplicaciones móviles.

El uso de Skia también permite una personalización sin precedentes en el diseño de la aplicación. Al no depender de los componentes nativos de la interfaz de usuario, los desarrolladores tienen la libertad de diseñar y personalizar cada aspecto de su aplicación, desde simples widgets hasta animaciones detalladas. Es esta libertad la que ha llevado a algunas de las experiencias de usuario más distintivas creadas con Flutter.

Además, Skia se beneficia de una integración profunda con el hardware. Puede aprovechar directamente las capacidades gráficas de un dispositivo, como la aceleración por GPU, para ofrecer transiciones y animaciones sin interrupciones. Y, finalmente, una ventaja indirecta pero crucial del enfoque de Flutter con Skia es la capacidad de adaptarse rápidamente. Los desarrolladores pueden implementar cambios en la apariencia o el comportamiento sin tener que esperar a que las plataformas actualicen sus componentes nativos.

Es aquí donde entran en juego los componentes Material y Cupertino. Estos dos conjuntos de widgets representan las directrices de diseño de Google (Material) y Apple (Cupertino), respectivamente. Al estar construidos desde cero en Flutter, y no ser meramente envoltorios de componentes nativos, tienen la capacidad de verse y funcionar de manera idéntica en cualquier plataforma. No importa si estás ejecutando tu aplicación en un iPhone, un dispositivo Android o una página web; un botón Material seguirá teniendo el mismo aspecto y comportamiento.

Este nivel de consistencia y personalización no sería posible sin la habilidad de Skia para pintar directamente en la pantalla. Cuando un desarrollador elige un widget Material o Cupertino en Flutter, no está seleccionando un componente nativo del sistema, sino instruyendo a Skia para que dibuje ese widget específico de acuerdo con las directrices de diseño correspondientes. Esto significa que las aplicaciones Flutter tienen el poder de adoptar completamente la estética de Material Design o el estilo de iOS, o incluso mezclarlos si así se desea, sin sacrificar la coherencia en diferentes dispositivos.

Además de todo lo mencionado, es importante resaltar cómo Flutter se alinea con las tendencias actuales en el mundo del desarrollo de software. Con la creciente demanda de aplicaciones móviles y web de alta calidad que se entreguen rápidamente, el enfoque de “escribir una vez, ejecutar en todas partes” de Flutter es más relevante que nunca. El hecho de poder ofrecer una solución a la fragmentación de plataformas con una única base de código es una propuesta de valor que está resonando con un número creciente de empresas y desarrolladores.

Sin embargo, como todo framework o herramienta, Flutter no está exento de críticas. Aunque su capacidad para ofrecer aplicaciones consistentes en múltiples plataformas es impresionante, algunos desarrolladores argumentan que nunca puede reemplazar completamente la experiencia de desarrollo nativo para iOS o Android. Las aplicaciones nativas, desarrolladas específicamente para una plataforma, tienen el potencial de integrarse más estrechamente con las características únicas del sistema operativo, lo que puede ofrecer ciertas ventajas en términos de rendimiento y funcionalidad.

Hay ocasiones en las que los desarrolladores pueden necesitar acceder a funcionalidades específicas del sistema operativo o aprovechar bibliotecas y SDKs nativos que no están directamente expuestos al framework. Para estas situaciones, Flutter no deja a los desarrolladores en la estacada; en su lugar, proporciona una solución elegante y eficiente denominada “Platform Channels” que nos permite crear código nativo.

A medida que la tecnología avanza, también lo hace Flutter. Con Google respaldando activamente el desarrollo del framework, es probable que veamos una mayor integración con otras tecnologías emergentes, como la realidad aumentada, la realidad virtual y quizás incluso con plataformas que aún no se han inventado. Además, a medida que el ecosistema de Flutter madura, es probable que la línea entre el desarrollo nativo y Flutter se vuelva cada vez más borrosa, ofreciendo a los desarrolladores lo mejor de ambos mundos.

En el siguiente capítulo nos familiarizaremos con los Widgets, los distintos tipos que existen y cómo hacer uso de ellos para construir la estructura de nuestras aplicaciones combinándolos entre sí. Una parte esencial para el desarrollo con Flutter y que debemos dominar para poder crear aplicaciones de calidad.

Puedes utilizar los comentarios de abajo para dejar tus dudas, sugerencias o comentarios al respecto de este artículo. Si te ha gustado puedes compartirlo en redes utilizando los botones de abajo.

Happy Coding!

¿Te ha servido esta información?

Tu apoyo nos permite seguir compartiendo conocimiento de calidad. Si alguno de nuestros artículos te han aportado valor, considera hacer una donación para mantener este espacio en marcha y actualizado. ¡Gracias por tu contribución! 😊

Artículos relacionados

Quizá te puedan interesar