Saltar al contenido principal

Guía de migración para ignoringSemantics en IgnorePointer y clases relacionadas

Eliminación de ignoringSemantics en IgnorePointer y clases relacionadas.

Resumen

#

El Widget IgnoringPointer te permite designar un área de la UI donde no quieras aceptar eventos de puntero, por ejemplo, cuando no quieras permitir que el usuario ingrese texto en un campo de texto.

Anteriormente, el IgnorePointer no solo bloqueaba eventos de puntero sino que también eliminaba su subárbol del árbol de semántica. El parámetro ignoreSemantics fue introducido como una solución temporal para preservar el árbol de semántica al usar IgnorePointers.

El comportamiento de IgnorePointer ha cambiado en el sentido de que ya no elimina todo el subárbol de semántica, sino que simplemente bloquea las acciones de semántica en el subárbol. La solución temporal ignoringSemantics ya no es necesaria y está degradada.

Este cambio también se aplica a los Widgets AbsorbPointer y SliverIgnorePointer.

Descripción del cambio

#

Se eliminó ignoringSemantics.

Guía de migración

#

Si estableces este parámetro en true en estos Widgets, considera usar ExcludeSemantics en su lugar.

Código antes de la migración:

dart
IgnorePointer(
  ignoringSemantics: true,
  child: const PlaceHolder(),
);

AbsorbPointer(
  ignoringSemantics: true,
  child: const PlaceHolder(),
);

SliverIgnorePointer(
  ignoringSemantics: true,
  child: const PlaceHolder(),
);

Código después de la migración:

dart
ExcludeSemantics(
  child: IgnorePointer(
    child: const PlaceHolder(),
  ),
);

ExcludeSemantics(
  child: AbsorbPointer(
    child: const PlaceHolder(),
  ),
);

SliverIgnorePointer(
  child: ExcludeSemantics(
    child: const PlaceHolder(),
  ),
);

Si anteriormente usabas IgnorePointers con ignoringSemantics establecido en false, puedes lograr el mismo comportamiento copiando los siguientes Widgets directamente en tu código y usándolos.

dart
/// A widget ignores pointer events without modifying the semantics tree.
class _IgnorePointerWithSemantics extends SingleChildRenderObjectWidget {
  const _IgnorePointerWithSemantics({
    super.child,
  });

  @override
  _RenderIgnorePointerWithSemantics createRenderObject(BuildContext context) {
    return _RenderIgnorePointerWithSemantics();
  }
}

class _RenderIgnorePointerWithSemantics extends RenderProxyBox {
  _RenderIgnorePointerWithSemantics();

  @override
  bool hitTest(BoxHitTestResult result, { required Offset position }) => false;
}

/// A widget absorbs pointer events without modifying the semantics tree.
class _AbsorbPointerWithSemantics extends SingleChildRenderObjectWidget {
  const _AbsorbPointerWithSemantics({
    super.child,
  });

  @override
  _RenderAbsorbPointerWithSemantics createRenderObject(BuildContext context) {
    return _RenderAbsorbPointerWithSemantics();
  }
}

class _RenderAbsorbPointerWithSemantics extends RenderProxyBox {
  _RenderAbsorbPointerWithSemantics();

  @override
  bool hitTest(BoxHitTestResult result, { required Offset position }) {
    return size.contains(position);
  }
}

/// A sliver ignores pointer events without modifying the semantics tree.
class _SliverIgnorePointerWithSemantics extends SingleChildRenderObjectWidget {
  const _SliverIgnorePointerWithSemantics({
    super.child,
  });

  @override
  _RenderSliverIgnorePointerWithSemantics createRenderObject(BuildContext context) {
    return _RenderSliverIgnorePointerWithSemantics();
  }
}

class _RenderSliverIgnorePointerWithSemantics extends RenderProxySliver {
  _RenderSliverIgnorePointerWithSemantics();

  @override
  bool hitTest(BoxHitTestResult result, { required Offset position }) => false;
}

Timeline

#

Introducido en la versión: 3.10.0-2.0.pre
En el lanzamiento estable: 3.13.0

Referencias

#

PRs relevantes:

  • PR 120619: Corrige IgnorePointer y AbsorbPointer para que solo bloqueen las interacciones del usuario en a11y.