概述

#

IgnoringPointer 组件允许您指定 UI 中的一个区域,在此区域内不接受指针事件,例如,当您不希望用户在文本字段中输入文本时。

此前,IgnorePointer 不仅会阻止指针事件,还会将其子树从语义树中移除。引入 ignoreSemantics 参数作为一种变通方法,以便在使用 IgnorePointer 时保留语义树。

IgnorePointer 的行为已发生变化,它不再移除整个语义子树,而只是阻止子树中的语义操作。ignoringSemantics 这一变通方法已不再需要,并已弃用。

此更改也适用于 AbsorbPointerSliverIgnorePointer 组件。

变更说明

#

ignoringSemantics 已被移除。

迁移指南

#

如果您在这些组件中将此参数设置为 true,请考虑改用 ExcludeSemantics

迁移前的代码

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

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

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

迁移后的代码

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

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

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

如果您之前使用 IgnorePointer 且将 ignoringSemantics 设置为 false,则可以通过直接将以下组件复制到您的代码中并使用来达到相同的效果。

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;
}

时间线

#

发布版本:3.10.0-2.0.pre
在稳定版中发布: 3.13.0

参考资料

#

相关 PR

  • PR 120619:修复 `IgnorePointer` 和 `AbsorbPointer` 以仅在可访问性(a11y)中阻止用户交互。