gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:30:32 29 4
gpt4 key购买 nike

我正在尝试使 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com