Flutter 颤振手势检测器onTap仅在文本子对象上激发

Flutter 颤振手势检测器onTap仅在文本子对象上激发,flutter,gesturedetector,Flutter,Gesturedetector,我正在制作一个小部件,它的根是一个手势检测器,它的子元素是一个列,然后它有多个不同的子元素视图,其中一些是文本字段,但是手势检测器只有在我按下文本字段时才会启动,尽管视图占据了颤振检测器的全屏。这是我的构建方法 @override Widget build(BuildContext context) { return GestureDetector( onTap: (){ print("tap");

我正在制作一个小部件,它的根是一个手势检测器,它的子元素是一个列,然后它有多个不同的子元素视图,其中一些是文本字段,但是手势检测器只有在我按下文本字段时才会启动,尽管视图占据了颤振检测器的全屏。这是我的构建方法

      @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTap: (){
            print("tap");
            function(context);
          },
          child: Column(
            children: <Widget>[
              Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: buildTopDivider(),
              ),
              Container(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Row(
                    children: <Widget>[
                      Expanded(
                        child: Padding(
                          padding: const EdgeInsets.only(right: 8.0),
                          child: Column(
                            children: buildTextFields(),
                          ),
                        ),
                      ),
                      Column(
                        children: buildIconContainer(),
                      ),
                    ],
                  ),
                ),
              ),
              Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: buildBottomDivider(),
              )
            ],
          ),
        );
      }
@覆盖
小部件构建(构建上下文){
返回手势检测器(
onTap:(){
打印(“tap”);
功能(语境);
},
子:列(
儿童:[
纵队(
crossAxisAlignment:crossAxisAlignment.stretch,
子项:buildTopDivider(),
),
容器(
孩子:填充(
填充:常数边集全部(8.0),
孩子:排(
儿童:[
扩大(
孩子:填充(
填充:仅限常量边集(右:8.0),
子:列(
子项:buildTextFields(),
),
),
),
纵队(
子项:buildIconContainer(),
),
],
),
),
),
纵队(
crossAxisAlignment:crossAxisAlignment.stretch,
子项:buildBottomDivider(),
)
],
),
);
}
附加的是一个屏幕截图,显示手势检测器占据了整个视图,这有点编辑过,但显示了问题,所以我想能够在这个项目上的任何地方按下,并获得onPress方法启动,但目前如前所述,它只会在我按下其中一个文本视图时启动,这看起来很奇怪,有什么想法吗


使用此代码
手势检测器。onTap
可在红色区域的任何位置工作,但
文本字段除外:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'foo text',
            ),
            GestureDetector(
//              behavior: HitTestBehavior.translucent,
              onTap: () {
                print("tap");
//                  function(context);
              },
              child: Column(
                children: <Widget>[
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
//                      children: buildTopDivider(),
                  ),
                  Container(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Row(
                        children: <Widget>[
                          Expanded(
                            child: Container(
                              color: Colors.red,
                              padding: const EdgeInsets.only(right: 8.0),
                              child: Column(
//                                  children: buildTextFields(),
                                children: [
                                  Text('foo bar baz'),
                                  TextField(onTap: () => print('TextField tapped'),),
                                  Text('foo bar baz'),
                                ],
                              ),
                            ),
                          ),
                          Column(
//                              children: buildIconContainer(),
                              ),
                        ],
                      ),
                    ),
                  ),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
//                      children: buildBottomDivider(),
                  )
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“foo text”,
),
手势检测器(
//行为:HitTestBehavior.transparent,
onTap:(){
打印(“tap”);
//功能(语境);
},
子:列(
儿童:[
纵队(
crossAxisAlignment:crossAxisAlignment.stretch,
//子项:buildTopDivider(),
),
容器(
孩子:填充(
填充:常数边集全部(8.0),
孩子:排(
儿童:[
扩大(
子:容器(
颜色:颜色,红色,
填充:仅限常量边集(右:8.0),
子:列(
//子项:buildTextFields(),
儿童:[
文本(“foo-bar-baz”),
TextField(onTap:()=>打印('TextField tapped'),),
文本(“foo-bar-baz”),
],
),
),
),
纵队(
//子项:buildIconContainer(),
),
],
),
),
),
纵队(
crossAxisAlignment:crossAxisAlignment.stretch,
//子项:buildBottomDivider(),
)
],
),
)
],
),
),
);
}
}

您的代码调用问题中未包含的函数,因此很难判断实际发生了什么。

使用InkWell而不是GestureDetector解决了问题。onTap在列表项中的所有位置都激发。它还为点击操作提供反馈。

将行为属性添加到手势检测器。它将使整个容器可点击

GestureDetector(
        behavior: HitTestBehavior.opaque,
        child:...
)

只需向容器小部件添加颜色:颜色。透明,这很有趣,我尝试了同样的方法,但它不起作用,函数只返回小部件,但是只要添加背景颜色,如果您在
行为:HitTestBehavior.transparent中进行注释,它就会起作用,
那么它应该在没有容器颜色的情况下工作,或者您可以使用
颜色。透明