Saltar al contenido principal

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:

dart
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 MouseRegion no deberían verse afectados en absoluto.
  • Si tu código utiliza directamente RenderMouseRegion o MouseTrackerAnnotation, ten en cuenta que onExit ahora se llama cuando la salida es causada por eventos que solían llamar a MouseTracker.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 a setState en él. Por ejemplo:

Código antes de la migración:

dart
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:

dart
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: