You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter WebView如何禁用点击事件但保留滚动功能?

在Flutter WebView中禁用点击但保留滚动的解决方案

你的代码里用了AbsorbPointer(absorbing: true),这个组件会完全拦截所有指针事件,包括滚动,所以点击和滚动都被禁用了。下面提供两种可行的解决方法:

方案1:注入JavaScript禁用页面点击(推荐)

通过在Web页面加载完成后注入JS代码,阻止页面内所有元素的点击交互,同时保留页面滚动功能。

修改后的代码示例:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backgroundColor: AppColors.appbarColor,
      title: const Text('Terms of Service'),
    ),
    body: WebViewWidget(
      controller: _controller
        ..setJavaScriptMode(JavaScriptMode.unrestricted)
        ..setNavigationDelegate(
          NavigationDelegate(
            onPageFinished: (String url) {
              // 注入JS代码禁用页面点击
              _controller.runJavaScript('''
                // 全局阻止点击事件的默认行为和传播
                document.addEventListener('click', function(e) {
                  e.preventDefault();
                  e.stopPropagation();
                }, true);
                // 确保页面可以正常滚动
                document.body.style.overflow = 'auto';
                // 可选:禁用所有元素的点击响应(更彻底)
                document.querySelectorAll('*').forEach(el => {
                  el.style.pointerEvents = 'none';
                });
              ''');
            },
            onNavigationRequest: (NavigationRequest request) {
              if (request.url.startsWith('https://www.youtube.com/')) {
                return NavigationDecision.prevent;
              }
              return NavigationDecision.navigate;
            },
          ),
        ),
    ),
  );
}

方案2:通过手势识别器控制(纯Flutter层面处理)

利用WebView的gestureRecognizers参数,只允许滚动类手势传递给WebView,拦截点击等其他手势。

首先导入手势包:

import 'package:flutter/gestures.dart';

修改后的WebViewWidget部分代码:

WebViewWidget(
  gestureRecognizers: {
    // 允许垂直滚动手势
    Factory<VerticalDragGestureRecognizer>(() => VerticalDragGestureRecognizer()),
    // 如果需要水平滚动,取消注释下面一行
    // Factory<HorizontalDragGestureRecognizer>(() => HorizontalDragGestureRecognizer()),
  },
  controller: _controller
    ..setJavaScriptMode(JavaScriptMode.unrestricted)
    ..setNavigationDelegate(
      NavigationDelegate(
        onNavigationRequest: (NavigationRequest request) {
          if (request.url.startsWith('https://www.youtube.com/')) {
            return NavigationDecision.prevent;
          }
          return NavigationDecision.navigate;
        },
      ),
    ),
)

两种方案对比

  • 方案1:能精确控制Web页面内部的交互,适合需要彻底禁用页面点击的场景
  • 方案2:从Flutter手势层面拦截,适合不需要操作Web内容、仅展示的场景

内容的提问来源于stack exchange,提问作者Tanu Purohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:15:05