当前位置:网站首页>Flutter 父子组件如何都能收到点击事件
Flutter 父子组件如何都能收到点击事件
2022-08-05 04:50:00 【bawomingtian123】
在实际项目中,在使用点击事件时,由于需求设计问题,需要子组件和父组件都能收到onTap回调,故会出现类似下面demo中的源码。

按照Flutter 点击事件的设计思路,这样的源码肯定是满足不了需求,在点击组件时,只有子组件会有回调打印,父组件是没有回调的。
那父组件怎么样才能也收到长按事件呢。我们按照以下修改可以满足需求
/// Created by wuliquan on 19.7.22.
/// 测试页面
class SecondPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return SecondPageState();
}
}
class SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
return Center(
child: RawGestureDetector(
gestures: {
AllowMultipleGestureRecognizer: GestureRecognizerFactoryWithHandlers<AllowMultipleGestureRecognizer>(
() => AllowMultipleGestureRecognizer(),
(AllowMultipleGestureRecognizer instance) {
instance.onTap = () => print('tap on parent ');
},
)
},
//Parent Container
child: Container(
width: 100,
height: 100,
color: Colors.blue,
alignment: Alignment.center,
child: GestureDetector(
onLongPress: () {
print('tap on child');
},
child: Container(
width: 50,
height: 50,
color: Colors.orange,
),
),
)),
);
}
}
class AllowMultipleGestureRecognizer extends TapGestureRecognizer {
@override
void rejectGesture(int pointer) {
acceptGesture(pointer);
}
}
使用RawGestureDetector包裹手势识别器AllowMultipleGestureRecognizer
AllowMultipleGestureRecognizer是我们继承TapGestureRecognizer 复写了rejectGesture方法
@override
void rejectGesture(int pointer) {
acceptGesture(pointer);
}重点:
这个方法在手势识别器在手势竞技场竞争失败后,我们手动处理,让它可以继续处理手势,从而我们父组件也能收到回调打印日志
这里简单说明下手势竞技的规则,在分配手势时按照深度优先的策略进行,这里由于我们只是注册了最简单的onTap回调,在底层上报up事件时,会直接返回命中测试组件列表中最后的那个组件,也就是深度最深的那个组件,也就是子组件。
以上面例子说明,在竞技场宣布子组件获胜后,会通知父组件的rejectGesture。由于我们复写了rejectGesture方法,让父手势识别器继续工作。
边栏推荐
- 作业8.4 进程间的通信 管道与信号
- App rapid development and construction experience: the importance of small programs + custom plug-ins
- Application status of digital twin technology in power system
- Cron(Crontab)--use/tutorial/example
- NPDP证书含金量高吗?跟PMP相比?
- LeetCode:1403. 非递增顺序的最小子序列【贪心】
- JeeSite新建报表
- how to measure distance from point to face in creo
- 仪表板展示 | DataEase看中国:数据呈现中国资本市场
- bytebuffer use demo
猜你喜欢
随机推荐
[BSidesCF 2019]Kookie
Paparazzi: Surface Editing by way of Multi-View Image Processing
u-boot调试定位手段
Use IDEA to connect to TDengine server
【8.4】代码源 - 【数学】【历法】【删库】【不朴素的数列(Bonus)】
特征预处理
In the WebView page of the UI automation test App, the processing method when the search bar has no search button
开发属于自己的node包
【informix】解决启动报错大全,以及解决办法
What is the function of industrial-grade remote wireless transmission device?
二叉树基本性质+oj题解析
延迟加载js方式async与defer区别
将故事写成我们
AUTOCAD——标注关联
【8.1】代码源 - 【第二大数字和】【石子游戏 III】【平衡二叉树】
Mysql的undo log详解
token, jwt, oauth2, session parsing
概率论的学习和整理8: 几何分布和超几何分布
[8.2] Code Source - [Currency System] [Coins] [New Year's Questions (Data Enhanced Edition)] [Three Stages]
bytebuffer use demo

![[BJDCTF2020] EasySearch](/img/60/464de3bcdda876171b9f61ad31bff1.png)






![[MRCTF2020]PYWebsite](/img/d4/57e8e5ee45b742894679f3f5671516.png)
![[SWPU2019]Web1](/img/06/36e69a2d7d5475a6749a7d81edf50f.png)