Я смог разгадать загадку. Решение:
body: Stack(
children: [
WebView(
initialUrl: 'https://google.com',
javascriptMode: JavascriptMode.unrestricted,
),
GestureDetector(
behavior: HitTestBehavior.translucent,
onTapDown: (_) => print('webview onTapDown $_'),
onTapUp: (_) => print('webview onTapUp $_'),
child: Container(),
),
],
),
Объяснение довольно простое:
Flutter перемещает арену жестов при указателе вверх, и первый распознаватель жестов побеждает. Во фрагменте из вопроса сам WebView является первым распознавателем жестов, а GestureDetector - вторым (дочерние элементы - первым порядком). WebView второй. Итак, когда арена пройдена, пользовательский GestureDetector выигрывает.