Захват onTap на WebView - PullRequest
       6

Захват onTap на WebView

0 голосов
/ 03 августа 2020

Рассмотрим следующий фрагмент:

      body: GestureDetector(
        onTapUp: (details) => print('webview tapped $details'),
        child: WebView(
          initialUrl: 'https://google.com',
          javascriptMode: JavascriptMode.unrestricted,
        ),
      ),

Я бы хотел фиксировать события касания в WebView и избегать их выполнения в WebView. Я хочу сам оценивать события касания. Однако события панорамирования / масштабирования по-прежнему должны обрабатываться WebView.

Однако приведенный выше код практически ничего не делает. WebView по-прежнему получает и выполняет все события касания.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Я смог разгадать загадку. Решение:

      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 выигрывает.

0 голосов
/ 03 августа 2020

используйте свойство gestureRecognizers с TapGestureRecognizer как в примере ниже

WebView(
  initialUrl: someUrl,
  gestureRecognizers: Set()
    ..add(Factory<TapGestureRecognizer>(
      () => TapGestureRecognizer())),
)

Или, написав другим способом:

var verticalGestures = Factory<TapGestureRecognizer>(
  () => TapGestureRecognizer());
var gestureSet = Set.from([verticalGestures]);
return WebView(
  initialUrl: someUrl,
  gestureRecognizers: gestureSet,
);
...