本系列教程基于Flutter widget, 意在为Flutter 入门提供基础建设. 重点在讲解widget 的 用法,参数以及扩展.
适宜人群: 入门

引子

AbsorbPointer 是有关于手势拦截的 widget 之一. 首先, 我们要了解一个概念, 手势的传递是由上而下的. 换句话来说, 在上层拦截了手势, 下层的 widget 也就收不到手势相关的信息了. AbsorbPointer 在 Flutter 中正是扮演着这样的角色, 它在上层拦截了手势后将不会传入它的 child 部分. 但是 AdsorbPointer 本身对于手势是可见的.

AbsorbPointer

AbsorbPointer 的参数由 key、absorbing、child、ignoringSemantics 构成.

image
其中, ignoringSemantics 将会决定是否忽略当前节点的语义. 重点在于 absorbing, 这个参数决定了是否吸收手势事件. 我们通过 AbsorbPointer 的处理方式, 来看看它是如何在不隐藏 ui 的情况下, 去忽略手势事件的吧~

RenderAbsorbPointer

手势处理部分通常在 RenderObject 的 hitTest 中, 这里处理着手势相关的事件. 我们也通过 RenderAbsorbPointer 去看看关于 AbsorbPointer 的事件处理.

在 hitTest 函数中, 我们确实可以看到关键字 absorbing. 当为 true 的时候, 当前会根据是否命中当前的控件直接处理手势事件, 为false的时候, 则会分发到 child.

image
通过这一系列的处理, 最终实现了在手势传递过程中, 上层对手势的拦截.

思考

关于 AbsorbPointer 对于手势的拦截而不影响绘制. 实际运用过程中, 我们可能需要构建动画而不影响背后的 ui. 这里如果构建自定义的 RenderObject, 也可以模拟这种写法, 这种写法的好处在于从源头解决了手势下发的问题. 不积跬步,无以至千里; 不积小流,无以成江海; 日积月累总会让你的技术有所蜕变!

这里是WeninerIo😇

如果你对这次的技术分享感兴趣或者有什么疑惑🧐

不妨在评论区留言或私信🤪

或许这次的分享不是你所期待的😣

那就点个关注吧! 🙏

下次也许就是你中意的呢🫣?