flutter 事件分发拦截
1,AbsorbPointer 是吸收拦截,absorbing 为true时,拦截下面的监听。2,IgnorePointer 是忽略拦截,为true时,周围控件都拦截,但是stack布局后面的可以得到监听事件。3,每个控件都可以加 Listener 监听,里面的方法可以实现手势,从而达到拦截等操作。4,GestureDetector 经常用来添加点击,双击,滑动,长按等操作,其实也可以定义拦截,滑
1,AbsorbPointer 是吸收拦截,absorbing 为true时,拦截下面的监听。
2,IgnorePointer 是忽略拦截,为true时,周围控件都拦截,但是stack布局后面的可以得到监听事件。
3,每个控件都可以加 Listener 监听,里面的方法可以实现手势,用controller滑动,从而达到拦截等操作。
4,GestureDetector 经常用来添加点击,双击,滑动,长按等操作,其实也可以定义拦截,滑动等事件。但是其他控件响应了,会直接cancel掉。
AbsorbPointer使用起来最简单,但是不知道为什么在 StatelessWidget 里用,改变 absorbing的值也没有效果,可能因为用的方法不太对。我用的流去改的值。
补充:
假如我们不想让某个子树响应PointerEvent的话,我们可以使用IgnorePointer和AbsorbPointer,这两个组件都能阻止子树接收指针事件,不同之处在于AbsorbPointer本身会参与命中测试,而IgnorePointer本身不会参与,这就意味着AbsorbPointer本身是可以接收指针事件的(但其子树不行),而IgnorePointer不可以。一个简单的例子如下:
Listener(
child: AbsorbPointer(
child: Listener(
child: Container(
color: Colors.red,
width: 200.0,
height: 100.0,
),
onPointerDown: (event)=>print("in"),
),
),
onPointerDown: (event)=>print("up"),
)
点击Container时,由于它在AbsorbPointer的子树上,所以不会响应指针事件,所以日志不会输出"in",但AbsorbPointer本身是可以接收指针事件的,所以会输出"up"。如果将AbsorbPointer换成IgnorePointer,那么两个都不会输出。
更多推荐



所有评论(0)