我们正在构建一个包含 2 个容器的页面,一个是覆盖整个屏幕的大容器,另一个是在大容器内的小容器。当用户触摸小容器内部并移动手指时,它应该平移小容器。当他们从小容器中滑出时,它应该移动大容器(就像 Tinder 中的卡片)。
问题是,大容器总是在小容器获得平移事件之前获得滑动事件。
有没有办法消耗手势事件,以便它们不会发送到其他组件?
我看到了关于 GestureArena 的文档,但我没有找到任何关于它如何工作的例子。有没有办法强制一个组件总是赢得竞技场(或总是输掉它)?
编辑 :为了清楚起见重新表述。
最佳答案
问题如下:onHorizontalDrag
和 onVerticalDrag
手势总是在 onPan
之前,并且会阻止 onPan
被调用(即使监听 GestureDetector
事件的 onHorizontalDrag
落后于监听 onPan
事件的那个)。
向小容器上的 onHorizontalDrag
添加任何监听器(甚至只是 onHorizontalDragCancel
)将使小容器获取并消耗事件(这意味着下面的大容器将不会收到它)。
为了解决我的问题,我用 onPanUpdate
和 onHorizontalDragUpdate
替换了 onVerticalDragUpdate
监听器(对于 onPanStart
和 onPanEnd
也是如此)。它不如使用 onPan
好,因为您只能获得垂直或水平事件的 DragUpdateDetails
(我必须添加更多逻辑来补偿这一点),但它可以防止底层 GestureDetector
劫持 onPan
事件。
关于flutter - 在 flutter 的同一页面上有 2 个手势检测器具有相同的手势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50764553/