Flutter 组件分析之 AbsorbPointer
本系列教程基于Flutter widget, 意在为Flutter 入门提供基础建设. 重点在讲解widget 的 用法,参数以及扩展.
适宜人群: 入门
引子
AbsorbPointer 是有关于手势拦截的 widget 之一. 首先, 我们要了解一个概念, 手势的传递是由上而下的. 换句话来说, 在上层拦截了手势, 下层的 widget 也就收不到手势相关的信息了. AbsorbPointer 在 Flutter 中正是扮演着这样的角色, 它在上层拦截了手势后将不会传入它的 child 部分. 但是 AdsorbPointer 本身对于手势是可见的.
AbsorbPointer
AbsorbPointer 的参数由 key、absorbing、child、ignoringSemantics 构成.
其中, ignoringSemantics 将会决定是否忽略当前节点的语义. 重点在于 absorbing, 这个参数决定了是否吸收手势事件. 我们通过 AbsorbPointer 的处理方式, 来看看它是如何在不隐藏 ui 的情况下, 去忽略手势事件的吧~
RenderAbsorbPointer
手势处理部分通常在 RenderObject 的 hitTest 中, 这里处理着手势相关的事件. 我们也通过 RenderAbsorbPointer 去看看关于 AbsorbPointer 的事件处理.
在 hitTest 函数中, 我们确实可以看到关键字 absorbing. 当为 true 的时候, 当前会根据是否命中当前的控件直接处理手势事件, 为false的时候, 则会分发到 child.
通过这一系列的处理, 最终实现了在手势传递过程中, 上层对手势的拦截.
思考
关于 AbsorbPointer 对于手势的拦截而不影响绘制. 实际运用过程中, 我们可能需要构建动画而不影响背后的 ui. 这里如果构建自定义的 RenderObject, 也可以模拟这种写法, 这种写法的好处在于从源头解决了手势下发的问题. 不积跬步,无以至千里; 不积小流,无以成江海; 日积月累总会让你的技术有所蜕变!
这里是WeninerIo😇
如果你对这次的技术分享感兴趣或者有什么疑惑🧐
不妨在评论区留言或私信🤪
或许这次的分享不是你所期待的😣
那就点个关注吧! 🙏
下次也许就是你中意的呢🫣?