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

Flutter WebView 4.0.7图片上传异常:Android端点击无响应

Flutter WebView 4.0.7 Android端图片上传无响应修复方案

问题原因

Android端WebView默认不会处理文件上传的Intent请求,需手动配置文件选择回调逻辑;而iOS端WebView已默认支持该行为,因此出现两端表现不一致的情况。

修复步骤

1. 配置WebChromeClient处理文件选择请求

通过WebChromeClient的onShowFileChooser方法拦截WebView的文件上传请求,结合ImagePicker实现图片选择逻辑。

2. 修改现有代码

更新WebViewController的初始化逻辑,添加文件上传处理:

Widget build(BuildContext context) {
  final ImagePicker _picker = ImagePicker();

  return WillPopScope(
    onWillPop: () => _goBack(context),
    child: Scaffold(
      body: netState
          ? Padding(
              padding: EdgeInsets.only(top: 50),
              child: WebViewWidget(
                  controller: _controller
                    ..setJavaScriptMode(JavaScriptMode.unrestricted)
                    ..setNavigationDelegate(
                      NavigationDelegate(
                        onPageFinished: (String url) {
                          _controller.runJavaScript(
                              "document.getElementsByClassName('logo me-lg-4')[0].remove();" +
                                  "document.getElementsByClassName('cookies-card bg--default text-center cookies--dark radius--10px')[0].remove();");
                        },
                      ),
                    )
                    // 新增Android文件上传处理
                    ..setWebChromeClient(WebChromeClient(
                      @override
                      bool onShowFileChooser(
                        WebViewController controller,
                        FileChooserParams params,
                      ) async {
                        // 调用ImagePicker选择相册图片
                        final XFile? image = await _picker.pickImage(
                          source: ImageSource.gallery,
                          imageQuality: 80,
                        );
                        if (image != null) {
                          // 将选中图片路径返回给WebView
                          params.onSelectedFiles([Uri.parse(image.path)]);
                          return true;
                        }
                        // 取消选择时返回空列表
                        params.onSelectedFiles([]);
                        return false;
                      },
                    ))
                    ..loadRequest(
                        Uri.parse('https://www.ilovepdf.com/unlock_pdf'))),
            )
          // 补充原无网络状态UI,可根据实际需求替换
          : const Center(child: Text("无网络连接")),
    ),
  );
}

3. 配置Android权限

在android/app/src/main/AndroidManifest.xml中添加相册访问权限:

<!-- Android 12及以下 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 13及以上适配新权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

4. 动态请求权限

在页面初始化时主动申请相册权限,避免权限不足导致无法选择图片:

@override
void initState() {
  super.initState();
  _requestGalleryPermission();
}

Future<void> _requestGalleryPermission() async {
  if (Platform.isAndroid) {
    final status = await Permission.photos.request();
    if (status.isDenied) {
      // 此处可添加权限被拒绝后的提示逻辑
    }
  }
}

需在pubspec.yaml中添加权限处理依赖:

dependencies:
  permission_handler: ^10.2.0

关键说明

  • onShowFileChooser是Android端处理WebView文件上传的核心回调,必须实现才能唤起图片选择器;
  • 若需支持相机拍照上传,可在ImagePicker中切换source: ImageSource.camera;
  • Android 13及以上版本的媒体权限机制有变更,需同时配置新权限以兼容不同系统版本。

内容的提问来源于stack exchange,提问作者Ram Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:12:57