Flutter InkWell和手势检测器,如何让它们工作?
我想使用一个GestureDetector作为它的onTapDown回调,但也有一个不错的墨水池飞溅效果Flutter InkWell和手势检测器,如何让它们工作?,flutter,Flutter,我想使用一个GestureDetector作为它的onTapDown回调,但也有一个不错的墨水池飞溅效果 可以同时使用这两个函数吗?如果希望无条件地处理指针下降事件,则可以将InkWell设置为侦听器的子对象,并设置onPointerDown处理程序 例如: new Listener( onPointerDown: (e) { print('onPointerDown'); }, child: new InkWell( child: new Text('Tap me'),
可以同时使用这两个函数吗?如果希望无条件地处理指针下降事件,则可以将InkWell设置为侦听器的子对象,并设置onPointerDown处理程序 例如:
new Listener(
onPointerDown: (e) { print('onPointerDown'); },
child: new InkWell(
child: new Text('Tap me'),
onTap: () { print('onTap'); }
),
),
将onTapDown处理程序添加到InkWell可能是有意义的。您可以通过将值设置为“半透明”来传递给GestureDetector
,使其成为“非阻塞”
或者您也可以使用
材质自己触发。of(context)
InkWell在其引擎盖下使用手势检测器:
如果InkWell小部件工作正常,则GestureDetector无法正常工作的原因是它将其内部GestureDetector上的行为设置为“HitTestBehavior.不透明”。这可以防止在父窗口小部件上捕获“事件冒泡”/(如果我的理解正确的话)。因为“行为”是最终的,我们不能自己改变/修复它
正如我在上面的评论中提到的,我将InkWell封装在一个小部件(它也处理其他东西)中,并提供了一种将回调传递给它的方法,该回调将在所需事件上执行
这是我的示例解决方案:
import 'package:flutter/material.dart';
class CardPreview extends StatefulWidget {
final dynamic data;
final VoidCallback onTap;
const CardPreview(this.data, this.onTap);
CardPreview._(this.data, this.onTap);
factory CardPreview.fromData(dynamic data, VoidCallback onTap) {
return new CardPreview(data, onTap);
}
CardPreview createState() => new CardPreview(this.data, this.onTap);
}
class CardPreviewState extends State<CardPreview> {
final dynamic data;
final VoidCallback onTap;
CardPreviewState(this.data, this.onTap);
Widget buildCard() {
return Material(
color: Colors.transparent,
child: Ink(
child: InkWell(
child: null,
onTap: () {
if (this.onTap == null) {
return;
}
this.onTap();
},
),
),
);
}
@override
Widget build(BuildContext context) {
return Container(
child: buildCard(),
);
}
}
导入“包装:颤振/材料.省道”;
类CardPreview扩展StatefulWidget{
最终动态数据;
最终确认为onTap;
const CardPreview(this.data,this.onTap);
CardPreview.\u(this.data,this.onTap);
factory CardPreview.fromData(动态数据,VoidCallback onTap){
返回新卡片预览(数据,onTap);
}
CardPreview createState()=>新的CardPreview(this.data,this.onTap);
}
类CardPreviewState扩展状态{
最终动态数据;
最终确认为onTap;
CardPreviewState(this.data,this.onTap);
Widget buildCard(){
退货(
颜色:颜色。透明,
孩子:墨水(
孩子:InkWell(
child:null,
onTap:(){
如果(this.onTap==null){
返回;
}
这个.onTap();
},
),
),
);
}
@凌驾
小部件构建(构建上下文){
返回容器(
子项:buildCard(),
);
}
}
我知道我参加聚会有点晚,但我也遇到了同样的问题。我最终直接使用了InkWell小部件。在引擎盖下,它还返回一个手势检测器。在我的小部件中,我创建了一个接受VoidCallback onTap的构造函数。在InkWell onTap事件中,我只调用提供的回调。