Flutter 使用手势检测器捕捉MaterialButton儿童的手势

Flutter 使用手势检测器捕捉MaterialButton儿童的手势,flutter,gesturedetector,Flutter,Gesturedetector,我想要一个MaterialButton来检测onTapDown、onTapUp和onTapCancel 不幸的是,MaterialButtons只检测到onPressed。所以我用一个手势检测器包装了它,但是对于MaterialButtons,onPressed是@required,所以我将它设置为(){}。 问题是,即使我将GestureDetector行为设置为半透明,如果我点击按钮,只会触发按钮的onPressed回调,并且松开GestureDetector的onTapDown和onTap

我想要一个MaterialButton来检测onTapDown、onTapUp和onTapCancel

不幸的是,MaterialButtons只检测到onPressed。所以我用一个手势检测器包装了它,但是对于MaterialButtons,onPressed是@required,所以我将它设置为(){}。 问题是,即使我将GestureDetector行为设置为半透明,如果我点击按钮,只会触发按钮的onPressed回调,并且松开GestureDetector的onTapDown和onTapUp回调。我只会在长按按钮时触发onTapDown,当我松开它时,onTapCancel被触发。我永远无法用这种方式触发onTapUp

我仍然想要MaterialButton的触觉/声音/视觉反馈功能

我试着根本不在MaterialButton上设置on按钮,奇怪的是,它仍然工作,但按钮被禁用,根本没有给出任何反馈

手势检测器(
行为:HitTestBehavior.transparent,
onTapDown:(){
th.handleTap(i,0);
},
onTapUp:(){
th.handleTap(i,1);
},
onTapCancel:(){
th.handleTap(i,2);
},
子:材质按钮(
按下:(){},
子:容器(
保证金:所有(5),
子:图标(图标),
),
)
)
编辑: 谢谢雨果·帕索斯,出于某种原因,我认为材料按钮永远不会向他们的孩子传递手势。我快到了,但我还是不在那里: 我找到的唯一匹配手势大小的方法是在两个容器之间“sandwitch”,这对我来说并不是一个非常优雅的解决方案。顺便说一下,即使在这种情况下,我也遇到了两个问题:

1:如果我(很容易)点击按钮的边框,我仍然会触发MaterialButton的on Pressed,而不是GestureDetector的回调。我认为它的尺寸是零,所以它永远不会被点击。如果我将GestureDetector行为设置为不透明(对我来说仍然很奇怪),则不会显示此问题

2:最重要的:我仍然无法获得原生材质按钮反馈功能,除非我意外触发其ON按下

容器(
保证金:所有(2),
宽度:按钮化,
高度:钮扣,
孩子:升起按钮(
填充:EdgeInsets.zero,
onPressed:(){print(“onTap”);},
子:容器(
边距:EdgeInsets.zero,
宽度:按钮化,
高度:钮扣,
儿童:手势检测器(
onTapDown:(){
th.handleTap(i,0);
},
onTapUp:(){
th.handleTap(i,1);
},
onTapCancel:(){
th.handleTap(i,2);
},
子:图标(图标)
),
),
),
);

您必须执行相反的操作。不要在
gesturedtector
中包装
RaisedButton
,而是在
RaisedButton
中包装
gesturedtector
。您还必须删除
raised按钮
填充,以便扩展
手势检测器
动作区域

RaisedButton(
填充:EdgeInsets.zero,
按下:(){},
子:容器(
身高:40,
宽度:80,
儿童:手势检测器(
onTapDown:()=>打印('onTapDown'),
onTapUp:()=>打印('onTapUp'),
onTapCancel:()=>打印('onTapCancel'),
子:图标(图标),
),
),
),
编辑
中心(
孩子:升起按钮(
填充:EdgeInsets.zero,
onPressed:()=>打印('onPressed'),
儿童:手势检测器(
onTapDown:()=>打印('onTapDown'),
onTapUp:()=>打印('onTapUp'),
onTapCancel:()=>打印('onTapCancel'),
子:容器(
颜色:颜色,蓝色,
身高:40,
宽度:80,
子:图标(图标),
),
),
),
);
不过,您将得到一个调用onPressed
的小边框。如果这让您感到困扰,请将此代码包装到另一个
容器中,就像您在代码中所做的那样

通过调用
onTapUp
上的
onPressButton
方法,您可以轻松获得本机的
RaisedButton
反馈功能。它也会有同样的行为

RaisedButton(
...
ON按下:ON按下按钮,
儿童:手势检测器(
...
onTapUp:(){
按按钮();
打印('onTapUp')
},
...
),
),

谢谢你,雨果,我还是有问题。我编辑了我的问题仍然不起作用:onPressButton被调用,但我没有收到按钮反馈。我不知道你所说的按钮反馈是什么意思。一个按钮所能提供的唯一反馈是按下
on
,对吗?如果调用了
onPressButton
,您怎么没有收到按钮反馈?很抱歉,延迟了。我指的是UI反馈,比如按钮上的声音、振动和飞溅效果。对于上一个解决方案,从回调的角度来看,一切都正常工作,但我的按钮没有提供任何视觉反馈,它们只是灰色的工作方块。