我们正在构建一个包含 2 个容器的页面,一个是覆盖整个屏幕的大容器,另一个是在大容器内的小容器。当用户触摸小容器内部并移动手指时,它应该平移小容器。当他们从小容器中滑出时,它应该移动大容器(就像 Tinder 中的卡片)。

问题是,大容器总是在小容器获得平移事件之前获得滑动事件。

有没有办法消耗手势事件,以便它们不会发送到其他组件?

我看到了关于 GestureArena 的文档,但我没有找到任何关于它如何工作的例子。有没有办法强制一个组件总是赢得竞技场(或总是输掉它)?

编辑 :为了清楚起见重新表述。

最佳答案

问题如下:onHorizontalDragonVerticalDrag 手势总是在 onPan 之前,并且会阻止 onPan 被调用(即使监听 GestureDetector 事件的 onHorizontalDrag 落后于监听 onPan 事件的那个)。
向小容器上的 onHorizontalDrag 添加任何监听器(甚至只是 onHorizontalDragCancel )将使小容器获取并消耗事件(这意味着下面的大容器将不会收到它)。

为了解决我的问题,我用 onPanUpdateonHorizontalDragUpdate 替换了 onVerticalDragUpdate 监听器(对于 onPanStartonPanEnd 也是如此)。它不如使用 onPan 好,因为您只能获得垂直或水平事件的 DragUpdateDetails(我必须添加更多逻辑来补偿这一点),但它可以防止底层 GestureDetector 劫持 onPan 事件。

关于flutter - 在 flutter 的同一页面上有 2 个手势检测器具有相同的手势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50764553/

10-12 14:34