忽略 IgnorePointer 和相關類中的 ignoringSemantics 的遷移指南
概述
#IgnoringPointer widget 允許您指定 UI 中的一個區域,您不希望在該區域接收指標事件,例如,當您不希望使用者在文字欄位中輸入文字時。
以前,IgnorePointer 不僅會阻止指標事件,還會將其子樹從語義樹中刪除。引入 ignoreSemantics 引數是為了在使用 IgnorePointers 時保留語義樹而引入的變通方法。
IgnorePointer 的行為已有所改變,它不再刪除整個語義子樹,而只是阻止子樹中的語義操作。ignoringSemantics 變通方法不再需要,並且已棄用。
此更改也適用於 AbsorbPointer 和 SliverIgnorePointer widgets。
變更說明
#ignoringSemantics 已被移除。
遷移指南
#如果您在這些 widgets 中將此引數設定為 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(),
),
);如果您之前在使用 IgnorePointers 並將 ignoringSemantics 設定為 false,您可以透過將以下 widget 直接複製到您的程式碼中並使用來達到相同的行為。
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 中的使用者互動。