我在水平滚动中进行了垂直WebView
滚动PageView
。像这样的东西:
PageView.builder(
itemCount: 5,
itemBuilder: (context, index) {
return WebView(
initialUrl: 'https://flutter.dev/docs',
gestureRecognizers: [
Factory(() => VerticalDragGestureRecognizer()),
].toSet(),
);
},
);
使用 Flutter 之前的稳定版本(1.5.4),这可以按预期工作 - 垂直滚动会移动 WebView 内的内容,水平滚动会移动 PageView。
这在升级到 Flutter 后中断了v1.7.8+hotfix.3
。现在水平滚动似乎总是赢,即使手势非常明显几乎完全垂直。如果页面完全垂直滚动,那么只有在手势停止之后(即,当我在一个手势后停止触摸屏幕时) - 手势发生时没有垂直滚动。
添加和删除VerticalDragGestureRecognizer
现在gestureRecognizers
没有效果 - 无论哪种方式,程序都像识别器不在列表中一样工作(尽管它不是gestureRecognizers
完全被忽略,因为添加EagerGestureRecognizer
确实有效果)。
这是手势竞技场的调试输出(请记住,我试图让我的手势尽可能垂直,但即使手指向两侧轻微移动也足以HorizontalDragGestureRecognizer
获胜,即使我也在垂直移动全部时间):
I/flutter (30125): Gesture arena 14 ❙ ★ Opening new gesture arena.
I/flutter (30125): Gesture arena 14 ❙ Adding: Instance of '_CombiningGestureArenaMember'
I/flutter (30125): Gesture arena 14 ❙ Adding: LongPressGestureRecognizer#9cad1(debugOwner: GestureDetector, state: ready)
I/flutter (30125): Gesture arena 14 ❙ Adding: HorizontalDragGestureRecognizer#69b8f(start behavior: start)
I/flutter (30125): Gesture arena 14 ❙ Closing with 3 members.
I/flutter (30125): Gesture arena 14 ❙ Rejecting: LongPressGestureRecognizer#9cad1(debugOwner: GestureDetector, state: possible)
I/flutter (30125): Gesture arena 14 ❙ Accepting: HorizontalDragGestureRecognizer#69b8f(start behavior: start)
I/flutter (30125): Gesture arena 14 ❙ Self-declared winner: HorizontalDragGestureRecognizer#69b8f(start behavior: start)
这就是当您确实设法保持手势完全垂直时发生的情况(在使用鼠标的模拟器上似乎更容易),而拖动手势正在进行中:
flutter: Gesture arena 30 ❙ ★ Opening new gesture arena.
flutter: Gesture arena 30 ❙ Adding: Instance of '_CombiningGestureArenaMember'
flutter: Gesture arena 30 ❙ Adding: HorizontalDragGestureRecognizer#11e7f(start behavior: down)
flutter: Gesture arena 30 ❙ Closing with 2 members.
即使是轻微的垂直移动也会使HorizontalDragGestureRecognizer
宣告胜利,但VerticalDragGestureRecognizer
(似乎被包裹在里面_CombiningGestureArenaMember
)从来没有宣布胜利。事实上,它似乎完全被忽略了——带有VerticalDragGestureRecognizer
ingestureRecognizers
和没有它的手势 Arena 输出是完全一样的。
这可能是 Flutter 中的一个错误,所以我还在Flutter 的 GitHub 上创建了一个问题。但无论哪种方式 - 如何使用当前版本的 Flutter 实现这种效果?任何解决方法或规范的解决方案都将受到高度赞赏。