AbsorbPointer未拦截点击事件疑问:仅在Stack同级生效?
AbsorbPointer 作用范围答疑
首先明确:AbsorbPointer 不是用来拦截父级组件点击事件的,它的核心功能是让自身子树内的所有组件无法参与手势命中测试(也就是无法响应点击),但完全不会影响父级、同级等外部组件的手势识别逻辑。
你遇到的代码问题逻辑是这样的:
- 父级
GestureDetector监听的是绿色容器的点击区域,红色容器本身就在绿色容器的范围内,点击红色区域本质上也属于点击了绿色容器的有效区域。 AbsorbPointer只阻止了它子树里的红色容器对应的GestureDetector触发(所以不会打印567),但父级的GestureDetector不在它的子树范围内,其命中测试不受影响,因此会正常打印123。
它的生效范围和 Stack 没有绑定关系——不管是普通组件树还是 Stack 布局里,只要是它子树内的组件,都会被阻止响应手势;而父级、非子树的同级组件,完全不受它的限制。
如果要实现「点击红色区域时父级 GestureDetector 也不触发」的效果,你需要把 AbsorbPointer 放到父级 GestureDetector 的外层,让父级成为它的子树的一部分,示例代码如下:
AbsorbPointer( absorbing: true, child: GestureDetector( onTap: () { print('123'); }, child: Container( color: Colors.green, width: 300, height: 300, child: Center( child: GestureDetector( onTap: () { print('567'); }, child: Container( color: Colors.red, width: 100, height: 100, ), ), ), ), ), )
内容的提问来源于stack exchange,提问作者manhtuan21
相关产品推荐
相关产品推荐

