【发布时间】:2019-11-25 22:12:39
【问题描述】:
我在水平滚动的PageView 中有一个垂直滚动的WebView。像这样的:
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 后出现问题。现在水平滚动似乎总是赢,即使手势非常明显几乎完全垂直。如果页面完全垂直滚动,则只有在手势停止后(即,当我在一个手势后停止触摸屏幕时) - 手势发生时没有垂直滚动。
从gestureRecognizers 添加和删除VerticalDragGestureRecognizer 现在没有任何效果 - 无论哪种方式,程序都好像识别器不在列表中一样(尽管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 中)从未声称胜利。事实上,它似乎被完全忽略了——在gestureRecognizers 中带有VerticalDragGestureRecognizer 的手势竞技场输出,没有它是完全一样的。
这可能是 Flutter 中的一个错误,所以我还创建了 an issue on Flutter's GitHub。但无论哪种方式 - 如何使用当前版本的 Flutter 实现这种效果?任何解决方法或规范的解决方案都将受到高度赞赏。
【问题讨论】:
-
可以做一个指定的垂直拖动区域。就像一个滚动条。当然不那么优雅。但是,如果您在截止日期方面遇到麻烦,它可能至少暂时有用。
-
@Doh09 感谢您的建议。我的“目前不太优雅的解决方案”坚持使用 Flutter 1.5.4。我只是不想永远被旧版本卡住。