Flutter onTap方法的容器

Ale*_*ard 16 user-interface button dart flutter

正在开发一个扑腾的应用程序,并从一些Firebase数据动态构建一些容器.我想知道是否有办法为容器(或任何不是按钮的小部件)获取onTap方法?

这是一个代码示例:

  child: new Container(

    //INSERT ONTAP OR ONPRESSED METHOD HERE

    margin: const EdgeInsets.symmetric(vertical: 10.0),
    child: new Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        new Container(
          margin: const EdgeInsets.only(right: 16.0),
          child: new GoogleUserCircleAvatar(snapshot.value['images'][0]),
        ),
        new Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children : [
            new Container(
              padding: const EdgeInsets.only(bottom: 8.0),
              child: new Text("${snapshot.value['name']}",
                style: new TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
             ),
            new Text("${snapshot.value['description']}",
              style: new TextStyle(
                color: Colors.grey[500],
              ),
            ),
          ]
        )
      ],
    ),
Run Code Online (Sandbox Code Playgroud)

Col*_*son 38

你可以把你包裹Container在一个InkWellGestureDetector.不同之处在于,它InkWell是一个材质小部件,显示接收到触摸的可视指示,而是GestureDetector一个更通用的小部件,不显示可视指示.

  • 另一个观察结果:InkWell 展开并覆盖所有容器区域来处理 ontap 事件而不是 GestureDector。 (2认同)

mah*_*mnj 13

包裹内部容器墨水瓶()窗口小部件可以解决这个问题,甚至 GestureDetector()作为

  InkWell(                        
        child: Container(...),                        
        onTap: () {                          
        print("tapped on container");
        },                      
     );
Run Code Online (Sandbox Code Playgroud)

使用手势检测器

GestureDetector(
  onTap: () { print("Container was tapped"); },
  child: Container(...),
)
Run Code Online (Sandbox Code Playgroud)

  • 我在使用 GestureDetector 时遇到了同样的问题。令人惊讶的是,通过添加容器的背景颜色解决了这个问题。 (2认同)
  • 对于Reza和Donatas,也许你需要设置GestureDetector的“行为”选项 (2认同)
  • 正如 BuffK 提到的,设置“behavior: HitTestBehavior.opaque”修复了空点击问题。`HitTestBehavior.translucent` 也解决了这个问题,不同之处在于底层小部件也会接收事件。 (2认同)

Cop*_*oad 12

截屏:

在此处输入图片说明


您不应该使用,GestureDetector因为它不会向您显示任何涟漪效应(这是 Material design 应用程序的核心部分),因此您可以使用InkWell,这是基本示例。

Widget _buildContainer() {
  return Material(
    color: Colors.blue,
    child: InkWell(
      onTap: () => print("Container pressed"), // handle your onTap here
      child: Container(height: 200, width: 200),
    ),
  );
}
Run Code Online (Sandbox Code Playgroud)


Afz*_*han 6

除了其他人在答案中所说的之外,如果您使用Cardinside InkWell,那么InkWell将隐藏 Android 上的涟漪效应 - 您可以看到它在后台发生,但在卡本身上看不到。

解决方案是InkWellCard.

return Card(
  child: InkWell(
    child: Row(
      // Row content
    ),
    onTap: () => {
      print("Card tapped.");
    },
  ),
  elevation: 2,
);
Run Code Online (Sandbox Code Playgroud)

这将帮助您获得涟漪效果并在 Android 上执行点击捕获。


jit*_*555 6

区别

InkWell 是一个材质小部件,它可以在收到触摸时向您显示波纹效果。

GestureDetector 更通用,不仅用于触摸,还用于其他手势。

在 Flutter 中,InkWell 是一个响应触摸动作的材质小部件。

InkWell(
    child: Container(......),
    onTap: () { 
        print("Click event on Container"); 
    },
);
Run Code Online (Sandbox Code Playgroud)

GestureDetector 是一个检测手势的小部件。

GestureDetector(
    onTap: () { 
        print("Click event on Container"); 
    },
    child: Container(.......),
)
Run Code Online (Sandbox Code Playgroud)