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.
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:
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-05-05. Ver código fuente oreportar un problema.