Preguntas frecuentes
Preguntas frecuentes y respuestas sobre Flutter.
Introducción
#Esta página recopila algunas preguntas comunes planteadas sobre Flutter. También puedes consultar las siguientes preguntas frecuentes especializadas:
¿Qué es Flutter?
#Flutter es el toolkit portable de interfaz de usuario de Google para crear aplicaciones hermosas y compiladas nativamente para dispositivos móviles, web y escritorio desde una única base de código. Flutter funciona con código existente, es utilizado por desarrolladores u organizaciones de todo el mundo, y es gratuito y de código abierto.
¿Para quién es Flutter?
#Para los usuarios, Flutter hace que cobren vida hermosas aplicaciones.
Para los desarrolladores, Flutter reduce la barrera de entrada para construir aplicaciones. Acelera el desarrollo de aplicaciones y reduce el costo y la complejidad de la producción de aplicaciones en múltiples plataformas.
Para los diseñadores, Flutter proporciona un lienzo para experiencias de usuario de alto nivel. Fast Company describió a Flutter como una de las mejores ideas de diseño de la década por su capacidad para transformar conceptos en código de producción sin las concesiones impuestas por los frameworks típicos. También actúa como una herramienta de prototipado productiva con herramientas de arrastrar y soltar como FlutterFlow e IDEs basados en web como Zapp!.
Para gerentes de ingeniería y empresas, Flutter permite la unificación de los desarrolladores de aplicaciones en un único equipo de aplicaciones móviles, web y de escritorio, construyendo aplicaciones de marca para múltiples plataformas a partir de una sola base de código. Flutter acelera el desarrollo de características y sincroniza los calendarios de lanzamiento en toda la base de clientes.
¿Cuánta experiencia de desarrollo necesito para usar Flutter?
#Flutter es accesible para programadores familiarizados con conceptos orientados a objetos (clases, métodos, variables, etc.) y conceptos de programación imperativa (bucles, condicionales, etc.).
Hemos visto personas con muy poca experiencia en programación aprender y usar Flutter para prototipado y desarrollo de aplicaciones.
¿Qué tipo de aplicaciones puedo construir con Flutter?
#Flutter está diseñado para admitir aplicaciones móviles que se ejecutan tanto en Android como en iOS, así como aplicaciones interactivas que quieras ejecutar en tus páginas web o en el escritorio.
Las aplicaciones que necesitan ofrecer diseños con una fuerte identidad de marca están particularmente bien adaptadas para Flutter. Sin embargo, también puedes crear experiencias con precisión de píxel que coincidan con los lenguajes de diseño de Android e iOS con Flutter.
El ecosistema de paquetes de Flutter admite una amplia variedad de hardware (como cámara, GPS, red, y almacenamiento) y servicios (como pagos, almacenamiento en la nube, autenticación y anuncios).
¿Quién hace Flutter?
#Flutter es un proyecto de código abierto, con contribuciones de Google y otras empresas e individuos.
¿Quién usa Flutter?
#Desarrolladores dentro y fuera de Google usan Flutter para construir aplicaciones hermosas compiladas nativamente para iOS y Android. Para conocer algunas de estas aplicaciones, visita el showcase.
¿Qué hace que Flutter sea único?
#Flutter es diferente a la mayoría de las otras opciones para construir aplicaciones móviles porque no se basa en tecnología de navegador web ni en el conjunto de widgets que vienen con cada dispositivo. En su lugar, Flutter utiliza su propio motor de renderizado de alto rendimiento para dibujar widgets.
Además, Flutter es diferente porque solo tiene una fina capa de código C/C++. Flutter implementa la mayor parte de su sistema (composición, gestos, animación, framework, widgets, etc.) en Dart (un lenguaje moderno, conciso y orientado a objetos) que los desarrolladores pueden abordar, leer, cambiar, reemplazar o eliminar fácilmente. Esto otorga a los desarrolladores un enorme control sobre el sistema, además de reducir significativamente la barrera de accesibilidad para la mayoría del sistema.
¿Debería construir mi próxima aplicación de producción con Flutter?
#Flutter 1 se lanzó el 4 de diciembre de 2018, Flutter 2 el 3 de marzo de 2021, y Flutter 3 el 10 de mayo de 2023. A mayo de 2023, más de un millón de aplicaciones se han publicado usando Flutter en cientos de millones de dispositivos. Echa un vistazo a algunas aplicaciones de muestra en el showcase.
Flutter incluye actualizaciones con una cadencia aproximadamente trimestral que mejoran la estabilidad y el rendimiento y abordan características de usuario frecuentemente solicitadas.
¿Qué proporciona Flutter?
#¿Qué hay dentro del SDK de Flutter?
#Flutter incluye:
- Motor de renderizado 2D fuertemente optimizado y enfocado principalmente en móviles con un excelente soporte para texto
- Framework moderno al estilo React
- Conjunto rico de Widgets que implementan Material Design y el estilo de iOS
- APIs para pruebas unitarias y de integración
- APIs de interoperabilidad y plugins para conectarse al sistema y a SDKs de terceros
- Ejecutor de pruebas headless para ejecutar pruebas en Windows, Linux y Mac
- Flutter DevTools (también llamadas Dart DevTools) para probar, depurar y analizar el rendimiento de tu aplicación
- Herramientas de línea de comandos para crear, construir, probar y compilar tus aplicaciones
¿Funciona Flutter con cualquier editor o IDE?
#Proporcionamos plugins para VS Code, Antigravity (un IDE asistido por IA), Android Studio e IntelliJ IDEA. Consulta la configuración del editor para detalles de instalación, y VS Code y Android Studio/IntelliJ para obtener consejos sobre cómo usar los plugins.
Alternativamente, puedes usar el comando flutter
desde una terminal, junto con uno
de los muchos editores que admiten la edición de Dart.
¿Viene Flutter con un framework?
#¡Sí! Flutter viene con un framework moderno al estilo react. El framework de Flutter está diseñado para ser por capas y personalizable (y opcional). Los desarrolladores pueden optar por usar solo partes del framework, o incluso reemplazar las capas superiores del framework por completo.
¿Flutter viene con Widgets?
#¡Sí! Flutter viene con un conjunto de widgets de Material Design y Cupertino (estilo iOS) de alta calidad, diseños y temas. Por supuesto, estos widgets son solo un punto de partida. Flutter está diseñado para facilitar la creación de tus propios widgets o la personalización de los widgets existentes.
¿Admite Flutter Material Design?
#¡Sí! Los equipos de Flutter y Material colaboran estrechamente, y Material es totalmente compatible. Para más información, consulta los widgets de Material 2 y Material 3 en el catálogo de widgets.
¿Viene Flutter con un framework de pruebas?
#Sí, Flutter proporciona APIs para escribir pruebas unitarias y de integración. Obtén más información sobre la realización de pruebas con Flutter.
Usamos nuestras propias capacidades de prueba para probar nuestro SDK, y medimos nuestra cobertura de pruebas en cada commit.
¿Viene Flutter con herramientas de depuración?
#Sí, Flutter viene con Flutter DevTools (también llamadas Dart DevTools). Para más información, consulta Depuración con Flutter y la documentación de Flutter DevTools.
¿Viene Flutter con un framework de inyección de dependencias?
#No incluimos una solución dogmática predeterminada, pero hay una variedad de paquetes que ofrecen inyección de dependencias y localización de servicios, tales como injectable, get_it, kiwi y riverpod.
Tecnología
#¿Con qué tecnología está construido Flutter?
#Flutter está construido con C, C++, Dart, Skia (un motor de renderizado 2D), e Impeller (el motor de renderizado predeterminado en iOS). Consulta este diagrama de arquitectura para obtener una mejor imagen de los componentes principales. Para una descripción más detallada de la arquitectura por capas de Flutter, lee la visión general arquitectónica.
¿Cómo ejecuta Flutter mi código en Android?
#El código C y C++ del motor se compila con el NDK de Android.
El código Dart (tanto el del SDK como el tuyo)
se compila AOT (ahead-of-time) en librerías nativas ARM y x86-64.
Esas librerías se incluyen en un proyecto "runner"
de Android, y todo el conjunto se construye dentro de un .apk.
Al iniciarse, la aplicación carga la librería de Flutter.
Cualquier renderizado, entrada o manejo de eventos, y así sucesivamente,
se delega al código compilado de Flutter y de la aplicación.
Esto es similar a la forma en que funcionan muchos motores de juegos.
Durante el modo debug, Flutter utiliza una máquina virtual (VM) para ejecutar su código con el fin de habilitar el Hot Reload stateful, una característica que te permite realizar cambios en tu código en ejecución sin necesidad de recompilar. Verás un banner "debug" en la esquina superior derecha de tu aplicación cuando se ejecute en este modo, para recordarte que el rendimiento no es característico de la aplicación de lanzamiento final.
¿Cómo ejecuta Flutter mi código en iOS?
#El código C y C++ del motor se compila con LLVM.
El código Dart (tanto el del SDK como el tuyo)
se compila AOT (ahead-of-time) en una librería nativa ARM.
Esa librería se incluye en un proyecto "runner" de iOS,
y todo el conjunto se construye dentro de un .ipa.
Al iniciarse, la aplicación carga la librería de Flutter.
Cualquier renderizado, entrada o manejo de eventos, y así sucesivamente,
se delega al código compilado de Flutter y de la aplicación.
Esto es similar a la forma en que funcionan muchos motores de juegos.
Durante el modo debug, Flutter utiliza una máquina virtual (VM) para ejecutar su código con el fin de habilitar el Hot Reload stateful, una característica que te permite realizar cambios en tu código en ejecución sin recompilar. Verás un banner "debug" en la esquina superior derecha de tu aplicación cuando se ejecute en este modo, para recordarte que el rendimiento no es característico de la aplicación de lanzamiento final.
¿Utiliza Flutter los Widgets de plataforma integrados en mi sistema operativo?
#No. En su lugar, Flutter proporciona un conjunto de widgets (incluyendo widgets de Material Design y Cupertino (estilo iOS)), gestionados y renderizados por el framework y el motor de Flutter. Puedes explorar un catálogo de widgets de Flutter.
Creemos que el resultado final son aplicaciones de mayor calidad. Si reutilizáramos los widgets de plataforma integrados, la calidad y el rendimiento de las aplicaciones de Flutter estarían limitados por la flexibilidad y la calidad de dichos widgets.
En Android, por ejemplo, hay un conjunto de gestos codificados de forma fija y reglas fijas para desambiguarlos. En Flutter, puedes escribir tu propio reconocedor de gestos que sea un participante de primer orden en el sistema de gestos. Además, dos widgets creados por personas diferentes pueden coordinarse para desambiguar gestos.
Las tendencias modernas de diseño de aplicaciones apuntan a que los diseñadores y usuarios desean UIs con más animaciones y diseños centrados en la marca. Para lograr ese nivel de diseño hermoso y personalizado, Flutter está diseñado para controlar los píxeles directamente en lugar de los widgets integrados.
Al utilizar el mismo renderizador, framework y conjunto de widgets, es más fácil publicar para múltiples plataformas desde la misma base de código, sin tener que realizar una planificación cuidadosa y costosa para alinear diferentes conjuntos de características y características de la API.
Al usar un solo lenguaje, un solo framework y un solo conjunto de librerías para todo tu código (independientemente de si tu UI es diferente para cada plataforma o no), también buscamos ayudar a reducir los costos de desarrollo y mantenimiento de aplicaciones.
¿Qué sucede cuando el sistema operativo móvil se actualiza e introduce nuevos Widgets?
#El equipo de Flutter observa la adopción y la demanda de nuevos widgets móviles de iOS y Android, y tiene como objetivo trabajar con la comunidad para construir soporte para nuevos widgets. Este trabajo puede venir en forma de características del framework de nivel inferior, nuevos widgets componibles, o nuevas implementaciones de widgets.
La arquitectura por capas de Flutter está diseñada para admitir numerosas librerías de widgets, y animamos y respaldamos a la comunidad en la creación y mantenimiento de librerías de widgets.
¿Qué sucede cuando mi sistema operativo móvil se actualiza e introduce nuevas capacidades de la plataforma?
#El sistema de interoperabilidad y plugins de Flutter está diseñado para permitir a los desarrolladores acceder de inmediato a las nuevas características y capacidades del SO móvil. Los desarrolladores no tienen que esperar a que el equipo de Flutter exponga la nueva capacidad del SO móvil.
¿Admite Flutter el envío de código dinámico (code push)?
#Code push, o la capacidad de enviar actualizaciones de la aplicación directamente al dispositivo del usuario, no es compatible directamente con Flutter. Sin embargo, somos conscientes de una solución de terceros, llamada Shorebird. Ten en cuenta que esto no es un respaldo o recomendación oficial.
¿Qué sistemas operativos puedo usar para construir una aplicación de Flutter?
#Flutter admite el desarrollo utilizando Linux, macOS, ChromeOS y Windows.
¿En qué lenguaje está escrito Flutter?
#Dart, un lenguaje moderno de rápido crecimiento optimizado para aplicaciones cliente. El framework gráfico subyacente y la máquina virtual de Dart están implementados en C/C++.
¿Por qué Flutter eligió usar Dart?
#Durante la fase de desarrollo inicial, el equipo de Flutter evaluó muchos lenguajes y entornos de ejecución, y finalmente adoptó Dart para el framework y los widgets. Flutter utilizó cuatro dimensiones principales para la evaluación, y consideró las necesidades de los autores del framework, desarrolladores y usuarios finales. Encontramos que muchos lenguajes cumplían con algunos requisitos, pero Dart obtuvo una puntuación alta en todas nuestras dimensiones de evaluación y cumplió con todos nuestros requisitos y criterios.
Los entornos de ejecución y compiladores de Dart admiten la combinación de dos características críticas para Flutter: un ciclo de desarrollo rápido basado en JIT que permite cambios de forma y Hot Reload stateful en un lenguaje con tipos, más un compilador AOT (Ahead-of-Time) que emite código ARM eficiente para un inicio rápido y un rendimiento predecible en despliegues de producción.
Además, tenemos la oportunidad de trabajar de cerca con la comunidad de Dart, la cual está invirtiendo activamente recursos en mejorar Dart para su uso en Flutter. Por ejemplo, cuando adoptamos Dart, el lenguaje no tenía un conjunto de herramientas AOT (ahead-of-time) para producir binarios nativos, lo cual es fundamental para lograr un alto rendimiento predecible, pero ahora el lenguaje lo tiene porque el equipo de Dart lo construyó para Flutter. De manera similar, la VM de Dart se había optimizado anteriormente para el rendimiento del procesamiento (throughput), pero el equipo ahora está optimizando la VM para la latencia, lo cual es más importante para la carga de trabajo de Flutter.
Dart tiene una puntuación alta para nosotros en los siguientes criterios principales:
- Productividad del desarrollador
-
Una de las principales propuestas de valor de Flutter es que ahorra recursos de ingeniería al permitir a los desarrolladores crear aplicaciones tanto para iOS como para Android con la misma base de código. Usar un lenguaje altamente productivo acelera aún más a los desarrolladores y hace que Flutter sea más atractivo. Esto fue muy importante tanto para nuestro equipo del framework como para nuestros desarrolladores. La mayoría de Flutter está construido en el mismo lenguaje que entregamos a nuestros usuarios, por lo que necesitamos mantenernos productivos con cientos de miles de líneas de código, sin sacrificar la accesibilidad o la legibilidad del framework y los widgets para nuestros desarrolladores.
- Orientación a objetos
-
Para Flutter, queremos un lenguaje que se adapte al dominio del problema de Flutter: crear experiencias visuales de usuario. La industria tiene múltiples décadas de experiencia construyendo frameworks de interfaz de usuario en lenguajes orientados a objetos. Si bien podríamos usar un lenguaje no orientado a objetos, esto significaría reinventar la rueda para resolver varios problemas difíciles. Además, la gran mayoría de los desarrolladores tienen experiencia con el desarrollo orientado a objetos, lo que facilita aprender a desarrollar con Flutter.
- Rendimiento alto y predecible
-
Con Flutter, queremos capacitar a los desarrolladores para crear experiencias de usuario rápidas y fluidas. Para lograrlo, necesitamos ser capaces de ejecutar una cantidad significativa de código del desarrollador final durante cada cuadro de animación. Eso significa que necesitamos un lenguaje que ofrezca tanto un alto rendimiento como un rendimiento predecible, sin pausas periódicas que causen caídas de fotogramas.
- Asignación rápida
-
El framework de Flutter utiliza un flujo de estilo funcional que depende en gran medida de que el asignador de memoria subyacente maneje eficientemente asignaciones pequeñas y de corta duración. Este estilo se desarrolló en lenguajes con esta propiedad y no funciona eficientemente en lenguajes que carecen de esta facilidad.
¿Puede Flutter ejecutar cualquier código de Dart?
#Flutter puede ejecutar código Dart que no importe directamente o
transitivamente dart:mirrors o dart:html.
¿Puede Flutter compilar Dart a JavaScript?
#Flutter compila Dart a JavaScript con el
paquete js.dart.
¿Qué tan grande es el motor (engine) de Flutter?
#En marzo de 2021, medimos el tamaño de descarga de una
aplicación mínima de Flutter
(sin Material Components,
solo un único widget Center, construida con flutter build apk --split-per-abi), empaquetada y comprimida como un APK de release,
obteniendo aproximadamente 4.3 MB para ARM32 y 4.8 MB para ARM64.
En ARM32, el motor principal tiene aproximadamente 3.4 MB
(comprimido), el código del framework + aplicación es de aproximadamente
765 KB (comprimido), el archivo LICENSE tiene 58 KB
(comprimido) y el código Java necesario (classes.dex)
es de 120 KB (comprimido).
En ARM64, el motor principal tiene aproximadamente 4.0 MB
(comprimido), el código del framework + aplicación es de aproximadamente
659 KB (comprimido), el archivo LICENSE tiene 58 KB
(comprimido) y el código Java necesario (classes.dex)
es de 120 KB (comprimido).
Estos números se midieron utilizando apkanalyzer, el cual también está integrado en Android Studio.
En iOS, un IPA de release de la misma aplicación tiene un tamaño de descarga de 10.9 MB en un iPhone X, según lo reportado por App Store Connect de Apple. El IPA es más grande que el APK principalmente porque Apple encripta los binarios dentro del IPA, lo que hace que la compresión sea menos eficiente (consulta la sección iOS App Store Specific Considerations del QA1795 de Apple).
Por supuesto, te recomendamos que midas tu propia aplicación. Para hacer eso, consulta Medición del tamaño de tu aplicación.
¿Cómo define Flutter un píxel?
#Flutter utiliza píxeles lógicos,
y a menudo se refiere a ellos simplemente como "píxeles".
El devicePixelRatio
de Flutter expresa la relación
entre los píxeles físicos y los píxeles lógicos de CSS.
Capacidades
#¿Qué tipo de rendimiento de la aplicación puedo esperar?
#En general, puedes esperar un excelente rendimiento. Flutter está diseñado para ayudar a los desarrolladores a lograr fácilmente unos 60fps constantes. Las aplicaciones de Flutter se ejecutan mediante código compilado nativamente, por lo que no hay intérpretes involucrados. Esto significa que las aplicaciones de Flutter se inician rápidamente.
El rendimiento de Flutter al usar código nativo depende de la arquitectura de tu aplicación. Para un rendimiento óptimo, familiarízate con los canales de plataforma de Flutter. Estos canales proporcionan un sistema asíncrono de paso de mensajes para comunicarse con el código nativo.
Para obtener más información sobre el rendimiento y Flutter, consulta las Preguntas frecuentes sobre rendimiento.
¿Qué tipo de ciclos de desarrollo puedo esperar? ¿Cuánto tiempo transcurre entre la edición y la recarga?
#Flutter implementa un ciclo de desarrollo de Hot Reload. Puedes esperar tiempos de recarga inferiores a un segundo, en un dispositivo o en un emulador/simulador.
El Hot Reload de Flutter es stateful por lo que el State de la aplicación se conserva después de una recarga. Esto significa que puedes iterar rápidamente en una pantalla profundamente anidada en tu aplicación, sin comenzar desde la pantalla de inicio después de cada recarga.
¿En qué se diferencia el Hot Reload del Hot Restart?
#El Hot Reload funciona inyectando archivos de código fuente actualizados en la VM (Máquina Virtual) de Dart en ejecución. Esto no solo agrega nuevas clases, sino que también agrega métodos y campos a clases existentes, y cambia funciones existentes. El Hot Restart restablece el State al estado inicial de la aplicación.
Para más información, consulta Hot Reload.
¿Dónde puedo desplegar mi aplicación de Flutter?
#Puedes compilar y desplegar tu aplicación de Flutter en iOS, Android, web y escritorio.
¿En qué dispositivos y versiones de sistema operativo se ejecuta Flutter?
#-
Admitimos y probamos la ejecución de Flutter en una variedad de plataformas, desde gama baja hasta gama alta. Para obtener una lista detallada de las plataformas en las que realizamos pruebas, consulta la lista de plataformas soportadas.
-
Flutter admite la construcción de librerías compiladas ahead-of-time (AOT) para
x86-64,armeabi-v7ayarm64-v8a. -
Las aplicaciones construidas para ARMv7 o ARM64 se ejecutan bien (utilizando emulación ARM) en muchos dispositivos Android x86-64.
-
Admitimos el desarrollo de aplicaciones de Flutter en una gama de plataformas. Consulta los requisitos del sistema enumerados en cada sistema operativo de desarrollo.
¿Se ejecuta Flutter en la web?
#Sí, el soporte web está disponible en el canal estable. Para más detalles, consulta las instrucciones web.
¿Puedo usar Flutter para construir aplicaciones de escritorio?
#Sí, el soporte de escritorio está en estable para Windows, macOS y Linux.
¿Puedo usar Flutter dentro de mi aplicación nativa existente?
#Sí, obtén más información en la sección add-to-app de nuestro sitio web.
¿Puedo acceder a servicios de la plataforma y APIs como sensores y almacenamiento local?
#Sí. Flutter ofrece a los desarrolladores acceso listo para usar a algunos servicios y APIs específicos de la plataforma del sistema operativo. Sin embargo, queremos evitar el problema del "mínimo común denominador" presente en la mayoría de las APIs multiplataforma, por lo que no pretendemos construir APIs multiplataforma para todos los servicios y APIs nativos.
Varios servicios y APIs de la plataforma tienen paquetes listos para usar disponibles en pub.dev. Usar un paquete existente es fácil.
Finalmente, animamos a los desarrolladores a utilizar el sistema asíncrono de paso de mensajes de Flutter para crear sus propias integraciones con APIs de la plataforma y de terceros. Los desarrolladores pueden exponer tanto o tan poco de las APIs de la plataforma como necesiten, y construir capas de abstracciones que se adapten mejor a su proyecto.
¿Puedo extender y personalizar los Widgets incluidos?
#Absolutamente. El sistema de widgets de Flutter fue diseñado para ser fácilmente personalizable.
En lugar de hacer que cada widget proporcione una gran cantidad de parámetros,
Flutter adopta la composición. Los Widgets se construyen a partir de widgets
más pequeños que puedes reutilizar y combinar de formas novedosas para crear
widgets personalizados. Por ejemplo, en lugar de crear una subclase de un widget de botón genérico,
ElevatedButton combina un widget de Material con un
widget GestureDetector. El widget de Material proporciona el diseño
visual y el widget GestureDetector proporciona el
diseño de interacción.
Para crear un botón con un diseño visual personalizado, puedes combinar
widgets que implementen tu diseño visual con un GestureDetector,
el cual proporciona el diseño de interacción. Por ejemplo,
CupertinoButton sigue este enfoque y combina un
GestureDetector con varios otros widgets que implementan su
diseño visual.
La composición te brinda el máximo control sobre el diseño visual y de interacción de tus widgets, al tiempo que permite una gran cantidad de reutilización de código. En el framework, hemos descompuesto widgets complejos en piezas que implementan por separado el diseño visual, de interacción y de animación. Puedes meclar estos widgets como quieras para crear tus propios widgets personalizados que tengan un rango completo de expresión.
¿Por qué querría compartir el código de diseño (layout) entre iOS y Android?
#Puedes optar por implementar diferentes diseños de aplicación para iOS y Android. Los desarrolladores son libres de verificar el SO móvil en tiempo de ejecución y renderizar diferentes diseños, aunque encontramos que esta práctica es rara.
Cada vez más, vemos que los diseños y la apariencia de las aplicaciones móviles evolucionan para estar más orientados a la marca y unificados en todas las plataformas. Esto implica una fuerte motivación para compartir código de diseño e interfaz de usuario en iOS y Android.
La identidad de marca y la personalización del diseño estético de la aplicación se está volviendo ahora más importante que adherirse estrictamente a la estética tradicional de la plataforma. Por ejemplo, los diseños de aplicaciones a menudo requieren fuentes, colores, formas, animaciones personalizadas y más para transmitir claramente su identidad de marca.
También vemos patrones de diseño comunes desplegados en iOS y Android. Por ejemplo, el patrón "bottom nav bar" ahora se puede encontrar de forma natural en iOS y Android. Parece haber una convergencia de ideas de diseño en las plataformas móviles.
¿Puedo interoperar con el lenguaje de programación predeterminado de mi plataforma móvil?
#Sí, Flutter admite llamadas a la plataforma,
incluyendo la integración con código Java o Kotlin en Android,
y código Swift u Objective-C en iOS.
Esto se habilita mediante un estilo flexible de paso de mensajes
donde una aplicación de Flutter puede enviar y recibir mensajes
hacia la plataforma móvil utilizando un BasicMessageChannel.
Obtén más información sobre el acceso a servicios de plataforma y de terceros en Flutter con canales de plataforma.
Aquí hay un proyecto de ejemplo que muestra cómo usar un canal de plataforma para acceder a la información del estado de la batería en iOS y Android.
¿Viene Flutter con un sistema de reflexión / espejos (mirrors)?
#No. Dart incluye dart:mirrors,
el cual proporciona reflexión de tipos. Pero dado que
las aplicaciones de Flutter están precompiladas para producción,
y el tamaño del binario es siempre una preocupación en las aplicaciones móviles,
esta librería no está disponible para las aplicaciones de Flutter.
Mediante el análisis estático podemos eliminar todo lo que no se utilice ("tree shaking"). Si importas una librería Dart enorme pero solo usas un método autocontenido de dos líneas, entonces solo pagas el costo del método de dos líneas, incluso si esa librería Dart en sí importa docenas y docenas de otras librerías. Esta garantía solo es segura si Dart puede identificar la ruta del código en tiempo de compilación. Hasta la fecha, hemos encontrado otros enfoques para necesidades específicas que ofrecen un mejor balance, como la generación de código.
¿Se admiten la internacionalización y la localización?
#Sí, Flutter admite la internacionalización (i18n) y la localización (l10n) para que tus aplicaciones sean adaptables a diferentes idiomas y culturas. Puedes obtener más información en la documentación de internacionalización.
¿Qué accesibilidad es compatible?
#Flutter admite estrictos requisitos de accesibilidad (a11y). Por ejemplo, los lectores de pantalla, el texto grande, el contraste de color y el control por interruptores de hardware son todos compatibles. Para saber más, consulta la documentación de accesibilidad.
¿Cómo escribo aplicaciones paralelas y/o concurrentes para Flutter?
#Flutter admite isolates. Los Isolates son heaps independientes en la VM de Flutter, y pueden ejecutarse en paralelo (usualmente implementados como hilos separados). Los Isolates se comunican enviando y recibiendo mensajes asíncronos.
Consulta un ejemplo de uso de isolates con Flutter.
¿Puedo ejecutar código de Dart en segundo plano en una aplicación de Flutter?
#Sí, puedes ejecutar código Dart en un proceso en segundo plano tanto en iOS como en Android. Para más información, consulta el artículo gratuito de Medium Executing Dart in the Background with Flutter Plugins and Geofencing.
¿Puedo usar JSON/XML/Protobufs (y así sucesivamente) con Flutter?
#
Absolutamente. Hay librerías en pub.dev para JSON, XML, protobufs, y muchas otras utilidades y formatos.
Para una explicación detallada sobre el uso de JSON con Flutter, consulta el tutorial de JSON.
¿Puedo construir aplicaciones 3D (OpenGL) con Flutter?
#Hoy en día no admitimos 3D usando OpenGL ES o similar. Tenemos planes a largo plazo para exponer una API 3D optimizada, pero en este momento estamos enfocados en 2D.
¿Por qué mi APK o IPA es tan grande?
#Por lo general, los assets que incluyen imágenes, archivos de sonido, fuentes, etc., constituyen la mayor parte de un APK o IPA. Varias herramientas en los ecosistemas de Android e iOS pueden ayudarte a comprender qué hay dentro de tu APK o IPA.
Además, asegúrate de crear un build de release de tu APK o IPA con las herramientas de Flutter. Un build de release suele ser mucho más pequeño que un build de debug.
Obtén más información sobre la creación de un build de release de tu aplicación Android, y la creación de un build de release de tu aplicación iOS. Además, consulta Medición del tamaño de tu aplicación.
¿Se ejecutan las aplicaciones de Flutter en Chromebooks?
#Hemos visto aplicaciones de Flutter ejecutarse en algunos Chromebooks. Estamos haciendo un seguimiento de los problemas relacionados con la ejecución de Flutter en Chromebooks.
¿Es Flutter compatible con ABI?
#Flutter y Dart no ofrecen compatibilidad de interfaz binaria de aplicación (ABI). Ofrecer compatibilidad ABI no es un objetivo actual para Flutter o Dart.
¿Cómo maneja Flutter el desplazamiento (scrolling)?
#Se utiliza una implementación de desplazamiento personalizada para cada plataforma de aplicación para que el desplazamiento coincida con la apariencia y sensación de desplazamiento nativo de esa plataforma. Para aprender más sobre el desplazamiento con Flutter, consulta la documentación sobre desplazamiento.
Framework
#¿Por qué el método build() está en State y no en StatefulWidget?
#Colocar un método Widget build(BuildContext context) en State
en lugar de colocar un método Widget build(BuildContext context, State state)
en StatefulWidget otorga a los desarrolladores más flexibilidad al
crear subclases de StatefulWidget. Puedes leer una
discusión más detallada en la documentación de la API para State.build.
¿Dónde está el lenguaje de marcado de Flutter? ¿Por qué Flutter no tiene una sintaxis de marcado?
#Las UIs de Flutter se construyen con un lenguaje imperativo y orientado a objetos (Dart, el mismo lenguaje utilizado para construir el framework de Flutter). Flutter no incluye un marcado declarativo.
Descubrimos que las UIs construidas dinámicamente con código permiten una mayor flexibilidad. Por ejemplo, hemos encontrado difícil que un sistema de marcado rígido exprese y produzca widgets personalizados con comportamientos a medida.
También hemos encontrado que nuestro enfoque de "código primero" permite mejor características como Hot Reload y adaptaciones dinámicas del entorno.
Es posible crear un lenguaje personalizado que luego se convierta en widgets al vuelo. Debido a que los métodos build son "solo código", pueden hacer cualquier cosa, incluyendo interpretar marcado y convertirlo en widgets.
Mi aplicación tiene un banner/cinta de Debug en la esquina superior derecha. ¿Por qué veo eso?
#Por defecto, el comando flutter run utiliza la
configuración de build de debug.
La configuración de debug ejecuta tu código Dart en una VM (Máquina Virtual) habilitando un ciclo de desarrollo rápido con Hot Reload (los builds de release se compilan usando las cadenas de herramientas estándar de Android e iOS).
La configuración de debug también verifica todas las aserciones, lo que te ayuda
a detectar errores de forma temprana durante el desarrollo, pero impone un
costo en tiempo de ejecución. El banner "Debug" indica que estas verificaciones
están habilitadas. Puedes ejecutar tu aplicación sin estas verificaciones utilizando
el flag --profile o --release con flutter run.
Si tu IDE utiliza el plugin de Flutter, puedes lanzar la aplicación en modo profile o release. Para VS Code, usa las entradas de menú Run > Start debugging o Run > Run without debugging. Para IntelliJ, usa las entradas de menú Run > Flutter Run in Profile Mode o Release Mode.
¿Qué paradigma de programación utiliza el framework de Flutter?
#Flutter es un entorno de programación multiparadigma. Muchas técnicas de programación desarrolladas en las últimas décadas se utilizan en Flutter. Usamos cada una donde creemos que las fortalezas de la técnica la hacen particularmente adecuada. Sin ningún orden en particular:
- Composición
-
El paradigma principal utilizado por Flutter es el de usar objetos pequeños con alcances de comportamiento estrechos, compuestos juntos para obtener efectos más complicados, a veces llamado composición agresiva. La mayoría de los widgets en la librería de widgets de Flutter están construidos de esta manera. Por ejemplo, la clase
TextButtonde Material está construida utilizando unIconTheme, unInkWell, unPadding, unCenter, unMaterial, unAnimatedDefaultTextStyley unConstrainedBox. ElInkWellestá construido usando unGestureDetector. ElMaterialestá construido usando unAnimatedDefaultTextStyle, unNotificationListenery unAnimatedPhysicalModel. Y así sucesivamente. Todo se reduce a widgets. - Programación funcional
-
Se pueden construir aplicaciones enteras solo con
StatelessWidgets, los cuales son esencialmente funciones que describen cómo los argumentos se mapean a otras funciones, tocando fondo en primitivas que calculan diseños o dibujan gráficos. (Dichas aplicaciones no pueden tener State fácilmente, por lo que típicamente no son interactivas). Por ejemplo, el widgetIcones esencialmente una función que mapea sus argumentos (color,icon,size) en primitivas de diseño. Además, se hace un uso intensivo de estructuras de datos inmutables, incluyendo toda la jerarquía de clases deWidgetasí como numerosas clases de soporte tales comoRectyTextStyle. A menor escala, la APIIterablede Dart, que hace un uso intensivo del estilo funcional (map, reduce, where, etc.), se utiliza con frecuencia para procesar listas de valores en el framework. - Programación orientada a eventos
-
Las interacciones del usuario se representan mediante objetos de eventos que se despachan a callbacks registrados con manejadores de eventos. Las actualizaciones de pantalla se activan mediante un mecanismo de callback similar. La clase
Listenable, que se utiliza como base del sistema de animación, formaliza un modelo de suscripción para eventos con múltiples oyentes. - Programación orientada a objetos basada en clases
-
La mayoría de las APIs del framework están construidas utilizando clases con herencia. Usamos un enfoque mediante el cual definimos APIs de muy alto nivel en nuestras clases base y luego las especializamos iterativamente en subclases. Por ejemplo, nuestros objetos de renderizado tienen una clase base (
RenderObject) que es agnóstica con respecto al sistema de coordenadas, y luego tenemos una subclase (RenderBox) que introduce la opinión de que la geometría debe basarse en el sistema de coordenadas cartesiano (x/ancho e y/alto). - Programación orientada a objetos basada en prototipos
-
La clase
ScrollPhysicsencadena instancias para componer la física que se aplica al desplazamiento dinámicamente en tiempo de ejecución. Esto permite que el sistema componga, por ejemplo, la física de paginación con la física específica de la plataforma, sin que la plataforma tenga que ser seleccionada en tiempo de compilación. - Programación imperativa
-
La programación imperativa directa, generalmente combinada con el State encapsulado dentro de un objeto, se utiliza donde proporciona la solución más intuitiva. Por ejemplo, las pruebas se escriben en un estilo imperativo, describiendo primero la situación bajo prueba, luego listando los invariantes que la prueba debe cumplir, luego adelantando el reloj o insertando eventos según sea necesario para la prueba.
- Programación reactiva
-
Los árboles de widgets y elementos se describen a veces como reactivos, porque las nuevas entradas proporcionadas en el constructor de un widget se propagan inmediatamente como cambios a widgets de nivel inferior mediante el método build del widget, y los cambios realizados en los widgets inferiores (por ejemplo, en respuesta a la entrada del usuario) se propagan de regreso hacia arriba en el árbol utilizando manejadores de eventos. Aspectos tanto de la programación funcional-reactiva como de la imperativa-reactiva están presentes en el framework, según las necesidades de los widgets. Los widgets con métodos build que consisten únicamente en una expresión que describe cómo el widget reacciona a los cambios en su configuración son widgets funcionales reactivos (por ejemplo, la clase
Dividerde Material). Los widgets cuyos métodos build construyen una lista de hijos a lo largo de varias sentencias, describiendo cómo el widget reacciona a los cambios en su configuración, son widgets imperativos reactivos (por ejemplo, la claseChip). - Programación declarativa
-
Los métodos build de los widgets son a menudo una sola expresión con múltiples niveles de constructores anidados, escritos utilizando un subconjunto estrictamente declarativo de Dart. Tales expresiones anidadas podrían transformarse mecánicamente hacia o desde cualquier lenguaje de marcado lo suficientemente expresivo. Por ejemplo, el widget
UserAccountsDrawerHeadertiene un método build largo (más de 20 líneas), que consta de una sola expresión anidada. Esto también se puede combinar con el estilo imperativo para construir UIs que serían más difíciles de describir en un enfoque puramente declarativo. - Programación genérica
-
Los tipos se pueden utilizar para ayudar a los desarrolladores a detectar errores de programación temprano. El framework de Flutter utiliza la programación genérica para ayudar a este respecto. Por ejemplo, la clase
Stateestá parametrizada en términos del tipo de su widget asociado, de modo que el analizador de Dart pueda detectar incompatibilidades entre estados y widgets. De manera similar, la claseGlobalKeytoma un parámetro de tipo para poder acceder al State de un widget remoto de forma segura con respecto al tipo (usando comprobación en tiempo de ejecución), la interfazRouteestá parametrizada con el tipo que se espera que use cuando sea retirada de la pila (popped), y colecciones comoLists,Maps ySets están todas parametrizadas para que los elementos no coincidentes puedan ser detectados tempranamente, ya sea durante el análisis o en tiempo de ejecución durante la depuración. - Programación concurrente
-
Flutter hace un uso intensivo de
Futures y otras APIs asíncronas. Por ejemplo, el sistema de animación notifica cuándo finaliza una animación completando un Future. Del mismo modo, el sistema de carga de imágenes utiliza futures para informar cuándo se ha completado una carga. - Programación por restricciones
-
El sistema de diseño (layout) en Flutter utiliza una forma débil de programación por restricciones para determinar la geometría de una escena. Las restricciones (por ejemplo, para cajas cartesianas, un ancho mínimo y máximo y un alto mínimo y máximo) se pasan de padre a hijo, y el hijo selecciona una geometría resultante (por ejemplo, para cajas cartesianas, un tamaño, específicamente un ancho y un alto) que cumple con esas restricciones. Al utilizar esta técnica, Flutter generalmente puede diseñar una escena entera con una sola pasada.
Proyecto
#¿Dónde puedo obtener soporte?
#Si crees que has encontrado un error, regístralo en nuestro rastreador de problemas. También puedes usar Stack Overflow para preguntas de tipo "cómo hacer algo". Para discusiones, únete a nuestra lista de correo en flutter-dev@googlegroups.com o búscanos en Discord.
Para más información, consulta nuestra página de la Comunidad.
¿Cómo puedo involucrarme?
#Flutter es de código abierto y te animamos a contribuir. Puedes comenzar simplemente registrando problemas para solicitudes de características y errores en nuestro rastreador de problemas.
Te recomendamos que te unas a nuestra lista de correo en flutter-dev@googlegroups.com y nos hagas saber cómo estás usando Flutter y qué te gustaría hacer con él.
Si estás interesado en contribuir con código, puedes comenzar leyendo nuestra Guía para contribuir y consultar nuestra lista de problemas sencillos para principiantes.
Finalmente, puedes conectarte con comunidades útiles de Flutter. Para más información, consulta la página de la Comunidad.
También puedes interactuar con otros desarrolladores en el Discord de Flutter.
¿Es Flutter de código abierto?
#Sí, Flutter es una tecnología de código abierto. Puedes encontrar el proyecto en GitHub.
¿Qué licencia(s) de software se aplican a Flutter y sus dependencias?
#Flutter incluye dos componentes: un motor que se entrega como un binario enlazado dinámicamente, y el framework de Dart como un binario independiente que el motor carga. El motor utiliza múltiples componentes de software con muchas dependencias; consulta la lista completa en su archivo de licencia.
El framework es completamente autónomo y requiere solo una licencia.
Además, cualquier paquete de Dart que utilices podría tener sus propios requisitos de licencia.
¿Cómo puedo determinar las licencias que necesita mostrar mi aplicación de Flutter?
#Existe una API para encontrar la lista de licencias que necesitas mostrar:
-
Si tu aplicación tiene un
Drawer, agrega unAboutListTile. -
Si tu aplicación no tiene un Drawer pero sí utiliza la librería Material Components, llama a
showAboutDialogo ashowLicensePage. -
Para un enfoque más personalizado, puedes obtener las licencias en bruto desde el
LicenseRegistry.
¿Quién trabaja en Flutter?
#¡Todos lo hacemos! Flutter es un proyecto de código abierto. Actualmente, la mayor parte del desarrollo es realizado por ingenieros de Google. Si te entusiasma Flutter, ¡te animamos a unirte a la comunidad y contribuir a Flutter!
¿Cuáles son los principios guía de Flutter?
#Creemos lo siguiente:
- Para llegar a todos los usuarios potenciales, los desarrolladores necesitan dirigirse a múltiples plataformas móviles.
- HTML y las WebViews, tal como existen hoy en día, dificultan el alcance constante de altas tasas de fotogramas y el logro de experiencias de alta fidelidad, debido al comportamiento automático (desplazamiento, diseño) y al soporte heredado.
- Hoy en día, resulta demasiado costoso construir la misma aplicación múltiples veces: requiere diferentes equipos, diferentes bases de código, diferentes flujos de trabajo, diferentes herramientas, etc.
- Los desarrolladores quieren una forma más fácil y mejor de usar una sola base de código para construir aplicaciones móviles para múltiples plataformas de destino, y no quieren sacrificar calidad, control ni rendimiento.
Estamos enfocados en tres cosas:
- Control
-
Los desarrolladores merecen acceso y control sobre todas las capas del sistema. Lo que lleva a:
- Rendimiento
-
Los usuarios merecen aplicaciones perfectamente fluidas, responsivas y libres de tirones (jank-free). Lo que lleva a:
- Fidelidad:
-
Todos merecen experiencias de aplicación precisas, hermosas y encantadoras.
¿Rechazará Apple mi aplicación de Flutter?
#No podemos hablar en nombre de Apple, pero su App Store contiene muchas aplicaciones construidas con tecnologías de framework como Flutter. De hecho, Flutter utiliza el mismo modelo arquitectónico fundamental que Unity, el motor que impulsa muchos de los juegos más populares en la tienda de Apple.
Apple ha destacado frecuentemente aplicaciones bien diseñadas que están construidas con Flutter, incluyendo Hamilton y Reflectly.
Al igual que con cualquier aplicación enviada a la tienda de Apple, las aplicaciones construidas con Flutter deben seguir las pautas de Apple para el envío a la App Store.
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-06-08. Ver código fuente oreportar un problema.