增加小部件的点击检测区域?

Abb*_*s.M 6 flutter

我想知道是否可以增加特定小部件的“点击区域”?

一个小例子是 50 x 50 按钮。如果用户点击这 50 x 50 像素上的任何位置,则按钮onPressed将被执行。但是,我可以这样做,以便如果用户单击按钮上方的 5 个像素,它onPressed仍然会被执行吗?

我只是想增加这个区域以提供更好的用户体验,而不必增加按钮的实际大小,这会使 UI 变得更糟。

Jan*_*Jan 16

我有点晚了,但是你有两个选择。

我面前的答案非常基本,只使用基本的容器,不会帮助你。

1)behavior: HitTestBehavior.translucent在您的手势检测器上使用,这将允许点击不可见的东西。但是,您想要的不仅仅是您设置为可点击的区域,因此请转到选项 2。

2) 使用一个不可见的堆栈。在按钮上方堆叠一个容器,使其不可见,在其上添加手势检测,使用正确的 HitTestBehaviour,这应该可以正常工作。如果你的按钮是 50x50,把容器做成 55x55 并将它们堆叠在一起,问题就解决了。

  • 您能否提供一个有关如何创建您在答案中提到的不可见堆栈的示例? (3认同)

Zac*_*lez 8

对我来说,我有一个非常小的小部件,我想在 UI 方面保持较小的尺寸,但在 UX 方面,我希望有一个像样的触摸区域,以免让用户感到沮丧。为此我找到了一个简单的包

https://pub.dev/packages/expand_tap_area/install

将其添加到您的 pubspec.yaml 中

 expand_tap_area: ^1.1.0
Run Code Online (Sandbox Code Playgroud)

导入这个

import 'package:expand_tap_area/expand_tap_area.dart';
Run Code Online (Sandbox Code Playgroud)

只需使用小部件即可。tapPadding 允许您更改触摸区域。除此之外,其工作方式与 Gesture Dector 类似。

ExpandTapWidget(
  onTap: () {},
  tapPadding: EdgeInsets.all(25.0),
  child: smallWidget(),
),
Run Code Online (Sandbox Code Playgroud)


Umu*_*pat 7

您可以使用behavior: HitTestBehavior.translucenton来完成此操作GestureDetector

并为您的子小部件使用Padding小部件,然后您可以为额外的点击区域提供填充值。

 GestureDetector(
                  behavior: HitTestBehavior.translucent, // Needed for invisible things to be tapped.
                  onTap: () {
                    Navigator.pop(context);
                  },
                  child: Padding(
                    padding: EdgeInsets.all(9.0), // Configure hit area.
                    child: FaIcon(
                      FontAwesomeIcons.xmark,
                    ),
                  ),
                ),
Run Code Online (Sandbox Code Playgroud)


Doo*_*ave 4

您可以将您的内容包装RaisedButton到 a 中Container并添加一些填充到Container. 然后您可以将 包装Container到 a 中GestureDetector,这样可以对小部件启用多次单击事件。

还有GestureDetector一个回调,您可以使用它来执行与单击onTap真实值时相同的代码。RaisedButton

这是一个简单的代码示例:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text('Stackoverflow example'),
      ),

      body: Center(
        child: GestureDetector(
          child: Container(
            width: 120,
            height: 80,            

            padding: EdgeInsets.all(10),

            color: Colors.blueAccent,

            child: Center(
              child: RaisedButton(                
                child: Text('Click me'),
                onPressed: _fireButtonClick,
              ),
            )         
          ),
          onTap: _fireButtonClick
        ),
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

现在将RaisedButton onPressed代码提取到一个专用函数中,您可以将其分配给RaisedButton onPressedGestureDetector onTap回调:

void _fireButtonClick() {
  print('button clicked');
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助,杜比

  • 我很欣赏这种努力,但这需要按钮本身周围有额外的间距,这在我的情况下并不理想。这就是我现在正在做的事情,因为我的按钮被容器包裹着,我正在做一些非常相似的事情,但我试图找到一个更理想的解决方案,直接增加按钮的“hitbox” (6认同)