第二十四回:如何屏蔽事件


我们在上一章回中介绍了事件处理相关的内容,,本章回中将介绍 如何屏蔽事件相关的知识.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在实际项目中不但需要处理各种点击事件,而且需要屏蔽部分点击事件,比如多个组件在一起时就会发生事件冲突。因此我们需要屏蔽部分组件的点击事件。本章回中将介绍如何屏蔽事件。此外,这里说的事件表示PointerEvent类及其子类所表示的事件。

使用方法

限定事件范围

我们可以把Listener组件放到一个容器中(Container类组件),然后通过容器来限制范围,这样只有指定范围内的事件才能被响应。这里说的限制范围本质上就限制容器的长度和宽度,对容器的长度和宽度进进限定后就能确定容器的大小,相当于在屏幕上划出了一块等于容器大小的区域,位于在该区域内的组件才能响应事件,位于该区域外的组件则不能响应事件。

如何判断组件是否位于区域内?看child属性对应的组件:Container的child属性对应Listener组件,Listener组件的child属性对应的组件就是位于区域内的组件。反之就是位于区域外的组件。

限定组件

我们还可以使用专门的组件来屏蔽事件,这个组件是IgnorePointer,该组件有一个child属性,与child属性对应的组件不会响应任何事件。如果我们不想让某个组件响应事件,那么可以把它赋值给IgnorePointer组件对应的child属性。

示例代码

return Scaffold(
  appBar: AppBar(
    title: const Text("Example of PointerEvent"),
    backgroundColor: Colors.purpleAccent,
  ),
  body: Column(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
      Container(
        color: Colors.blue,
        alignment: Alignment.center,
        width: 200,
        height: 200,
        child: Listener(
            onPointerDown: _eventDown,
            onPointerMove: _eventMove,
            onPointerUp: _eventUp,
            child: const Text(
              "Event Listener inside",
              style: TextStyle(
                color: Colors.black87,
                fontSize: 16,
                backgroundColor: Colors.white,
              ),
            )),
      ),
      Listener(
        //Listener可以当作容器Widget包含其它Widget使用,也可以当作独立widget使用
        onPointerCancel: _eventCancle,
        onPointerDown: _eventDown,
        onPointerUp: _eventUp,
        onPointerMove: _eventMove,
        child: Container(
          color: Colors.orange,
          alignment: Alignment.center,
          constraints: const BoxConstraints(
            minWidth: 200,
            minHeight: 100,
          ),
          child: const Text(
            "Event Listener Outside",
            style: TextStyle(
              color: Colors.black87,
              backgroundColor: Colors.white,
            ),
          ),
        ),
      ),
      IgnorePointer(
        child: Container(
          color: Colors.lime,
          alignment: Alignment.center,
          width: 300,
          height: 100,
          child: Listener(
            onPointerDown: _eventDown,
            child: const Text(
              "Ignore Event Listener",
              style: TextStyle(
                color: Colors.black87,
                backgroundColor: Colors.white,
              ),
            ),
          ),
        ),
      ),
    ],
  ),
); 

上面的代码中,在页面中放了三列:

  • 第一列中在容器内嵌套了一个Listener,并且把Text组件赋值给了Listener组件,我们称其为"Event Listener inside".该内容中只有点击Text组件时才会响应事件,相当于屏蔽了Text组件外的事件。
  • 第二列中在Listener内嵌套了一个容器组件,并且把Text组件赋值给了容器的child属性,我们称其为"Event Listener outside",该内容中只要点击容器内的任何位置都可以响应事件,相当于屏蔽了容器外的事件。
  • 第三列中在IgnorePointer组件内嵌套了一个容器组件,并且Text赋值给容器的child属性,我们称其为"Ignore Event Listener",该内容中不论点击Text外还是Text内都不会响应事件。

程序中为了方便观察,我们给容器和Text添加了背景色,建议大家动手试试,通过程序打印的日志来观察是否响应了事件。

经验总结

我们介绍了两种屏蔽事件的方法,大家可以依据项目的需要选择不同的方法。在实际项目中我们要尽可能小地缩小事件的响应范围,这样可以避免不必要的事件冲突。因此常用的做法是在容器类组件中嵌套一个Listener组件。当然这只是个人经验,大家可以在评论区分享和交流自己的项目经验。

看官们,关于"如何屏蔽事件"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值