在实际开发中,我们通常需要实现某个组件的更多点击事件。比如:原生的RaisedButton组件是无法响应诸如拖拽或是按下、抬起等细化的动作,它只有一个onPressed()方法来表示。当我们想实现这些细化事件时,通常使用的组件是GestureDetector。

我们先来看下面这段代码:

GestureDetector(
onTap: () {
debugPrint("RaisedButton点击阻断");
},
child: RaisedButton(
child: Text("点我试试"),
onPressed: () {
debugPrint("我被点击了");
})
)

各位觉得这端代码的运行结果,当RaisedButton被点击时,控制台将如何输出呢?

再看下面这段代码:

GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
debugPrint("RaisedButton点击阻断");
},
child: RaisedButton(
child: Text("点我试试"),
onPressed: () {
debugPrint("我被点击了");
})
)

和上面的问题一样,当RaisedButton被点击时,控制台将输出什么内容呢?

答案无一例外地,都输出:

我被点击了

可以看到,单纯地使用GestureDetector并不能将子组件的点击事件阻断,即使添加了behavior,也无能为力。

所以,我们得到结论:当子组件可响应点击事件时,GestureDetector是不能阻断子组件响应点击事件的

那么,如果我们想阻断子组件对点击事件的响应,该怎么办呢?

正确的做法是:使用AbsorbPointer组件

我们来看下面这段代码:

AbsorbPointer(
child: RaisedButton(
child: Text("点我试试"),
onPressed: () {
debugPrint("我被点击了");
})
)

再次点击RaisedButton,控制台将不输出任何内容。

那么?如何让GestureDetector可以作用在RaisedButton上呢?很简单,只需要将RaisedButton变为不可响应点击事件就可以了,其他控件同理。实现代码如下:

GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
debugPrint("RaisedButton点击阻断");
},
child: AbsorbPointer(
child: RaisedButton(
child: Text("点我试试"),
onPressed: () {
debugPrint("我被点击了");
}
)
)
)

再次点击RaisedButton,控制台将输出:

RaisedButton点击阻断

当然,如此一来,原有的按钮点击动画也会失效。

Flutter 中 GestureDetector 的使用误区的更多相关文章

  1. 在Flutter中嵌入Native组件的正确姿势是...

    引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...

  2. Flutter中的日期、格式化日期、日期选择器组件

    Flutter中的日期和时间戳 //獲取當前日期 DateTime _nowDate = DateTime.now(); print(_nowDate);//2019-10-29 10:57:20.3 ...

  3. Flutter 中的表单

    一.Flutter 常用表单介绍   Flutter 中常见的表单有 TextField 单行文本框,TextField 多行文本框.CheckBox.Radio.Switch  CheckboxLi ...

  4. Flutter中的绘图(Canvas&CustomPaint)API

    本文是Flutter中Canvas和CustomPaint API的使用实例. 首先看一下我们要实现的效果: 结合动图演示,列出最终目标如下: 在程序运行后,显示一个小球: 每次程序启动后,小球的样式 ...

  5. SQL Server AlwaysOn中的几个误区

    原文:SQL Server AlwaysOn中的几个误区 AlwaysOn自SQL Server2012之后已经发布很久了,最近我在给一些客户做咨询的时候经常被问起是不是应该使用AlwaysOn,从客 ...

  6. 从零学习Fluter(五):Flutter中手势滑动拖动已经网络请求

    从六号开始搞Flutter,到今天写这篇blog已经过了4天时间,文档初步浏览了一遍,写下了这个demo.demo源码分享在github上,现在对flutter有种说不出的喜欢了.大家一起搞吧! 废话 ...

  7. Flutter 中 JSON 解析

    本文介绍一下Flutter中如何进行json数据的解析.在移动端开发中,请求服务端返回json数据并解析是一个很常见的使用场景.Android原生开发中,有GsonFormat这样的神器,一键生成Ja ...

  8. mvp 在 flutter 中的应用

    在 Android 应用程序开发过程中,我们经常会用到一些所谓的架构方法,如:mvp,mvvm,clean等.之所以这些方法会被推崇是因为他们可以大大的解耦我们的代码的功能模块,让我们的代码在项目中后 ...

  9. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...

随机推荐

  1. ASHRAE KAGGLE大能源预测(前三名方案总结+相关知识点讲解+python实现)

    @ 目录 1 概述 2 处理思想学习 2.1 移除异常值 2.2 缺失值 2.3 目标函数 2.4 特征工程 2.4.1 Savitzky-Golay filter 2.4.2 Bayesian ta ...

  2. 浅谈JQuery

    一.什么是JQuery? JQuery是第三方开发的执行DOM操作的极简化的函数库. 执行DOM操作:JQuery还是在执行DOM操作 1.学习JQuery还是在学习DOM 2.五件事:增删改查 事件 ...

  3. django安装及其他模块导入

    django安装 python项目第三方模块配置 pip3 list------查看当前pip安装的第三方模块

  4. 使用Xtrabackup进行MySQL备份 zz

    zz from  http://www.magedu.com/ 一.安装 1.简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对i ...

  5. Hbase-二级索引 Hbase+Hbase-indexer+solr (CDH)

    最近一段时间工作涉及到hbase sql查询和可视化展示的工作,hbase作为列存储,数据单一为二进制数组,本身就不擅长sql查询:而且有hive来作为补充作为sql查询和存储,但是皮皮虾需要低延迟的 ...

  6. 解决el-tree横向滚动条问题

    代码如下 效果如图 仅做下记录,不做过多解释

  7. Java方法的定义以及调用、方法重载、可变参数以及递归

    目录 何谓方法 方法的定义及调用 方法的定义 方法调用 方法重载 命令行传参 可变参数 递归 何谓方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于 ...

  8. 想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第六篇文章,这篇文章会介绍一个免费的spark平台,我们可以基于这个平台做一些学习实验. databricks 今天要 ...

  9. es6的数组操作

    //foreach 迭代 var arr = [1, 2, 3]; var sum = 0; arr.forEach(function(value, index, array) { console.l ...

  10. 0511Object类和异常

    Object类和异常 [要点] toString方法:将类中要打印的信息转换为自定义格式的打印内容 [返回的是当前对象对应的完整包名.类名@当前对象在内存空间首地址(十六进制)] equals方法 p ...