Saltar al contenido principal

Los AnnotatedRegionLayers devuelven la posición local relativa a la región de recorte

Proporcionar búsquedas de anotaciones con posiciones locales fiables y significativas.

Resumen

#

La posición local devuelta por AnnotatedRegionLayers en una búsqueda de anotaciones ha cambiado para ser relativa a la región de recorte en lugar de la capa. Esto hace que la posición local sea más significativa y confiable, pero rompe el código que realiza directamente búsquedas de anotaciones y utiliza la posición local.

Contexto

#

Las anotaciones son metadatos que se asignan durante la fase de renderizado a regiones de la pantalla. Buscar las anotaciones con una ubicación proporciona la información contextual que contiene dicha ubicación. Se utilizan para detectar eventos de ratón y el tema de las barras de la aplicación.

Cuando se añadió localPosition por primera vez al resultado de búsqueda, se definió como relativo a la capa propietaria de la anotación, lo que resultó ser un error de diseño. El desplazamiento desde la capa carece de sentido y no es confiable. Por ejemplo, un Widget Transform dibuja en la misma capa con un desplazamiento si la matriz de transformación es una traslación simple, o introduce un TransformLayer dedicado si la matriz no es trivial. El primer caso mantiene el origen de coordenadas anterior (for ejemplo, la esquina superior izquierda de la aplicación), mientras que el segundo caso mueve el origen de la posición ya que está en una nueva capa. Es posible que los dos casos no produzcan diferencias visuales notables, ya que la capa adicional podría ser solo una escala del 99%, a pesar de que la búsqueda de anotaciones devuelva resultados diferentes. Para hacer que esta posición local sea confiable, tenemos que elegir uno de los resultados a los que atenernos.

Descripción del cambio

#

El localPosition devuelto por un AnnotatedRegionLayer es ahora la posición local que recibió menos el offset, donde offset es la ubicación del área de recorte relativa a la capa.

dart
class AnnotatedRegionLayer<T> extends ContainerLayer {
  @override
  bool findAnnotations<S>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
    ...
    if (/* shouldAddAnnotation */) {
      result.add(AnnotationEntry<S>(
        annotation: typedValue,
        // Used to be:
        // localPosition: localPosition,
        localPosition: localPosition - offset,
      ));
    }
    ...
  }
}

Conceptually, esto ha cambiado la forma en que se definen AnnotatedRegionLayer.offset y size. Solían significar "el rectángulo de recorte que restringe la búsqueda de anotaciones", mientras que ahora representan conjuntamente "la región del objeto de anotación".

Guía de migración

#

El código que está utilizando activamente esta posición local probablemente esté interactuando directamente con las capas, ya que el uso de RenderObjects o Widgets ya ha hecho que este resultado no sea confiable. Para preservar el comportamiento anterior, puedes volver a implementar AnnotatedRegionLayer para que devuelva una posición local sin restar el offset.

Timeline

#

Llegó en la versión: 1.15.2
En la versión estable: 1.17

Referencias

#

Documentación de la API:

Issues relevantes:

PR relevante: