Este año, lanzamos la biblioteca de Maps Compose, una biblioteca de Jetpack Compose que te permite agregar Google Maps a tu app. En esencia, Maps Compose es una biblioteca de interoperabilidad para el SDK de Maps para Android que expone API compatibles con Compose. A fin de crear los elementos que admiten composición de Maps Compose, debíamos trabajar con las limitaciones de la API existente del SDK de Maps y las funciones de interoperabilidad disponibles de Compose.


Este año, lanzamos la biblioteca de Maps Compose, una biblioteca de Jetpack Compose que te permite agregar Google Maps a tu app. En esencia, Maps Compose es una biblioteca de interoperabilidad para el SDK de Maps para Android que expone API compatibles con Compose. A fin de crear los elementos que admiten composición de Maps Compose, debíamos trabajar con las limitaciones de la API existente del SDK de Maps y las funciones de interoperabilidad disponibles de Compose.

Se realizaron diferentes iteraciones de diseño e implementación en Maps Compose antes de llegar a la versión inicial. En esta entrada de blog, hablaré sobre el contexto de Maps Compose: cómo se creó y qué aprendimos durante su desarrollo. Esta entrada es especialmente relevante para desarrolladores de SDK que quieran brindar compatibilidad con Compose. No obstante, también debería serlo para los lectores curiosos sobre el tema. Si entras en alguno de estos segmentos, sigue leyendo.

Contexto

Antes de que Maps Compose estuviera disponible, ya era posible utilizar el SDK de Maps en Compose gracias a sus API de interoperabilidad; en concreto, el elemento que admite composición AndroidView. Los casos de uso sencillos, como la visualización de un mapa con un solo marcador, eran claros, pero para las integraciones algo complejas con muchas personalizaciones y dibujos era necesario escribir una gran cantidad de código de interoperabilidad. Por lo tanto, el uso no era tan simple.

A fin de estimar la utilidad que podría tener una biblioteca de Compose para los desarrolladores de Android, tuiteé lo siguiente:

Vista previa de la API de Maps Compose.

Para mi sorpresa, muchos desarrolladores respondieron con mensajes como: “¡Sí, por favor!”, “¡Genial!” y “Esto reemplazaría cientos de líneas de código”. 🤯 Como formo parte del grupo de ingenieros de Relaciones con Desarrolladores que están trabajando en el SDK de Maps, me pareció adecuado priorizar el lanzamiento de elementos que admiten composición para el SDK de Maps. A raíz de eso, propuse de forma interna un diseño y una implementación de Maps Compose, y colaboré con Adam Powell, Leland Richardson y Ben Trengrove para llegar a la meta.

Los comentarios que recibimos marcan la diferencia y generan cambios reales en el producto. ¡Nos encanta conocer tu opinión!

Lecciones aprendidas

Lección n.º 1: Reutiliza las clases en el SDK de Maps básico

El SDK de Maps existe hace más de 10 años y muchas apps lo usan. Mientras que Compose presenta una forma totalmente distinta de compilar IU, una versión que admite composición de mapas aún debería parecer familiar. Si tienes conocimientos sobre Compose y usaste el SDK de Maps en el pasado, los mapas componibles deberían resultarte intuitivos.

Para lograr que la API sea intuitiva, reutilizamos las clases subyacentes del SDK de Maps cuando fue posible. Por ejemplo, para llevar a cabo actualizaciones de la cámara en Maps Compose, puedes seguir empleando la clase CameraUpdate existente creada a partir del objeto CameraUpdateFactory.

No obstante, hubo algunas instancias en las que las clases existentes del SDK de Maps no podían usarse tal como estaban. Por ejemplo, no tenía sentido reutilizar la clase UiSettings, ya que solo se puede recuperar una vez que se creó el mapa. Idealmente, deberías poder crear una instancia de esta clase y pasarla al elemento componible GoogleMap. A modo de solución, se duplicó la clase en un tipo de Maps Compose, MapUiSettings. El nombre se asemeja al de la clase existente UiSettings, con el prefijo “Map” para ayudar con la visibilidad de la API. MapUiSettings tiene iguales propiedades y valores predeterminados que UiSettings. La diferencia es que se puede crear y pasar en el elemento componible GoogleMap, en lugar de obtenerlo y mutarlo desde otra superficie de control:

Hay otras propiedades del mapa que se pueden cambiar durante el tiempo de ejecución (por ejemplo, setBuildingsEnabled(boolean)). Una consideración que tuvimos fue exponer estas propiedades como parámetros individuales en el elemento componible GoogleMap. Sin embargo, eso aumentaba de forma significativa la cantidad de parámetros, ya que hay muchas propiedades que se pueden activar o desactivar. En cambio, elegimos crear una clase separada, MapProperties, que contiene estas propiedades configuradas durante el tiempo de ejecución:

En el caso de los objetos que se pueden dibujar en el mapa (marcadores, polilíneas, etc.), el enfoque imperativo basado en View es llamar a métodos add* como GoogleMap.addMarker(MarkerOptions) en el objeto GoogleMap. Para convertir esto en Compose, el elemento componible GoogleMap podría aceptar un parámetro de lista correspondiente a cada dibujo. No obstante, podría ser difícil usar esta API para integraciones que contengan muchos objetos dibujados con lógica compleja. En cambio, decidimos exponer una API compatible con Compose, una lambda de contenido genérica en la que se pueda invocar a los dibujos como elementos componibles separados.

¿Necesitas dibujar un marcador, una polilínea o algún otro objeto compatible en el mapa? Llama al marcador, a la polilínea o a alguna otra función que admita composición de decorador en la lambda de contenido del elemento GoogleMap componible de esta manera:

Lección n.º 2: Aprovecha las funciones de Kotlin

El SDK de Maps se desarrolló antes de que Kotlin fuera un lenguaje de primera clase destinado a escribir apps para Android. Además, el SDK de Maps se desarrolló sobre todo en Java. Por otro lado, Jetpack Compose se escribió en su totalidad en Kotlin y depende bastante de expresiones idiomáticas de Kotlin. Para Maps Compose, también decidimos acercarnos a funciones del lenguaje de Kotlin, como las corrutinas, para exponer una API idiomática de Kotlin.

Por ejemplo, Compose usa las funciones de suspensión de corrutinas de Kotlin para las API de animación. Por lo tanto, tenía sentido ofrecer una API similar para las API subyacentes basadas en devoluciones de llamada en el SDK de Maps. Por ejemplo, con un permiso de corrutina, se puede animar la cámara y esperar a que se complete.

Consulta la lista de otras expresiones idiomáticas de Kotlin que se usan ampliamente en Compose en Kotlin para Jetpack Compose.

Lección n.º 3: Mantén la coherencia con otras API de kit de herramientas de Compose

Mantener la coherencia con otras API de kit de herramientas de Compose posibilita una buena ergonomía de los desarrolladores. De ese modo, es más sencillo usar las funciones y más rápido desarrollar con ellas, ya que sigue una convención familiar con otras API. Ya sea que desarrolles bibliotecas o apps, esta coherencia es esencial para fomentar la facilidad de uso. Los lineamientos de la API de Compose son un excelente recurso para aprender las convenciones que siguen las API de Compose.

Estos son algunos patrones que se detallan en los lineamientos que adopta Maps Compose:

Hubo algunas instancias en las que mis diseños iniciales diferían de estos lineamientos y me resultó muy útil hacer referencia a ellos para ajustar las decisiones sobre la API a fin de alinearme mejor con las prácticas recomendadas de Compose.

Lección n.º 4: Las clases sin formato son la mejor opción para la compatibilidad con objetos binarios

Las clases de datos de Kotlin son una forma eficiente de contener datos. Ofrecen diferentes métodos generados que no necesitas escribir, lo que te ahorra bastantes líneas de código por clase. Sin embargo, si escribes una biblioteca, las clases de datos tienen un costo oculto, ya que los cambios futuros en ellas rompen la compatibilidad con objetos binarios. Si agregas nuevas propiedades, cambiará la firma de método generado para copy() y, según dónde se haya agregado la nueva propiedad, también podrían romperse las funciones de desestructuración, lo que alejaría a los usuarios. A fin de solucionar el problema, Maps Compose usa clases sin formato para MapUiSettings y MapProperties. Felicito a Jake Wharton por señalar esto en la entrada de blog Desafíos de la API pública en Kotlin.

Lección n.º 5: Usa tipos comunes de Compose

Para personalizar los colores de un objeto dibujado en el SDK de Maps, le proporcionas un valor entero de color. Por ejemplo, para personalizar el color de relleno de un elemento Circle, le proporcionas un valor entero de color cuando construyes el objeto CircleOptions. En cambio, el elemento Circle de Maps Compose usa la clase Color que brinda Compose.

Una de las funciones geniales de Compose es su compatibilidad integrada para aplicar temas de Material en tu app. Entonces, si usas la clase Color que brinda Compose, cuando los elementos componibles de GoogleMap y sus elementos secundarios se usan dentro de un MaterialTheme, los colores se adaptan automáticamente a los colores de tu tema cuando la apariencia del sistema cambia al modo claro o al modo oscuro.

Lección n.º 6: Las subcomposiciones son potentes

En las primeras etapas del desarrollo, descubrimos que agregar y quitar decoraciones de mapas mediante las API de efecto secundario a lo largo del tiempo para que coincidieran con el modelo de datos de la app era tedioso y podía generar errores. La necesidad de administrar un árbol de elementos es, en efecto, el mismo problema que administrar un árbol de IU que admite composición. Por lo tanto, una solución más eficaz sería usar las mismas herramientas subyacentes para actualizar de forma directa los elementos a medida que cambia el estado con el tiempo. Este método resultó ser mucho más claro e intuitivo que utilizar efectos secundarios.

Para lograrlo, usamos la clase Applier y el elemento componible ComposeNode a fin de brindar compatibilidad con la API basada en elementos secundarios (lambda de contenido) que permite agregar objetos dibujados (marcadores, polilíneas, polígonos, etc.) en el mapa. La implementación que obtenemos crea una nueva subcomposición que administra el estado del mapa, en lugar de los nodos de IU de Compose.

Si tomamos un marcador como ejemplo, con la subcomposición podemos garantizar que se actualice el estado del mapa a medida que ocurre la recomposición. Por ejemplo, si un elemento componible Marker estaba en la composición y se quitó después, podemos aprovechar el método de eliminación de nodos apropiado para asegurarnos de que el objeto subyacente Marker del SDK de Maps también se quite del mapa.

Si quieres examinar el código, consulta la implementación de MapApplier y Marker para obtener más información sobre cómo usar estas API.

Conclusión

En general, me impresionó cómo las API disponibles de interoperabilidad de Compose hicieron posible la compatibilidad con el SDK de Maps en Compose. Si bien sería ideal una implementación nativa del SDK de Maps, Maps Compose cierra la brecha para muchos desarrolladores de Maps que usan Compose.

Espero que esta entrada te haya resultado esclarecedora, y que hayas aprendido algo sobre el diseño de API de Compose y cómo lograr que Compose funcione con el código de View existente.

Si recién comienzas a usar Compose o Maps Compose, consulta las apps de ejemplo para obtener más información:

Si hay algún tema que quieras ver en el futuro, deja un comentario más abajo.

Publicado por Rebecca Nathenson, Directora de Administración de Productos

Tal como anunciamos recientemente en I/O, estamos invirtiendo en formas nuevas de que el Asistente de Google sea tu ayuda conversacional de referencia para las tareas diarias. Y no podíamos hacerlo sin una amplia comunidad de desarrolladores. Si bien las Acciones Conversacionales eran una forma excelente de experimentar con la voz, el ecosistema ha evolucionado muchos en los últimos cinco años y hemos recibido importantes comentarios: los usuarios desean interactuar con sus apps favoritas usando la voz y los desarrolladores quieren aprovechar sus inversiones existentes en Android.

Publicado por Rebecca Nathenson, Directora de Administración de Productos

Tal como anunciamos recientemente en I/O, estamos invirtiendo en formas nuevas de que el Asistente de Google sea tu ayuda conversacional de referencia para las tareas diarias. Y no podíamos hacerlo sin una amplia comunidad de desarrolladores. Si bien las Acciones Conversacionales eran una forma excelente de experimentar con la voz, el ecosistema ha evolucionado muchos en los últimos cinco años y hemos recibido importantes comentarios: los usuarios desean interactuar con sus apps favoritas usando la voz y los desarrolladores quieren aprovechar sus inversiones existentes en Android.

En respuesta a esos comentarios, decidimos centrar nuestros esfuerzos en hacer que los desarrolladores usen App Actions con Android para crear experiencias de más profundas y significativas. En consecuencia, discontinuaremos las Acciones Conversacionales dentro de un año a partir de hoy, en junio de 2023.

Mejoramos las experiencias de voz

Si alguien le pide al Asistente comenzar un entrenamiento, ordenar comida o agendar un retiro en el almacén, sabemos que los usuarios están buscando formas de realizar esto de manera más natural usando la voz. Para permitir a los desarrolladores integrar estas útiles experiencias de voz en contenido de Android existente con más facilidad –sin tener que comenzar de cero–, nos comprometemos a trabajar con ellos para crear App Actions con Android. Esto brindará a los usuarios más formas de interactuar con el contenido de una app –como consultas de voz y sugerencias proactivas– y de acceder a las funciones de la app que ya conocen y les gustan.

Continuamos ampliando el alcance de App Actions de las siguientes maneras:

  • Integramos funciones de voz en los dispositivos Android, como dispositivos móviles, automóviles, wearables y otros dispositivos en el hogar.
  • Atraemos más tráfico sin trabajo de desarrollo adicional (por ejemplo el Asistente ahora puede dirigir a los usuarios a apps aun cuando el nombre de la app no figure en el comentario).
  • Dirigimos a los usuarios a la página de Play Store de la app si todavía no la tienen instalada.
  • Mostramos la búsqueda “Todas las apps” para los usuarios de Pixel 6.

Con App Actions no solo puedes encontrar tus apps más fácilmente, también puedes ofrecer experiencias de voz más profundas permitiendo a los usuarios que solo pidan lo que desean en sus consultas. Además, continuaremos invirtiendo en todas las experiencias populares del Asistente que los usuarios aman, como Temporizadores, Contenido multimedia, Automatización del hogar, Comunicaciones y más.

Apoyamos a nuestros desarrolladores

Sabemos que estos cambios no son fáciles y por eso les damos a los desarrolladores un año para prepararse para la baja de las Acciones Conversacionales. Estamos aquí para ayudarte a atravesar esta transición con estos útiles recursos:

Creamos el futuro juntos

Para el futuro, visualizamos una plataforma que sea intuitiva, natural y de voz, que permita a los desarrolladores potenciar todo el ecosistema de dispositivos Android para poder llegar fácilmente a más usuarios. Siempre estamos buscando mejorar la experiencia del Asistente y estamos seguros de que App Actions es la mejor forma de hacerlo. Agradecemos todo lo que los desarrolladores han hecho para crear el ecosistema del Asistente de Google en los últimos cinco años y estamos aquí para ayudarte a transitar los cambios mientras continuamos mejorándolo aún más. Nos emociona lo que viene por delante y estamos agradecidos de poder construirlo juntos.


Publicado por Tom Grinsted, gerente de Producto de Google Play

íconos de notificación

Aquí en Google Play estamos siempre desarrollando formas nuevas de ayudar a los desarrolladores a hacer crecer su negocio, ya sea aumentando las descargas, mejorando la interacción o impulsando la monetización. Así que, si te las perdiste, aquí están las tres mejores formas de hacer crecer tu negocio que anunciamos en Google I/O este año:

Publicado por Tom Grinsted, gerente de Producto de Google Play

íconos de notificación

Aquí en Google Play estamos siempre desarrollando formas nuevas de ayudar a los desarrolladores a hacer crecer su negocio, ya sea aumentando las descargas, mejorando la interacción o impulsando la monetización. Así que, si te las perdiste, aquí están las tres mejores formas de hacer crecer tu negocio que anunciamos en Google I/O este año:

N.º 1: Directorios de tiendas de clientes mejorados

Se implementó una actualización importante en los directorios de tiendas de clientes, que ahora te permiten dar una primera impresión estupenda mostrando el mensaje correcto a cada persona.

Puedes generar vínculos directos únicos a los directorios de tus clientes para poder mostrar distintos directorios a los usuarios según el canal o sitio del que vengan. Y como Play Console ofrece análisis para cada uno de tus directorios de clientes, puedes ver cuán eficaz es cada variación y optimizarlas en el tiempo.

Todos los desarrolladores pueden crear hasta 50 directorios de tiendas de clientes, de modo que puedes crear relatos personalizados para los usuarios como nunca antes. Tienes hasta cinco experimentos por directorio, ¡así que las oportunidades de optimización son ilimitadas!

Se implementó una actualización importante en los directorios de tiendas de clientes, que ahora te ofrecen nuevas formas de mejorar tu tasa de conversión.

Se implementó una actualización importante en los directorios de tiendas de clientes, que ahora te ofrecen nuevas formas de mejorar tu tasa de conversión.


N.º 2: Abrir LiveOps beta

LiveOps son unidades de comercialización de autoservicio en Play Store que promocionan eventos por tiempo limitado, ofertas y actualizaciones importantes para tu juego o app. Los desarrolladores de nuestra versión beta pueden enviar contenido para ayudar a aumentar las instalaciones, mejorar la interacción y generar ventas.

Además, ahora pueden usar vínculos directos para dirigir a los usuarios directamente a la parte más relevante del juego o la app y luego medir el éxito con el nuevo panel de informes de LiveOps en Play Console. Estos informes brindan una vista detallada de las métricas de rendimiento de cada evento, y muestran los datos a lo largo del tiempo y por resultado, así se trate de adquisiciones, aperturas o actualizaciones.

Obtén más información sobre LiveOps y expresa tu interés en nuestro programa beta aquí.

Los desarrolladores de nuestra versión beta de LiveOps pueden enviar contenido para destacar en Google Play Store.

N.º 3: Nuevas herramientas flexibles para aumentar tus suscripciones

A medida que los modelos de negocio de suscripciones evolucionan, muchos desarrolladores nos solicitaron mayor flexibilidad y menor complejidad para vender las suscripciones. En una actualización importante, lanzamos capacidades de suscripción nuevas, de modo que podrás configurar varios planes básicos y ofertas para cada suscripción. Obtén suscriptores nuevos, fomenta las actualizaciones y retén suscriptores actuales. Para ello, crea varias ofertas para diferentes etapas del ciclo de vida de la suscripción, mientras reduces significativamente el costo y la complejidad de administrar un número de SKU en constante aumento.

Para cada suscripción, ahora puedes configurar varios planes básicos y ofertas, sin necesidad de administrar un número de SKU en constante aumento.

Además, ahora puedes ofrecer planes prepagos que brinden a los usuarios acceso por un tiempo determinado, una excelente opción en regiones donde el pago por uso es la práctica estándar o para los usuarios que no están en condiciones de comprometerse con un plan de renovación automática. Antes de que el plan venza, los usuarios pueden extender fácilmente el período de acceso con una recarga en tu app o desde la pantalla de suscripción de Play Store.

Estos fueron solo tres lanzamientos de una amplia serie de actualizaciones geniales que te ayudarán a crecer y prosperar con Play. ¿Quieres ver más? Ponte al día con la playlist completa de Google I/O en Google Play.

Nuestro objetivo es agilizar y facilitar tanto como sea posible el desarrollo de apps bonitas y atractivas para Android. Queremos encargarnos de las partes complejas de la compilación de apps para que puedas concentrarte en las funciones de tu app y en ofrecer a los usuarios experiencias de alta calidad.


A este enfoque lo llamamos desarrollo moderno de Android (o MAD, por sus siglas en inglés) y lo ofrecemos a través de un paquete de herramientas, bibliotecas y guías. En Google I/O, anunciamos una serie de actualizaciones e incorporaciones para nuestras ofertas de MAD. Aquí presentamos un resumen de los tres anuncios principales.





N.º 1: Compose 1.2 beta


Jetpack Compose 1.2 llega a su primera versión beta, lo cual significa que la API es estable. Continuamos compilando nuestro mapa de ruta y te proporcionamos las API que necesitas para admitir casos de uso más avanzados, como fuentes descargables, LazyGrids, inserciones de ventanas, interoperabilidad con desplazamiento anidado, y más compatibilidad con herramientas con funciones como LiveEdit, recuentos de recomposición en el Inspector de diseños y vista previa de animaciones. Obtén más información sobre cómo desarrolladores como Airbnb están mejorando su productividad con Jetpack Compose y mira las novedades de Compose


N.° 2: perfiles de referencia


Los perfiles de referencia te permiten incorporar un perfil para guiar el tiempo de ejecución de Android sobre el cual las rutas de código se deberían precompilar, en lugar de interpretar. De esta manera, el impacto en los recorridos críticos de los usuarios, como el inicio de las apps, puede ser muy importante. Esto es especialmente significativo cuando se utilizan bibliotecas no agrupadas, como Jetpack Compose, que no obtienen los beneficios de las optimizaciones del código de la plataforma.


Muchas bibliotecas de Jetpack (incluida Jetpack Compose) ya incluyen perfiles de referencia, pero puedes aprender a agregarlos a tus propias apps y bibliotecas para potenciar su rendimiento. Observamos que el tiempo de inicio de las apps es hasta 40% más rápido gracias a la incorporación de perfiles de referencia, sin que se necesiten otros cambios en el código.


N.° 3: LiveEdit


Con LiveEdit, puedes editar elementos componibles y ver esos cambios en tiempo real, en la vista previa de Compose o en dispositivos físicos o emuladores, lo que permite una rápida iteración. LiveEdit es una función experimental opcional de Android Studio Electric Eel y tiene una serie de limitaciones. Pruébala y envíanos tus comentarios.



Estos fueron los tres principales anuncios sobre el desarrollo moderno de Android que se presentaron en Google I/O. Para obtener más información, consulta la playlist completa de charlas y talleres.


Nuestro objetivo es agilizar y facilitar tanto como sea posible el desarrollo de apps bonitas y atractivas para Android. Queremos encargarnos de las partes complejas de la compilación de apps para que puedas concentrarte en las funciones de tu app y en ofrecer a los usuarios experiencias de alta calidad.


A este enfoque lo llamamos desarrollo moderno de Android (o MAD, por sus siglas en inglés) y lo ofrecemos a través de un paquete de herramientas, bibliotecas y guías. En Google I/O, anunciamos una serie de actualizaciones e incorporaciones para nuestras ofertas de MAD. Aquí presentamos un resumen de los tres anuncios principales.





N.º 1: Compose 1.2 beta


Jetpack Compose 1.2 llega a su primera versión beta, lo cual significa que la API es estable. Continuamos compilando nuestro mapa de ruta y te proporcionamos las API que necesitas para admitir casos de uso más avanzados, como fuentes descargables, LazyGrids, inserciones de ventanas, interoperabilidad con desplazamiento anidado, y más compatibilidad con herramientas con funciones como LiveEdit, recuentos de recomposición en el Inspector de diseños y vista previa de animaciones. Obtén más información sobre cómo desarrolladores como Airbnb están mejorando su productividad con Jetpack Compose y mira las novedades de Compose


N.° 2: perfiles de referencia


Los perfiles de referencia te permiten incorporar un perfil para guiar el tiempo de ejecución de Android sobre el cual las rutas de código se deberían precompilar, en lugar de interpretar. De esta manera, el impacto en los recorridos críticos de los usuarios, como el inicio de las apps, puede ser muy importante. Esto es especialmente significativo cuando se utilizan bibliotecas no agrupadas, como Jetpack Compose, que no obtienen los beneficios de las optimizaciones del código de la plataforma.


Muchas bibliotecas de Jetpack (incluida Jetpack Compose) ya incluyen perfiles de referencia, pero puedes aprender a agregarlos a tus propias apps y bibliotecas para potenciar su rendimiento. Observamos que el tiempo de inicio de las apps es hasta 40% más rápido gracias a la incorporación de perfiles de referencia, sin que se necesiten otros cambios en el código.


N.° 3: LiveEdit


Con LiveEdit, puedes editar elementos componibles y ver esos cambios en tiempo real, en la vista previa de Compose o en dispositivos físicos o emuladores, lo que permite una rápida iteración. LiveEdit es una función experimental opcional de Android Studio Electric Eel y tiene una serie de limitaciones. Pruébala y envíanos tus comentarios.



Estos fueron los tres principales anuncios sobre el desarrollo moderno de Android que se presentaron en Google I/O. Para obtener más información, consulta la playlist completa de charlas y talleres.



Sumérgete en nuestra última versión, que incluye macOS y Linux estable, mejoras de rendimiento y mucho más.


Nuevamente, es hora de disfrutar de una versión estable de Flutter ¡y nos enorgullece enormemente anunciar el lanzamiento de Flutter 3! Hace solo tres meses, anunciamos la compatibilidad de Flutter con Windows. ¡Hoy, nos complace anunciar que Flutter ahora es estable para macOS y Linux, además de Windows!


Gracias al arduo trabajo de nuestros colaboradores de Flutter, combinamos 5248 solicitudes de extracción.


Tenemos varias cosas emocionantes que anunciar como parte de esta versión, incluida la actualización de la compatibilidad de Flutter con macOS y Linux, mejoras significativas en el rendimiento, actualizaciones para dispositivos móviles y la Web, ¡y mucho más! Además, tenemos noticias sobre la reducción de la compatibilidad con versiones anteriores de Windows y una breve lista de cambios rotundos. Así que, ¡pongámonos a trabajar!

Listo para la producción en todas las plataformas de escritorio

Menús en cascada y compatibilidad con la barra de menú del sistema macOS

Las barras de menú renderizadas por la plataforma ahora se pueden compilar en macOS usando el widget PlatformMenuBar, que admite la inserción de menús exclusivos de la plataforma y controla lo que aparece en los menús de la app para macOS.

Compatibilidad completa para la entrada de texto internacional en todas las plataformas de escritorio

La entrada de texto internacional, incluidos los idiomas que utilizan editores de métodos de entrada de texto (IME), como chino, japonés y coreano, es completamente compatible con las tres plataformas de escritorio, incluidos los métodos de entrada de terceros, como Sogou y Google Japanese Input.

Accesibilidad en todas las plataformas de escritorio

Flutter para Windows, macOS y Linux es compatible con servicios de accesibilidad, como lectores de pantalla, navegación accesible y colores invertidos.

Binarios universales de forma predeterminada en macOS

A partir del lanzamiento de Flutter 3, las apps de escritorio de Flutter para macOS se compilan como archivos binarios universales, con compatibilidad nativa tanto con las Mac basadas en Intel existentes como con los últimos dispositivos Apple Silicon de Apple.

Obsolescencia de Windows 7 y 8 para el desarrollo

Con esta versión, elevamos la versión de Windows recomendada para el desarrollo a Windows 10. Aunque no bloquearemos el desarrollo en versiones anteriores (Windows 7, Windows 8, Windows 8.1), estas versiones ya no son compatibles con Microsoft y brindamos pruebas limitadas en ellas. Si bien continuaremos ofreciendo compatibilidad de “mejor esfuerzo” para versiones anteriores, te alentamos a que te actualices. 


Nota: Seguimos ofreciendo compatibilidad para las apps de Flutter que se ejecutan en Windows 7, por lo que este cambio solo afecta al entorno de desarrollo recomendado.

Actualizaciones para dispositivos móviles

Compatibilidad con dispositivos plegables

La versión de Flutter 3 es compatible con los dispositivos móviles plegables. En una colaboración liderada por Microsoft, las nuevas funciones y widgets te permiten compilar experiencias dinámicas y agradables en dispositivos plegables.


Como parte de este trabajo, MediaQuery ahora contiene una lista de DisplayFeatures, que describe los límites y estados de los elementos del dispositivo, como bisagras, pliegues y cortes. Además, el widget DisplayFeatureSubScreen ahora posiciona su widget secundario sin superponer los límites de DisplayFeatures y ya se integró con los diálogos predeterminados y ventanas emergentes del marco de trabajo, lo que hace que Flutter sea consciente y responda a estos elementos desde el principio.



¡Muchas gracias al equipo de Microsoft y especialmente a @andreidiaconu por sus contribuciones! 


Prueba las muestras del emulador de Surface Duo, incluida una con una bifurcación especial de la galería de Flutter, para ver las pantallas duales de Flutter en acción.

Compatibilidad con la frecuencia de actualización variable de iOS

Flutter ahora es compatible con la frecuencia de actualización en dispositivos iOS con pantallas ProMotion, incluidos iPhone 13 Pro y iPad Pro. En estos dispositivos, las apps de Flutter pueden renderizar a frecuencias de actualización que alcanzan los 120 Hz, mientras que antes estaban limitadas a 60 Hz. Así, se obtiene una experiencia más fluida durante animaciones rápidas, como el desplazamiento. Consulta flutter.dev/go/variable-refresh-rate para obtener más información.

Versiones simplificadas para iOS

Agregamos nuevas opciones al comando flutter build ipa para simplificar el lanzamiento de tu app para iOS.  Cuando tengas todo listo para distribuir tu app a TestFlight o a la tienda de apps, ejecuta flutter build ipa para compilar un archivo Xcode (archivo .xcarchive) y un paquete de apps (archivo .ipa).  Como alternativa, puedes agregar --export-method ad-hoc, --export-method development o --export-method enterprise.  Una vez que se compila el paquete de apps, cárgalo en Apple a través de la app de macOS Apple Transport o en la línea de comandos con xcrun altool (ejecuta man altool para obtener más instrucciones de autenticación de la clave de API de App Store Connect). Después de la carga, tu app está disponible para lanzarla a TestFlight o la tienda de apps. Luego de ajustar la configuración inicial del proyecto Xcode, como el nombre visible y el ícono de la app, ya no necesitas abrir Xcode para lanzar tu app.

Actualización de la versión de Gradle

Si compilas un nuevo proyecto con la herramienta Flutter, probablemente notarás que los archivos generados ahora usan las últimas versiones de los complementos de Gradle y de Gradle para Android. Para los proyectos existentes, debes transmitir manualmente las versiones a 7.4 para Gradle y 7.1.2 para el complemento de Gradle para Android.

Fin de la compatibilidad con iOS de 32 bits, iOS 9 e iOS 10

Como anunciamos en febrero de 2022 con la versión estable 2.10, la compatibilidad de Flutter para dispositivos iOS de 32 bits y las versiones 9 y 10 de iOS está llegando a su fin. Este cambio afecta a los dispositivos iPhone 4S, iPhone 5, iPhone 5C y iPad de segunda, tercera y cuarta generación. Flutter 3 es la última versión estable compatible con estas versiones y dispositivos de iOS.


Para obtener más información sobre este cambio, consulta RFC: fin de la compatibilidad para dispositivos iOS de 32 bits.

Actualizaciones para la Web

Decodificación de imágenes

La versión web de Flutter ahora detecta y usa automáticamente la API ImageDecoder en los navegadores compatibles. A partir de hoy, la mayoría de los navegadores basados en Chromium (Chrome, Edge, Opera, Samsung Browser y muchos más) cuentan con esta API.


La nueva API decodifica imágenes de forma asíncrona fuera del subproceso principal utilizando los códecs de imágenes integrados del navegador. Así, se duplica la velocidad de decodificación de imágenes, nunca se bloquea el subproceso principal y se eliminan todos los bloqueos que antes causaban las imágenes.


Ciclos de vida de la app web

La nueva API de ciclo de vida para las apps web de Flutter te brinda la flexibilidad de controlar el proceso de arranque de tu app de Flutter desde la página HTML de alojamiento y le permite a Lighthouse analizar el rendimiento de tu app. Esto se aplica a muchos casos de uso, incluidos los siguientes escenarios solicitados con frecuencia:


  • Una pantalla de presentación.

  • Un indicador de carga.

  • Una página de destino interactiva HTML simple que se muestra antes de la app de Flutter.

Actualizaciones de herramientas

Paquete de lint actualizado 

Se lanzó la versión 2.0 de los paquetes de lint:

https://pub.dev/packages/flutter_lints/versions/2.0.0 

https://pub.dev/packages/lints/versions/2.0.0


Las apps generadas en Flutter 3 con flutter create habilitan automáticamente los conjuntos de lint versión 2.0. Se recomienda migrar las apps, los paquetes y los complementos existentes a la versión 2.0 para seguir las prácticas recomendadas más recientes en el mundo de Flutter. Para ello, debes ejecutar flutter pub upgrade --major-versions flutter_lints. 


La mayoría de las advertencias de lint recién agregadas en la versión 2 incluyen correcciones automáticas. De esta manera, después de actualizar a la última versión del paquete en el pubspec.yaml de tu app, puedes ejecutar dart fix --apply sobre tu base de código para corregir la mayoría de las advertencias de lint automáticamente (algunas advertencias aún requieren un trabajo manual). Apps, paquetes o complementos que no usan package:flutter_lints aún se recomienda realizar la migración siguiendo la guía de migración para aprovechar las prácticas recomendadas más recientes.

Mejoras de rendimiento

Gracias al colaborador de código abierto knopp, se habilitó la repetición de dibujo parcial en los dispositivos Android compatibles. En nuestras pruebas locales, este cambio redujo 5 veces los tiempos de rasterización de fotogramas promedio un 90% y 99% en la comparativa backdrop_filter_perf en un dispositivo Pixel 4 XL. La repetición de dibujo parcial cuando hay una sola región no sincronizada rectangular ahora está habilitada en los dispositivos iOS y en los dispositivos Android más nuevos.


Mejoramos aún más el rendimiento de las animaciones de opacidad en casos simples. En concreto, cuando un widget `Opacity` contiene solo una primitiva de renderización, se omite el método `saveLayer` que normalmente invoca el widget `Opacity`. En una comparativa realizada para medir los beneficios de esta optimización, el tiempo de rasterización para este caso mejoró en un orden de magnitud. En versiones futuras, planeamos aplicar esta optimización a incluso más escenarios. 


Gracias al trabajo del colaborador de código abierto JsouLiang, los subprocesos de IU y la trama del motor ahora se ejecutan con mayor prioridad en Android e iOS que en otros subprocesos. Por ejemplo, subprocesos de recolección de elementos no utilizados en segundo plano de Dart VM. En nuestras comparativas, esto resultó en un tiempo de compilación de fotograma promedio ~ 20% más rápido.


Antes de la versión 3, la política de admisión para el caché de trama solo tenía en cuenta la cantidad de operaciones de dibujo en una imagen y asumía que cualquiera con más de unas pocas operaciones sería un buen candidato para el almacenamiento en caché. Lamentablemente, esto hizo que el motor gastara memoria para almacenar en caché imágenes que en realidad se podían renderizar muy rápido. Esta versión presenta un mecanismo que estima la complejidad de renderización de las imágenes en función del costo de las operaciones de dibujo que contiene. Su uso como política de admisión de caché de trama redujo el uso de memoria sin disminuir el rendimiento en nuestras comparativas.


Le agradecemos al colaborador de código abierto ColdPaleLight, quien solucionó un error en la programación del fotograma que causaba que disminuyera levemente la cantidad de fotogramas de animación en iOS. Gracias a todas las personas que informaron este problema y brindaron reproducciones y videos de los fotogramas disminuidos.

Impeller

El equipo trabajó arduamente para encontrar una solución al bloqueo de inicio temprano en iOS y otras plataformas. En la versión Flutter 3, puedes obtener una vista previa de un backend de renderización experimental denominado Impeller en iOS. Impeller compila previamente un conjunto de sombreadores más pequeño y simple en el tiempo de compilación del motor para que no se compilen mientras se ejecuta una app. Esta fue una fuente importante de bloqueo en Flutter. Impeller no está listo para la producción y aún falta mucho para terminarlo. No todas las funciones de Flutter están implementadas todavía, pero estamos muy satisfechos con la fidelidad y el rendimiento en la app de Flutter o Galería como para compartir nuestro progreso. En particular, el peor fotograma en la animación de transición de la app de Galería es aproximadamente 20 veces más rápido.


Impeller está disponible bajo una función experimental en iOS. Puedes pasar la función experimental `--enable-impeller` a `flutter run`, o establecer la función experimental `FLTEnableImpeller` en tu archivo `Info.plist` a `true`, para probar Impeller. El desarrollo de Impeller continúa en el canal principal de Flutter y esperamos brindar más actualizaciones en las próximas versiones.

Anuncios integrados en Android

Cuando utilices el paquete google-mobile-ads, deberías observar un mejor rendimiento en las interacciones críticas del usuario, como el desplazamiento y las transiciones entre páginas. Esto es más notable en los dispositivos populares en los mercados emergentes. ¡Lo mejor de todo es que no se requieren cambios de código!

A nivel profundo, Flutter ahora compone vistas de Android, comúnmente conocidas como vistas de plataforma, de forma asíncrona. Esto significa que el subproceso de trama de Flutter no necesita esperar a que se renderice la vista de Android. En cambio, el motor de Flutter coloca la vista en la pantalla con una textura OpenGL que administra.

Más actualizaciones emocionantes

Material 3

Flutter 3 es compatible con Material Design 3, la siguiente generación de Material Design. Flutter 3 brinda compatibilidad opcional con Material 3. Se incluyen funciones de Material You como color dinámico, un sistema de color y tipografía actualizados, actualizaciones de muchos componentes y nuevos efectos visuales introducidos en Android 12 como un nuevo diseño de ondulación táctil y un efecto de desplazamiento de extensión. Prueba las funciones de Material 3 en el nuevo codelab Convierte a tu aburrida app de Flutter en una app increíble. Consulta los documentos de API para obtener más detalles sobre cómo optar por estas nuevas funciones y qué componentes son compatibles con Material 3. Sigue el trabajo continuo con el problema principal de Material 3.

Extensiones de tema

Flutter ahora permite agregar cualquier cosa a ThemeData de la biblioteca de Material, con un concepto llamado “Extensiones de tema”. En lugar de extender (en cuanto a Dart) ThemeData y volver a implementar copyWith, lerp y otros métodos, puedes especificar ThemeData.extensions. Además, como desarrollador de paquetes, puedes proporcionar ThemeExtensions. Consulta flutter.dev/go/theme-extensions para obtener más información y mira este ejemplo en GitHub.

Anuncios

Sabemos que es importante que los publicadores soliciten el consentimiento para anuncios personalizados y controlen los requisitos de App Tracking Transparency (ATT) de Apple.


Para ofrecer compatibilidad con estos requisitos, desde Google se ofrece el SDK de User Messaging Platform (UMP), que reemplaza al anterior SDK de código abierto Consent SDK. En la próxima versión del SDK de GMA para Flutter, agregaremos compatibilidad con el SDK de UMP para permitir que los publicadores obtengan el consentimiento del usuario. Para obtener más información, consulta la página de google_mobile_ads en pub.dev.


Cambios rotundos

Mientras continuamos con el crecimiento y la mejora de Flutter, nuestro objetivo es mantener al mínimo los cambios rotundos.  Con la versión de Flutter 3, tendremos los siguientes cambios rotundos:

Si usas cualquiera de estas API, lee la guía de migración en Flutter.dev.

Resumen

Desde el equipo de Flutter en Google, agradecemos el trabajo increíble que realizó la comunidad para ayudar a que Flutter mantenga su estado como el conjunto de herramientas de IU multiplataforma más popular, según lo medido por analistas como Statista y SlashData. Esperamos colaborar con la comunidad para continuar brindando una herramienta impulsada por la comunidad que ayude a crear una experiencia agradable tanto para los desarrolladores como para los usuarios.



Sumérgete en nuestra última versión, que incluye macOS y Linux estable, mejoras de rendimiento y mucho más.


Nuevamente, es hora de disfrutar de una versión estable de Flutter ¡y nos enorgullece enormemente anunciar el lanzamiento de Flutter 3! Hace solo tres meses, anunciamos la compatibilidad de Flutter con Windows. ¡Hoy, nos complace anunciar que Flutter ahora es estable para macOS y Linux, además de Windows!


Gracias al arduo trabajo de nuestros colaboradores de Flutter, combinamos 5248 solicitudes de extracción.


Tenemos varias cosas emocionantes que anunciar como parte de esta versión, incluida la actualización de la compatibilidad de Flutter con macOS y Linux, mejoras significativas en el rendimiento, actualizaciones para dispositivos móviles y la Web, ¡y mucho más! Además, tenemos noticias sobre la reducción de la compatibilidad con versiones anteriores de Windows y una breve lista de cambios rotundos. Así que, ¡pongámonos a trabajar!

Listo para la producción en todas las plataformas de escritorio

Menús en cascada y compatibilidad con la barra de menú del sistema macOS

Las barras de menú renderizadas por la plataforma ahora se pueden compilar en macOS usando el widget PlatformMenuBar, que admite la inserción de menús exclusivos de la plataforma y controla lo que aparece en los menús de la app para macOS.

Compatibilidad completa para la entrada de texto internacional en todas las plataformas de escritorio

La entrada de texto internacional, incluidos los idiomas que utilizan editores de métodos de entrada de texto (IME), como chino, japonés y coreano, es completamente compatible con las tres plataformas de escritorio, incluidos los métodos de entrada de terceros, como Sogou y Google Japanese Input.

Accesibilidad en todas las plataformas de escritorio

Flutter para Windows, macOS y Linux es compatible con servicios de accesibilidad, como lectores de pantalla, navegación accesible y colores invertidos.

Binarios universales de forma predeterminada en macOS

A partir del lanzamiento de Flutter 3, las apps de escritorio de Flutter para macOS se compilan como archivos binarios universales, con compatibilidad nativa tanto con las Mac basadas en Intel existentes como con los últimos dispositivos Apple Silicon de Apple.

Obsolescencia de Windows 7 y 8 para el desarrollo

Con esta versión, elevamos la versión de Windows recomendada para el desarrollo a Windows 10. Aunque no bloquearemos el desarrollo en versiones anteriores (Windows 7, Windows 8, Windows 8.1), estas versiones ya no son compatibles con Microsoft y brindamos pruebas limitadas en ellas. Si bien continuaremos ofreciendo compatibilidad de “mejor esfuerzo” para versiones anteriores, te alentamos a que te actualices. 


Nota: Seguimos ofreciendo compatibilidad para las apps de Flutter que se ejecutan en Windows 7, por lo que este cambio solo afecta al entorno de desarrollo recomendado.

Actualizaciones para dispositivos móviles

Compatibilidad con dispositivos plegables

La versión de Flutter 3 es compatible con los dispositivos móviles plegables. En una colaboración liderada por Microsoft, las nuevas funciones y widgets te permiten compilar experiencias dinámicas y agradables en dispositivos plegables.


Como parte de este trabajo, MediaQuery ahora contiene una lista de DisplayFeatures, que describe los límites y estados de los elementos del dispositivo, como bisagras, pliegues y cortes. Además, el widget DisplayFeatureSubScreen ahora posiciona su widget secundario sin superponer los límites de DisplayFeatures y ya se integró con los diálogos predeterminados y ventanas emergentes del marco de trabajo, lo que hace que Flutter sea consciente y responda a estos elementos desde el principio.



¡Muchas gracias al equipo de Microsoft y especialmente a @andreidiaconu por sus contribuciones! 


Prueba las muestras del emulador de Surface Duo, incluida una con una bifurcación especial de la galería de Flutter, para ver las pantallas duales de Flutter en acción.

Compatibilidad con la frecuencia de actualización variable de iOS

Flutter ahora es compatible con la frecuencia de actualización en dispositivos iOS con pantallas ProMotion, incluidos iPhone 13 Pro y iPad Pro. En estos dispositivos, las apps de Flutter pueden renderizar a frecuencias de actualización que alcanzan los 120 Hz, mientras que antes estaban limitadas a 60 Hz. Así, se obtiene una experiencia más fluida durante animaciones rápidas, como el desplazamiento. Consulta flutter.dev/go/variable-refresh-rate para obtener más información.

Versiones simplificadas para iOS

Agregamos nuevas opciones al comando flutter build ipa para simplificar el lanzamiento de tu app para iOS.  Cuando tengas todo listo para distribuir tu app a TestFlight o a la tienda de apps, ejecuta flutter build ipa para compilar un archivo Xcode (archivo .xcarchive) y un paquete de apps (archivo .ipa).  Como alternativa, puedes agregar --export-method ad-hoc, --export-method development o --export-method enterprise.  Una vez que se compila el paquete de apps, cárgalo en Apple a través de la app de macOS Apple Transport o en la línea de comandos con xcrun altool (ejecuta man altool para obtener más instrucciones de autenticación de la clave de API de App Store Connect). Después de la carga, tu app está disponible para lanzarla a TestFlight o la tienda de apps. Luego de ajustar la configuración inicial del proyecto Xcode, como el nombre visible y el ícono de la app, ya no necesitas abrir Xcode para lanzar tu app.

Actualización de la versión de Gradle

Si compilas un nuevo proyecto con la herramienta Flutter, probablemente notarás que los archivos generados ahora usan las últimas versiones de los complementos de Gradle y de Gradle para Android. Para los proyectos existentes, debes transmitir manualmente las versiones a 7.4 para Gradle y 7.1.2 para el complemento de Gradle para Android.

Fin de la compatibilidad con iOS de 32 bits, iOS 9 e iOS 10

Como anunciamos en febrero de 2022 con la versión estable 2.10, la compatibilidad de Flutter para dispositivos iOS de 32 bits y las versiones 9 y 10 de iOS está llegando a su fin. Este cambio afecta a los dispositivos iPhone 4S, iPhone 5, iPhone 5C y iPad de segunda, tercera y cuarta generación. Flutter 3 es la última versión estable compatible con estas versiones y dispositivos de iOS.


Para obtener más información sobre este cambio, consulta RFC: fin de la compatibilidad para dispositivos iOS de 32 bits.

Actualizaciones para la Web

Decodificación de imágenes

La versión web de Flutter ahora detecta y usa automáticamente la API ImageDecoder en los navegadores compatibles. A partir de hoy, la mayoría de los navegadores basados en Chromium (Chrome, Edge, Opera, Samsung Browser y muchos más) cuentan con esta API.


La nueva API decodifica imágenes de forma asíncrona fuera del subproceso principal utilizando los códecs de imágenes integrados del navegador. Así, se duplica la velocidad de decodificación de imágenes, nunca se bloquea el subproceso principal y se eliminan todos los bloqueos que antes causaban las imágenes.


Ciclos de vida de la app web

La nueva API de ciclo de vida para las apps web de Flutter te brinda la flexibilidad de controlar el proceso de arranque de tu app de Flutter desde la página HTML de alojamiento y le permite a Lighthouse analizar el rendimiento de tu app. Esto se aplica a muchos casos de uso, incluidos los siguientes escenarios solicitados con frecuencia:


  • Una pantalla de presentación.

  • Un indicador de carga.

  • Una página de destino interactiva HTML simple que se muestra antes de la app de Flutter.

Actualizaciones de herramientas

Paquete de lint actualizado 

Se lanzó la versión 2.0 de los paquetes de lint:

https://pub.dev/packages/flutter_lints/versions/2.0.0 

https://pub.dev/packages/lints/versions/2.0.0


Las apps generadas en Flutter 3 con flutter create habilitan automáticamente los conjuntos de lint versión 2.0. Se recomienda migrar las apps, los paquetes y los complementos existentes a la versión 2.0 para seguir las prácticas recomendadas más recientes en el mundo de Flutter. Para ello, debes ejecutar flutter pub upgrade --major-versions flutter_lints. 


La mayoría de las advertencias de lint recién agregadas en la versión 2 incluyen correcciones automáticas. De esta manera, después de actualizar a la última versión del paquete en el pubspec.yaml de tu app, puedes ejecutar dart fix --apply sobre tu base de código para corregir la mayoría de las advertencias de lint automáticamente (algunas advertencias aún requieren un trabajo manual). Apps, paquetes o complementos que no usan package:flutter_lints aún se recomienda realizar la migración siguiendo la guía de migración para aprovechar las prácticas recomendadas más recientes.

Mejoras de rendimiento

Gracias al colaborador de código abierto knopp, se habilitó la repetición de dibujo parcial en los dispositivos Android compatibles. En nuestras pruebas locales, este cambio redujo 5 veces los tiempos de rasterización de fotogramas promedio un 90% y 99% en la comparativa backdrop_filter_perf en un dispositivo Pixel 4 XL. La repetición de dibujo parcial cuando hay una sola región no sincronizada rectangular ahora está habilitada en los dispositivos iOS y en los dispositivos Android más nuevos.


Mejoramos aún más el rendimiento de las animaciones de opacidad en casos simples. En concreto, cuando un widget `Opacity` contiene solo una primitiva de renderización, se omite el método `saveLayer` que normalmente invoca el widget `Opacity`. En una comparativa realizada para medir los beneficios de esta optimización, el tiempo de rasterización para este caso mejoró en un orden de magnitud. En versiones futuras, planeamos aplicar esta optimización a incluso más escenarios. 


Gracias al trabajo del colaborador de código abierto JsouLiang, los subprocesos de IU y la trama del motor ahora se ejecutan con mayor prioridad en Android e iOS que en otros subprocesos. Por ejemplo, subprocesos de recolección de elementos no utilizados en segundo plano de Dart VM. En nuestras comparativas, esto resultó en un tiempo de compilación de fotograma promedio ~ 20% más rápido.


Antes de la versión 3, la política de admisión para el caché de trama solo tenía en cuenta la cantidad de operaciones de dibujo en una imagen y asumía que cualquiera con más de unas pocas operaciones sería un buen candidato para el almacenamiento en caché. Lamentablemente, esto hizo que el motor gastara memoria para almacenar en caché imágenes que en realidad se podían renderizar muy rápido. Esta versión presenta un mecanismo que estima la complejidad de renderización de las imágenes en función del costo de las operaciones de dibujo que contiene. Su uso como política de admisión de caché de trama redujo el uso de memoria sin disminuir el rendimiento en nuestras comparativas.


Le agradecemos al colaborador de código abierto ColdPaleLight, quien solucionó un error en la programación del fotograma que causaba que disminuyera levemente la cantidad de fotogramas de animación en iOS. Gracias a todas las personas que informaron este problema y brindaron reproducciones y videos de los fotogramas disminuidos.

Impeller

El equipo trabajó arduamente para encontrar una solución al bloqueo de inicio temprano en iOS y otras plataformas. En la versión Flutter 3, puedes obtener una vista previa de un backend de renderización experimental denominado Impeller en iOS. Impeller compila previamente un conjunto de sombreadores más pequeño y simple en el tiempo de compilación del motor para que no se compilen mientras se ejecuta una app. Esta fue una fuente importante de bloqueo en Flutter. Impeller no está listo para la producción y aún falta mucho para terminarlo. No todas las funciones de Flutter están implementadas todavía, pero estamos muy satisfechos con la fidelidad y el rendimiento en la app de Flutter o Galería como para compartir nuestro progreso. En particular, el peor fotograma en la animación de transición de la app de Galería es aproximadamente 20 veces más rápido.


Impeller está disponible bajo una función experimental en iOS. Puedes pasar la función experimental `--enable-impeller` a `flutter run`, o establecer la función experimental `FLTEnableImpeller` en tu archivo `Info.plist` a `true`, para probar Impeller. El desarrollo de Impeller continúa en el canal principal de Flutter y esperamos brindar más actualizaciones en las próximas versiones.

Anuncios integrados en Android

Cuando utilices el paquete google-mobile-ads, deberías observar un mejor rendimiento en las interacciones críticas del usuario, como el desplazamiento y las transiciones entre páginas. Esto es más notable en los dispositivos populares en los mercados emergentes. ¡Lo mejor de todo es que no se requieren cambios de código!

A nivel profundo, Flutter ahora compone vistas de Android, comúnmente conocidas como vistas de plataforma, de forma asíncrona. Esto significa que el subproceso de trama de Flutter no necesita esperar a que se renderice la vista de Android. En cambio, el motor de Flutter coloca la vista en la pantalla con una textura OpenGL que administra.

Más actualizaciones emocionantes

Material 3

Flutter 3 es compatible con Material Design 3, la siguiente generación de Material Design. Flutter 3 brinda compatibilidad opcional con Material 3. Se incluyen funciones de Material You como color dinámico, un sistema de color y tipografía actualizados, actualizaciones de muchos componentes y nuevos efectos visuales introducidos en Android 12 como un nuevo diseño de ondulación táctil y un efecto de desplazamiento de extensión. Prueba las funciones de Material 3 en el nuevo codelab Convierte a tu aburrida app de Flutter en una app increíble. Consulta los documentos de API para obtener más detalles sobre cómo optar por estas nuevas funciones y qué componentes son compatibles con Material 3. Sigue el trabajo continuo con el problema principal de Material 3.

Extensiones de tema

Flutter ahora permite agregar cualquier cosa a ThemeData de la biblioteca de Material, con un concepto llamado “Extensiones de tema”. En lugar de extender (en cuanto a Dart) ThemeData y volver a implementar copyWith, lerp y otros métodos, puedes especificar ThemeData.extensions. Además, como desarrollador de paquetes, puedes proporcionar ThemeExtensions. Consulta flutter.dev/go/theme-extensions para obtener más información y mira este ejemplo en GitHub.

Anuncios

Sabemos que es importante que los publicadores soliciten el consentimiento para anuncios personalizados y controlen los requisitos de App Tracking Transparency (ATT) de Apple.


Para ofrecer compatibilidad con estos requisitos, desde Google se ofrece el SDK de User Messaging Platform (UMP), que reemplaza al anterior SDK de código abierto Consent SDK. En la próxima versión del SDK de GMA para Flutter, agregaremos compatibilidad con el SDK de UMP para permitir que los publicadores obtengan el consentimiento del usuario. Para obtener más información, consulta la página de google_mobile_ads en pub.dev.


Cambios rotundos

Mientras continuamos con el crecimiento y la mejora de Flutter, nuestro objetivo es mantener al mínimo los cambios rotundos.  Con la versión de Flutter 3, tendremos los siguientes cambios rotundos:

Si usas cualquiera de estas API, lee la guía de migración en Flutter.dev.

Resumen

Desde el equipo de Flutter en Google, agradecemos el trabajo increíble que realizó la comunidad para ayudar a que Flutter mantenga su estado como el conjunto de herramientas de IU multiplataforma más popular, según lo medido por analistas como Statista y SlashData. Esperamos colaborar con la comunidad para continuar brindando una herramienta impulsada por la comunidad que ayude a crear una experiencia agradable tanto para los desarrolladores como para los usuarios.