Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter InkWell和手势检测器,如何让它们工作?_Flutter - Fatal编程技术网

Flutter InkWell和手势检测器,如何让它们工作?

Flutter InkWell和手势检测器,如何让它们工作?,flutter,Flutter,我想使用一个GestureDetector作为它的onTapDown回调,但也有一个不错的墨水池飞溅效果 可以同时使用这两个函数吗?如果希望无条件地处理指针下降事件,则可以将InkWell设置为侦听器的子对象,并设置onPointerDown处理程序 例如: new Listener( onPointerDown: (e) { print('onPointerDown'); }, child: new InkWell( child: new Text('Tap me'),

我想使用一个GestureDetector作为它的onTapDown回调,但也有一个不错的墨水池飞溅效果


可以同时使用这两个函数吗?

如果希望无条件地处理指针下降事件,则可以将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事件中,我只调用提供的回调。