【发布时间】:2021-07-30 06:16:58
【问题描述】:
我想在我的 Flutter 应用程序的屏幕上显示教程叠加层。我什至找到了一个很好的候选人,几乎可以满足我的要求:这就是https://pub.dev/packages/overlay_tutorial/ 插件。用户将按下屏幕上的帮助按钮,覆盖将弹出剪切。我不希望任何东西收到点击(https://github.com/TabooSun/overlay_tutorial/issues/26),但是如果用户点击屏幕上的任何位置,覆盖应该会消失。
我尝试使用AbsorbPointer,它成功拦截了点击,不再有点击,并且在叠加层下方发生了事情。看我的叉子:https://github.com/CsabaConsulting/overlay_tutorial/commit/9d809d51bcf55b9c8044d07d151c696bdb55abe6 但是现在也没有办法点击掉覆盖层。
@override
Widget build(BuildContext context) {
return Stack(
children: [
AbsorbPointer(
absorbing: widget.enabled && widget.absorbPointer,
ignoringSemantics: true,
child: _OverlayTutorialBackbone(
overlayColor: widget.overlayColor,
enabled: widget.enabled,
overlayTutorialHoles: _overlayTutorialHoles,
onEntryRectCalculated: () {
_updateChildren();
},
child: widget.child,
),
),
if (widget.enabled) ...[
..._overlayTutorialHoles.entries
.map((entry) {
我需要的是 AbsorbPointer 的 onTap 或 onClick 处理程序。我可以将东西包装到 GestureDetector 中,但这会一直拦截点击和手势。这里有什么好的解决方案?
【问题讨论】:
-
你不能把
widget.child换成AbsorbPointer,而不是_OverlayTutorialBackbone吗?喜欢_OverlayTutorialBackbone->AbsorbPointer->widget.child -
这绝对是一个解决方案的方向,但它不会单独改变任何东西。我将执行此订单交换,然后我必须弄清楚如何在
_OverlayTutorialBackbone级别捕获点击。_OverlayTutorialBackbone是SingleChildRenderObjectWidget。 -
有问题吗?通过向下移动
AbsorbPointer,您现在可以将_OverlayTutorialBackbone包裹在GestureDetector中。AbsorbPointer仅防止点击到达树中它下方的小部件,因此它应该可以正常工作。 -
@PatrickMahomes 问题是,如果我将 shebang 包裹到 Gesture 检测器中,那么我可以赶走覆盖层,但 GestureDetector 仍然存在。覆盖层也始终存在,它只是智能的,并且在关闭时不会自行绘制。另一件事是我包装了 _OverlayTutorialBackbone 然后我什至不需要 AbsorbPointer(至少在水龙头方面),因为手势检测器无论如何都会吞下水龙头。也许我应该看看如何通过 GestureDetector 选择性地通过手势?
-
我认为您不必担心这种行为。似乎 Flutter 仅使用层次结构中可用的最低
GestureDetector。我会做一个答案,让你看看。
标签: flutter onclick overlay gesture