1,AbsorbPointer 是吸收拦截,absorbing 为true时,拦截下面的监听。

2,IgnorePointer 是忽略拦截,为true时,周围控件都拦截,但是stack布局后面的可以得到监听事件。

3,每个控件都可以加 Listener 监听,里面的方法可以实现手势,用controller滑动,从而达到拦截等操作。

4,GestureDetector 经常用来添加点击,双击,滑动,长按等操作,其实也可以定义拦截,滑动等事件。但是其他控件响应了,会直接cancel掉。

AbsorbPointer使用起来最简单,但是不知道为什么在  StatelessWidget 里用,改变 absorbing的值也没有效果,可能因为用的方法不太对。我用的流去改的值。

补充:

假如我们不想让某个子树响应PointerEvent的话,我们可以使用IgnorePointerAbsorbPointer,这两个组件都能阻止子树接收指针事件,不同之处在于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,那么两个都不会输出。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐