Flutter中GestureDetector和InkWell的区别

问题发现

我们先从一个敲代码时候的一个现象开始谈起:

这部分的代码如下:

dart 复制代码
body: GestureDetector(  
	onTap: () {  
	//设置点击事件  
	},  
child: Container(  
	//定义container组件
),  
),

这是我简化后的代码,Container组件包裹的是图中红色框包起来的部分,但是很奇怪的是,点击图中绿色框包起来的部分,完全不会触发GestuerDetector的点击事件。 但是,如果我们给Container设置一个背景底色,透明底色都行,再次点击绿色框包起来的部分,就能触发GestuerDetector的点击事件了

dart 复制代码
body: GestureDetector(  
	onTap: () {  
	//设置点击事件  
	},  
child: Container(  
color:Colors.transparent,
	//定义container组件
),  
),

或者将GestureDetector改为InkWell,同样点击图中绿色框包起来的部分,也能触发点击事件

dart 复制代码
body: InkWell(  
	onTap: () {  
	//设置点击事件  
	},  
child: Container(  
	//定义container组件
),  
),

问题总结

在搜索之后发现问题出在Container组件中:

命中测试(Hit Test)

当Flutter框架进行命中测试以确定触摸事件的位置时,它需要一个实际的渲染对象来"击中"。如果Container没有设置颜色或其他装饰(如边框),且没有子部件,它实际上不会在渲染树中创建任何渲染盒子。因此,它就好像在视觉上"不存在"一样,无法响应触摸事件。

那为什么InkWell能响应未定义颜色的Container组件呢?

因为InkWell是专为Material Design应用设计的。它通常用于Material组件上,这意味着它预期会被放置在一个Material小部件内部。
Material本身在渲染树中提供了一个实体。因此,InkWell继承了其父级Material的大小和属性。

最后我们总结一下
GestureDetector和InkWell的区别
GestureDetector

  1. GestureDetector是一个非常通用的事件监听包装器,它可以用来检测各种类型的手势,如点击、双击、长按、拖动、缩放等
  2. GestureDetector不提供任何默认的视觉反馈(如波纹效果),它仅用于检测和响应各种手势。
  3. 如果GestureDetector包裹的子部件没有明确的大小(如宽度和高度),或者不占据任何实际的空间(如一个没有颜色或内容的Container),那么GestureDetector就无法正确地检测到手势

InkWell

  1. InkWell在用户触摸时显示波纹效果,这是Material Design的特性。即使InkWell本身没有设置颜色或大小,这个波纹效果也会在其父级Material组件的范围内展现。
  2. 相较于GestureDetectorInkWell通常只用于简单的点击事件。
相关推荐
benbenAItalk6 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885726 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12347 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易9 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周9 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师10 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9810 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan10 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡11 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒11 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端