flutter - 如何使 GestureDetector 捕获堆栈内的点击?

标签 flutter

我正在尝试使 GestureDetector 在堆栈中工作,堆栈顶部有一个容器,但从未调用 onTap 回调。

如您所见,即使使用 HitTestBehavior.translucent 也不起作用

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Stack(
          children: <Widget>[
            GestureDetector(
              behavior: HitTestBehavior.translucent,
              onTap: () {
                print('tap');
              },
              child: Container(color: Colors.blue),
            ),
            Container(color: Colors.white),
          ],
        ),
      ),
    );
  }

我知道我想在另一个小部件下方捕获点击事件可能很奇怪,但在我的真实情况下,顶部的小部件是透明的,有时具有渐变。

最佳答案

好的,我想我自己找到了解决方案。我希望有一个更简单的解决方案,但它对我有用。我遇到的问题是 Stack 小部件不会将 HitTest 传递给所有 child ,而只会将 HitTest 传递给第一个被命中的 child 。我所做的是重写了 Stack 的 RenderBox 使用的命中检测算法。我真的不打算走这么远,我仍在等待更好的答案。这是我的代码,使用风险自负:

class CustomStack extends Stack {
  CustomStack({children}) : super(children: children);

  @override
  CustomRenderStack createRenderObject(BuildContext context) {
    return CustomRenderStack(
      alignment: alignment,
      textDirection: textDirection ?? Directionality.of(context),
      fit: fit,
      overflow: overflow,
    );
  }
}

class CustomRenderStack extends RenderStack {
  CustomRenderStack({alignment, textDirection, fit, overflow})
      : super(
            alignment: alignment,
            textDirection: textDirection,
            fit: fit,
            overflow: overflow);

  @override
  bool hitTestChildren(BoxHitTestResult result, {Offset position}) {
    var stackHit = false;

    final children = getChildrenAsList();

    for (var child in children) {
      final StackParentData childParentData = child.parentData;

      final childHit = result.addWithPaintOffset(
        offset: childParentData.offset,
        position: position,
        hitTest: (BoxHitTestResult result, Offset transformed) {
          assert(transformed == position - childParentData.offset);
          return child.hitTest(result, position: transformed);
        },
      );

      if (childHit) stackHit = true;
    }

    return stackHit;
  }
}

关于flutter - 如何使 GestureDetector 捕获堆栈内的点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57466767/

相关文章:

Flutter 给出意外字符 : Undefined location error while working with graphql

widget - Flutter:如何制作首发 App 指南?

android - 配置根项目 'imagepicker'时发生问题:找不到SDK

flutter - flutter声音流如何表示pcm数据?

Flutter 去除边框扩展磁贴

Flutter 返工问题 : Issue sharing states between widget with button and widget with countdown timer

firebase - 使用 Firebase 托管时 Web 应用程序中的灰色区域

json - 如何在 Flutter 的 POST 请求中将 Map 作为 String 发送?

flutter - Flutter重用自定义小部件

Flutter - 如何从父级调用子级小部件的方法