当前位置:网站首页>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方法,让父手势识别器继续工作。
边栏推荐
- 密码学系列之:PEM和PKCS7,PKCS8,PKCS12
- 【8.1】代码源 - 【第二大数字和】【石子游戏 III】【平衡二叉树】
- The production method of the powered small sailboat is simple, the production method of the electric small sailboat
- 为什么刚考完PMP,就开始准备软考了?
- Develop your own node package
- How to wrap markdown - md file
- AUTOCAD——标注关联
- 【8.4】代码源 - 【数学】【历法】【删库】【不朴素的数列(Bonus)】
- Machine Learning Overview
- 七夕节赚徽章拉
猜你喜欢
随机推荐
一篇博客通关Redis技术栈
How to identify false evidence and evidence?
Develop your own node package
基于Web的商城后台管理系统的设计与实现
什么是ASEMI光伏二极管,光伏二极管的作用
How to deal with DNS hijacking?
【8.3】代码源 - 【喵 ~ 喵 ~ 喵~】【树】【与】
[BSidesCF 2019] Kookie
Day019 方法重写与相关类的介绍
JeeSite新建报表
There are a lot of 4T hard drives remaining, prompting "No space left on device" insufficient disk space
Qixi Festival earn badges
工业级远距离无线传输装置的功能有哪些?
[8.2] Code Source - [Currency System] [Coins] [New Year's Questions (Data Enhanced Edition)] [Three Stages]
【背包九讲——01背包问题】
[MRCTF2020] Ezpop (detailed)
七夕节赚徽章拉
bytebuffer use demo
C language - vernacular to understand the original code, inverse code and complement code
[Surveying] Quick Summary - Excerpt from Gaoshu Gang







