MouseTracker ya no adjunta anotaciones
MouseTracker ya no depende del acoplamiento de anotaciones para realizar la comprobación de salida en montado; por lo tanto, se eliminan los tres métodos relacionados.
Resumen
#Se eliminaron los métodos de MouseTracker attachAnnotation,
detachAnnotation e isAnnotationAttached.
Contexto
#Los eventos de mouse, como cuando un puntero de mouse ha entrado en una región,
ha salido o se desplaza sobre ella, se detectan con la ayuda de
MouseTrackerAnnotation que se colocan en las regiones interesadas
durante la fase de renderizado. En cada actualización (un nuevo frame o un nuevo evento),
MouseTracker compara las anotaciones sobre las que se encuentra el puntero
antes y después de la actualización, y luego distribuye los
callbacks correspondientes.
La clase MouseTracker, que gestiona el estado de los punteros de mouse,
solía requerir que MouseRegion acoplara anotaciones al montarse,
y las desacoplara al desmontarse.
Esto era utilizado por MouseTracker para realizar la
comprobación de salida en montado (por ejemplo,
no se debe llamar a MouseRegion.onExit si la salida fue causada por el desmontaje
del Widget), con el fin de evitar llamar a setState
de un Widget desmontado y lanzar excepciones (explicado
en detalle en el Issue #44631).
Este mecanismo ha sido reemplazado haciendo de MouseRegion
un Widget Stateful, de modo que pueda realizar la comprobación de salida
en montado por sí mismo bloqueando el callback al desmontarse.
Por lo tanto, estos métodos han sido eliminados y MouseTracker
ya no rastrea todas las anotaciones en la pantalla.
Descripción del cambio
#La clase MouseTracker ha eliminado tres métodos relacionados
con el acoplamiento de anotaciones:
class MouseTracker extends ChangeNotifier {
// ...
void attachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}
void detachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}
@visibleForTesting
bool isAnnotationAttached(MouseTrackerAnnotation annotation) {/* ... */}
}
RenderMouseRegion y MouseTrackerAnnotation ya no realizan la
comprobación de salida en montado, mientras que MouseRegion todavía lo hace.
Guía de migración
#Las llamadas a MouseTracker.attachAnnotation y
detachAnnotation deben eliminarse con poco o ningún impacto:
- Los usos de
MouseRegionno deberían verse afectados en absoluto. - Si tu código utiliza directamente
RenderMouseRegionoMouseTrackerAnnotation, ten en cuenta queonExitahora se llama cuando la salida es causada por eventos que solían llamar aMouseTracker.detachAnnotation. Esto no debería ser un problema si no hay estados involucrados; de lo contrario, es posible que desees añadir la comprobación de salida en montado, especialmente si el callback se filtra de manera que los Widgets externos puedan llamar asetStateen él. Por ejemplo:
Código antes de la migración:
class MyMouseRegion extends SingleChildRenderObjectWidget {
const MyMouseRegion({this.onHoverChange});
final ValueChanged<bool> onHoverChange;
@override
RenderMouseRegion createRenderObject(BuildContext context) {
return RenderMouseRegion(
onEnter: (_) { onHoverChange(true); },
onExit: (_) { onHoverChange(false); },
);
}
@override
void updateRenderObject(BuildContext context, RenderMouseRegion renderObject) {
renderObject
..onEnter = (_) { onHoverChange(true); }
..onExit = (_) { onHoverChange(false); };
}
}
Código después de la migración:
class MyMouseRegion extends SingleChildRenderObjectWidget {
const MyMouseRegion({this.onHoverChange});
final ValueChanged<bool> onHoverChange;
@override
RenderMouseRegion createRenderObject(BuildContext context) {
return RenderMouseRegion(
onEnter: (_) { onHoverChange(true); },
onExit: (_) { onHoverChange(false); },
);
}
@override
void updateRenderObject(BuildContext context, RenderMouseRegion renderObject) {
renderObject
..onEnter = (_) { onHoverChange(true); }
..onExit = (_) { onHoverChange(false); };
}
@override
void didUnmountRenderObject(RenderMouseRegion renderObject) {
renderObject
..onExit = onHoverChange == null ? null : (_) {};
}
}
Las llamadas a MouseTracker.isAnnotationAttached deben eliminarse.
Esta característica ya no es técnicamente posible,
ya que las anotaciones ya no se rastrean.
Si de alguna manera necesitas esta característica, por favor envía un reporte de issue.
Timeline
#Introducido en la versión: 1.15.4
En la versión estable: 1.17
Referencias
#Documentación de la API:
PRs relevantes:
- MouseTracker ya no requiere anotaciones acopladas, lo que originó el cambio
- Improve MouseTracker lifecycle: Move checks to post-frame, que introdujo por primera vez el cambio de salida en montado, explicado en The change to onExit.
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.