Saltar al contenido principal

Notas de la versión 1.2.1 de Flutter

Notas de la versión para Flutter 1.2.1.

Nuestra prioridad nº 1 desde el lanzamiento de Flutter v1.0 ha sido continuar abordando los problemas de alta prioridad reportados tanto por desarrolladores de Flutter como por el propio equipo de Flutter. Esto incluye el commit de 672 pull requests en el engine y framework de Flutter desde diciembre (¡hemos estado ocupados!). A continuación hemos destacado las nuevas características y cambios disruptivos que creemos que son destacables. Los más grandes provinieron de nuestras etiquetas de Framework y Herramientas, pero también encontramos y corregimos un par de problemas Graves.

Framework

#

Para redondear de forma más completa el soporte de animaciones de Flutter, esta versión añade varias más de las funciones de aceleración (easing) estándar:

#25788 Añade las funciones de aceleración de Robert Penner

Para integrarse más plenamente con Android, esta versión añade soporte para Android App Bundles, un nuevo formato de empaquetado que ayuda a reducir el tamaño de la app y habilita nuevas características como la entrega dinámica para apps de Android:

#24440 Añade soporte para android app bundle

Para integrarse más plenamente con iOS, esta versión añade varias características nuevas y correcciones para iOS, incluyendo un nuevo CupertinoTheme:

#25183 Añade navigatorKey a CupertinoTabView

#25593 Permite que CupertinoTabScaffold maneje también los insets del teclado

#24876 Añade desvanecimiento de entrada y salida, redondea esquinas, corrige la compensación (offset) y corrige la altura del cursor en iOS

#23759 Añade CupertinoTheme

Además del soporte para el tema Cupertino de iOS, esta versión continúa mejorando el tema Material también:

#24169 [Material] Elevación personalizable mediante temas en diálogos

#25339 [Material] TextStyles personalizables mediante temas para AlertDialog

Para integrarse más plenamente con factores de forma de escritorio como tablets Android y ChromeOS, así como el soporte para web de escritorio y OS de escritorio, esta versión añade más soporte para teclado y mouse como dispositivos de entrada de primera clase:

#7758 Implementación recomendada de la combinación de caracteres

#27853 Conecta eventos de caracteres y puntos de código no modificados al manejo de eventos de tecla sin procesar de Android

#27620 Añade un generador de código de teclas de teclado

#27627 Añade soporte para eventos de teclas lógicas y físicas

#6961 Añade soporte de eventos hover al engine

#24830 Implementa soporte hover para punteros de mouse

Como los widgets son la forma central de interactuar con los usuarios en Flutter, esta versión continúa añadiendo características y correcciones al conjunto de widgets de Flutter prestando especial atención a SliverAppBar:

#26021 Corrige la opacidad del título de SliverAppBar y prueba todos los casos

#26101 Corrige un cierre inesperado de SliverAppBar flotante con ajuste automático (snapping)

#25091 Añade animaciones a la documentación de SliverAppBar

#24736 Proporciona algunas ubicaciones más para el FAB

#25585 Expone la API de alternativa de fuente (font fallback) en TextStyle, Roll engine 54a3577c0139..215ca1560088

#24457 Revisa los gestos de Android e iOS en TextField de Material

#24554 Añade detector y reconocedor de gestos de presión con fuerza (force press)

#23919 Permite la detección de toques en TabBar

#25384 Añade soporte para cursor flotante

#24976 Soporte para texto de sugerencia (hint text) multilínea en TextField

#26332 Strut: control de precisión sobre las alturas mínimas de línea de texto, permite forzar la altura de la línea a una altura especificada

Y finalmente, a medida que el uso de Flutter continúa creciendo en todo el mundo, continuamos mejorando el soporte para localizaciones en varios idiomas, incluyendo ucraniano, polaco, suajili y gallego en esta versión.

#25394 Actualización de localizaciones

#27506 Se añadió soporte para suajili (material_sw.arb)

#27352 Incluye el idioma gallego

Plugins

#

Al igual que en el propio framework y engine, continuamos enfocándonos en la calidad de los plugins:

flutter/engine#7317 Corrige GrContext obsoleto para vistas de plataforma de iOS

flutter/engine#7558 Corrige eventos de toque perdidos para vistas de plataforma de iOS

flutter/plugins#1157 [google_maps_flutter] Corrige el problema de posicionamiento de cámara en iOS

flutter/plugins#1176 [firebase_auth] Corrige la autenticación de teléfono de Firebase en Android

flutter/plugins#1037 [camera] Guarda la orientación de las fotos en iOS

flutter/plugins#1129 [android_alarm_manager] Corrige problemas de "inicio en segundo plano no permitido", encola eventos que se reciben demasiado temprano

flutter/plugins#1051 [image_picker] Corrige cierre inesperado en iOS cuando el selector se toca varias veces

El plugin webview_flutter obtuvo un canal de comunicación entre Dart y JavaScript:

flutter/plugins#1116 Añade canales de JavaScript para WebView (lado de Dart)

flutter/plugins#1130 Implementación en Android de canales de JavaScript para WebView

flutter/plugins#1139 Canales de JavaScript para WebView - implementación en iOS

lutter/plugins1021 evaluación de javascript ios/android

Hemos avanzado en la creación del plugin In App Purchase (que aún es pre-lanzamiento):

#1057 [IAP] Comprueba si el procesador de pagos está disponible

#1084 [IAP] Obtiene SkuDetails de Google Play

#1068 IAP lista de productos ios

#1172 [In_app_purchase] añade traductores de pago en objc

Dart

#

La versión contiene un nuevo SDK de Dart que proporciona soporte para una nueva sintaxis de literales de set e incrementa el rendimiento AOT en un 10-20% al reducir la sobrecarga de llamar a constructores o métodos estáticos:

#37 Literal de Set

#33274 Añade soporte para instrucciones "desnudas" (naked): pool de objetos globales, llamadas estáticas relativas a PC, llamadas indirectas más rápidas, potencial código compartido

Herramienta

#

Hemos añadido una serie de nuevas herramientas y nuevas características a las herramientas existentes en esta versión.

Esta versión continúa mejorando los mensajes de error en una serie de herramientas:

#26107 Mejores mensajes de error para el flag --dynamic de la herramienta flutter

#26084 Mejora el mensaje al guardar datos de entrenamiento de compilación

#25863 Mensajes más amigables al usar parcheo dinámico

Esta versión también añade soporte para Java 1.8:

#25470 Soporte para Java 1.8

Graves

#

En esta versión, hemos encontrado y corregido algunos problemas graves de la versión anterior, incluyendo dos cierres inesperados (crashes) y una degradación del rendimiento.

Cierres inesperados

#7314 Cierre inesperado de Flutter al iniciar (metabug)

Rendimiento

#25381 Añade prueba de rendimiento de opacidad de descarte (cull opacity) al device lab

Cambios disruptivos

#

En un esfuerzo por continuar mejorando Flutter desde la versión 1.0 para satisfacer las necesidades de los clientes, hemos tenido que hacer algunos cambios disruptivos:

#8769 Renombra ListItem a ListTile, documenta la geometría de altura fija de ListTile

#

Muchos desarrolladores estaban confundidos por el hecho de que ListItem tenía una altura fija. Lo hemos renombrado a ListTile, para indicar que (al igual que otros tiles) su altura es fija, y la documentación se ha actualizado para decir claramente eso sobre ListTile. Tendrás que renombrar las instancias de la clase ListItem a ListTile en tu código.

#7518 Actualiza la ruta predeterminada de flutter_assets para la incrustación en iOS

#

Los assets de Flutter para aplicaciones de iOS ahora se encuentran en Frameworks/App.framework/flutter_assets en lugar de flutter_assets. La herramienta de línea de comandos de flutter debería encargarse de esta diferencia, pero si estás escribiendo una aplicación AddToApp para iOS que comparte assets con Flutter, necesitarás estar al tanto de este cambio.

#27697 Corrección del cursor de TextField de Cupertino

#

El cursorColor predeterminado de CupertinoTextField ahora coincide con el tema de la app. Si esto no es deseable, los desarrolladores pueden usar la propiedad cupertinoOverrideTheme de ThemeData para proporcionar una invalidadación específica de Cupertino usando un objeto CupertinoThemeData, por ejemplo:

dart
Widget build(BuildContext context) {
  // Set theme data for override in the CupertinoThemeData's constructor
  Theme.of(context).cupertinoOverrideTheme = CupertinoThemeData(
    brightness: Brightness.dark,
    primaryColor: Color(0xFF42A5F5)
  );
  return Text(
    'Example',
    style: Theme.of(context).textTheme.title,
  );
}

#23424 Enseña comportamientos de inicio de arrastre a DragGestureRecognizer

#

De forma predeterminada, el callback onStart de un detector de gestos de arrastre será llamado con la ubicación donde se detecta un gesto de arrastre (es decir, después de arrastrar un cierto número de píxeles) en lugar de en la ubicación de presionar la pantalla (touch down). Para usar la funcionalidad anterior con un reconocedor de gestos de arrastre dado, la variable dragStartBehavior del reconocedor debe configurarse en DragStartBehavior.down, por ejemplo, incluye la línea en negrita a continuación al declarar tu GestureDecorator:

dart
GestureDectector(
  dragStartBehavior: DragStartBehavior.down,
  onVerticalDragDown: myDragDown
  onVerticalDragEnd: myDragEnd,
  onVerticalDragStart: myDragStart,
  onVerticalDragUpdate: myDragUpdate,
  onVerticalDragCancel: myDragCancel,
  onHorizontalDragDown: myDragDown
  onHorizontalDragEnd: myDragEnd,
  onHorizontalDragStart: myDragStart,
  onHorizontalDragUpdate: myDragUpdate,
  onHorizontalDragCancel: myDragCancel,
// Other fields…

#26238 Elimina TwoLevelList obsoleto desde hace tiempo

#

Se eliminó el widget TwoLevelList obsoleto desde hace tiempo; usa ListView con ExpansionTile en su lugar. Mira este ejemplo para ver una muestra que usa ExpansionTile.

####7442 Mueve la rasterización de Picture.toImage al hilo de la GPU

Picture.toImage ahora devuelve un Future<Image> en su lugar. Esto permite que la rasterización de la imagen ocurra en el hilo de la GPU, mejorando el rendimiento en muchos casos y garantizando resultados correctos. Como mínimo, tendrás que declarar los métodos que invocan instancias de Picture como async y usar await, así:

dart
void usePictureImage(Picture p) async {
  var image = await p.toImage();
  // Do something with the pixels in image….
}

Sin embargo, tu aplicación bien puede estar realizando otras acciones asíncronas, y deberías considerar cómo deseas manejar el procesamiento de imágenes a la luz de eso. Para obtener más información sobre el soporte de Dart para la programación asíncrona y la clase Future, consulta https://www.dartlang.org/tutorials/language/futures.

#7567 Renombra FlutterResult en embedder.h

#

En la API del Embedder, el tipo FlutterResult ha sido renombrado a FlutterEngineResult para explicar mejor su propósito. Tendrás que renombrar cualquier instancia del primero al segundo.

#7414 Implementación de Strut

#

Renombra ParagraphStyle.lineHeight de dart:ui a ParagraphStyle.height. La propiedad ParagraphStyle.lineHeight anteriormente no hacía nada y fue renombrada para mantenerse consistente con TextStyle.height. Tendrás que renombrar cualquier instancia de la primera a la segunda.

Regresiones

#

Poco después de nuestra versión 1.2, encontramos dos regresiones:

  • #28640 NoSuchMethodError: android.view.MotionEvent.isFromSource

flutter/flutter#24830 ("Implement hover support for mouse pointers.") está usando una API de Android que no existe en dispositivos más antiguos. Esto puede causar un cierre inesperado en Android 4.1 (Jellybean) y 4.1 (Jellybean MR1).

  • #28484 Renderizado de Widget extraño desde la actualización de Flutter

Esto puede causar problemas de renderizado al cargar ciertas imágenes en dispositivos físicos de iOS.

Para obtener una solución a estas regresiones, una vez que la beta 1.3 se lance en marzo, puedes cambiar al canal beta y realizar un "flutter upgrade" en la línea de comandos. Al momento de escribir esto, eso te actualizará al menos a la versión 1.3.8, la cual incluye flutter/engine#8006 ("Guard against using Android API not defined in API level 16 & 17") y el commit de Skia que corrige el problema de renderizado. En cuanto al problema del cierre inesperado, las dos versiones afectadas de Android tienen más de diez años y representan como máximo el 2.5% de los usuarios de Android, pocos de los cuales es probable que estén instalando nuevas aplicaciones de Android, ya sean de Flutter o no. Aun así, odiamos dejar regresiones conocidas en una versión estable, pero después de un gran debate interno, decidimos que era la mejor manera de proceder para los desarrolladores de Flutter y los usuarios de sus apps.

Nuestra solución ideal para cualquier problema grave es crear una versión "hotfix" tomando una versión existente y haciendo "cherry pick" de las correcciones que nos gustaría aplicar. La capacidad de aplicar un hotfix a una versión estable existente es algo que implementamos para 1.2 pero que no ha llegado del todo a la calidad de producción. La consecuencia de esto es que si hubiéramos creado una nueva versión estable "1.2.1-a" con la corrección para las regresiones, habríamos dejado varados a todos nuestros usuarios en esa rama; actualizar a futuras ramas habría requerido que los usuarios eliminaran y reinstalaran Flutter desde cero, lo cual era claramente inaceptable. Estamos trabajando duro para validar nuestra capacidad de hacer hotfix en 1.3+ para no tener este problema de nuevo.

Otra opción habría sido llevar 1.3 a una versión estable. Nuestra política actual es lanzar solo una nueva versión estable una vez por trimestre para reducir el impacto en los desarrolladores de Flutter. Al momento de escribir esto, la versión pre-estable 1.3 contiene 104 commits del framework (e incluso más commits del engine, Dart y Skia), cualquiera de los cuales es un riesgo para la forma en que se ejecutan tus apps actuales. Para reducir ese riesgo, dejamos las versiones en beta durante un mes, dejamos que los desarrolladores las prueben y solo promovemos las versiones al canal estable cuando estamos seguros de ellas. Así es como mantenemos la estabilidad en las versiones trimestrales.

Nuestra próxima versión estable está actualmente planeada para mayo de 2019, que es la primera versión estable que incluirá la solución para esta regresión. Si te ves afectado por #28640 y sientes que la solución alternativa de usar la pre-versión 1.3 no es una opción para ti, por favor háznoslo saber en flutter/flutter#29235. Del mismo modo, si te ves afectado por #28484, háznoslo saber en flutter/flutter/#29360. Si encontramos que hay muchos comentarios de la comunidad de Flutter de que tomamos la decisión equivocada aquí, usaremos tus comentarios para reevaluar. Flutter es, después de todo, un esfuerzo comunitario y tus opiniones importan.

Lanzamientos de herramientas

#

Además de los cambios en el framework de Flutter en la versión 1.2, hemos realizado una serie de lanzamientos de herramientas en el mismo período de tiempo, de los cuales puedes leer aquí:

Lista completa de problemas

#

Puedes ver la lista completa de PRs enviados en esta versión.