【交互 widget】IgnorePointer 与 AbsorbPointer

简介: 【交互 widget】IgnorePointer 与 AbsorbPointer

image.png

大家好,我是 17,今天的每日 widget 继续交互 widget 的话题,为大家介绍 IgnorePointer 与 AbsorbPointer。

IgnorePointer 与 AbsorbPointer 都可以让 child 无法响应点击事件。IgnorePointer 与 AbsorbPointer 可以和 Listener 配合使用,先了解下 Listener ,再看本篇会非常轻松。

源码分析

IgnorePointer 的 hitTest

@override
  bool hitTest(BoxHitTestResult result, {required Offset position}) {
    return !ignoring && super.hitTest(result, position: position);
  }
复制代码

当  ignoring 为 true, hitTest 返回 false,child 不能响应 pointer 事件。child 不响应事件的原因是  child 没机会把自身加到事件列表。如果 IgnorePointer 是 parent 的唯一 child,parent 不响应事件,原因是对于 parent 来说 child hitTest 失败。 如果 IgnorePointer 的 parent 有多个 child,会继续判断前一个 child,只要有一个 child hitTest 成功,停止判断,可以响应事件。

当 ignoring 为 false,可以认为 IgnorePointer 不起任何作用。

parent 的 behavior == HitTestBehavior.opaque 或 behavior == HitTestBehavior.translucent,就算是 ignoring 为 true,也可以响应 pointer 事件。

AbsorbPointer  hitTest

@override
  bool hitTest(BoxHitTestResult result, {required Offset position}) {
    return absorbing
        ? size.contains(position)
        : super.hitTest(result, position: position);
  }
复制代码

absorbing 为 true,在 size 范围内点击返回 true, 父级可以响应点击事件,因为对于父级来说, child hitTest 成功。child 不能响应 pointer 事件,因为 child 没机会把自身加到事件列表。

absorbing 为 false,可以认为 AbsorbPointer 不起任何作用。

IgnorePointer 应用场景

源码分析中已经分析了 IgnorePointer 的作用,那么应用场景也就可以想见了。

不响应 pointer 事件

Listener(
    onPointerDown: (event) {
      print('parent down');
    },
    child: IgnorePointer(
        ignoring: true,
        child: ElevatedButton(
          child: Text('IAM17'),
          onPressed: () {
            print('child down');
          },
        )),
  )
复制代码

无论是 Listener 还是 ElevatedButton 都不会响应事件。

让前面的兄弟可以有机会进行 hitTest(穿透)

image.png

如图,蓝色的 box 完全覆盖在绿色 box 之上,默认情况下,绿色的 box 完全没有机会响应 pointer 事件。但是如果把蓝色的 box  ignore 掉,绿色的 box 就可以响应 pointer 事件了。

Stack(
    children: [
      Positioned(
        left: 0,
        top: 0,
        child: Listener(
            onPointerDown: (event) => print('green click'),
            child: Container(
              width: 100,
              height: 100,
              color: Colors.green,
            )),
      ),
      Positioned(
          left: 0,
          top: 0,
          child: IgnorePointer(
              child: Listener(
                  onPointerDown: (event) => print('blue click'),
                  child: Container(
                    width: 150,
                    height: 150,
                    color: Color.fromRGBO(0, 0, 255, .3),
                  ))))
    ],
  )
复制代码

原理在 listener 一文中已经说过了。多 child 的时候,会从后向前判断,后面的 child 测试通过,就不会再判断前面的 chid。加上 IgnorePointer 导致测试不通过,所以就会判断前面的 child 了。

AbsorbPointer 应用场景

不响应 pointer 事件

Listener(
    onPointerDown: (event) {
      print('parent down');
    },
    child: AbsorbPointer(
        child: ElevatedButton(
          child: Text('IAM17'),
          onPressed: () {
            print('child down');
          },
        )),
  )
复制代码

同样的例子,但换成 AbsorbPointer,ElevatedButton 不响应事件,Listener 可以响应事件。

目录
相关文章
|
前端开发 机器人 数据安全/隐私保护
Flutter笔记:手写并发布一个人机滑动验证码插件
写 Flutter 项目时,遇到需要滑块验证码功能。滑块验证码属于人机验证码的一种,看起来像是在一个图片中“挖去”了一块,然后通过用户手动操作滑块,让被“挖去”的部分移回来。由于我不想使用各种第三方模块,因此决定自己实现一个初版以后慢慢添砖加瓦。本文是对第一个版本的一点记录。
531 1
Flutter笔记:手写并发布一个人机滑动验证码插件
|
存储 缓存 开发工具
AppsFlyer 研究(五)延迟深度链接&客户端获取归因数据
AppsFlyer 研究(五)延迟深度链接&客户端获取归因数据
1117 0
Flutter-解决Try catch出现异常:type ‘_TypeError‘ is not a subtype of type ‘Exception‘ in type cast
Flutter-解决Try catch出现异常:type ‘_TypeError‘ is not a subtype of type ‘Exception‘ in type cast
293 1
|
4月前
|
API Android开发 iOS开发
除了permission_handler插件,还有哪些方法可以实现Flutter动态申请权限?
除了permission_handler插件,还有哪些方法可以实现Flutter动态申请权限?
280 68
|
12月前
|
存储 大数据 测试技术
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
在大数据环境中,数据存储格式直接影响查询性能和成本。本文探讨了 Parquet、Avro 和 ORC 三种格式在 Google Cloud Platform (GCP) 上的表现。Parquet 和 ORC 作为列式存储格式,在压缩和读取效率方面表现优异,尤其适合分析工作负载;Avro 则适用于需要快速写入和架构演化的场景。通过对不同查询类型(如 SELECT、过滤、聚合和联接)的基准测试,本文提供了在各种使用案例中选择最优存储格式的建议。研究结果显示,Parquet 和 ORC 在读取密集型任务中更高效,而 Avro 更适合写入密集型任务。正确选择存储格式有助于显著降低成本并提升查询性能。
1179 1
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
|
定位技术 图形学
【Unity实战】零代码实现物理2d绳子和绳桥效果——Hinge Joint 2D的使用
【Unity实战】零代码实现物理2d绳子和绳桥效果——Hinge Joint 2D的使用
1178 0
|
安全 Linux Shell
不死马的利用与克制(基于条件竞争)及变种不死马
不死马的利用与克制(基于条件竞争)及变种不死马
452 0
不死马的利用与克制(基于条件竞争)及变种不死马
|
存储 关系型数据库 MySQL
MySQL分区的优缺点
数据库中分区是将表或索引的数据划分成更小、更可管理的部分的一种技术。这些部分被称为分区,每个分区可以独立地进行维护和管理。
753 0
|
iOS开发
Flutter中好用的Widget-CupertinoPicker
Flutter中好用的Widget-CupertinoPicker CupertinoPicker是Flutter框架中的一个非常实用且美观的Widget,它可以让用户从一个预设的列表中选择一个或多个值。在iOS设计风格的应用程序中,CupertinoPicker非常常见。
518 0
|
编解码 Dart 安全
Flutter 环境搭建 与 Android 应用的调试
本文介绍 Flutter 环境搭建 与 Android 应用的调试
768 0
Flutter 环境搭建 与 Android 应用的调试