在WebView上捕获onTap

时间:2020-08-03 14:59:01

标签: flutter

考虑以下片段:

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

我想在WebView上捕获点击事件,并避免它们在WebView中执行。我想自己评估点击事件。但是,平移/缩放事件仍应由WebView处理。

但是,上面的代码基本上什么也不做。 WebView仍会获取并执行所有点击事件。

2 个答案:

答案 0 :(得分:0)

我能够解决这个难题。解决方案是:

      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将获胜。

答案 1 :(得分:-1)

使用 像以下示例一样,具有gestureRecognizersTapGestureRecognizer属性

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,
);