Flutter InAppWebView安卓端复制报错:Uncaught (in promise) NotAllowedError
解决方案
方案一:通过Flutter剪贴板API替代网页端复制逻辑
WebView内置的navigator.clipboard在Android环境下存在权限限制,可通过JS与Flutter通信,将复制操作转移到Flutter端处理:
- 导入剪贴板依赖包
在代码顶部导入Flutter剪贴板相关包:
import 'package:flutter/services.dart';
- 注入JS拦截复制按钮点击
在onLoadStop回调中注入JS,拦截网页复制按钮的点击事件,把要复制的文本传递给Flutter(需根据实际网页DOM结构调整选择器和文本获取逻辑):
onLoadStop: (controller, url) async { await controller.injectJavascript(source: """ // 替换为你网页中复制按钮的CSS选择器 document.querySelectorAll('.copy-btn').forEach(btn => { btn.addEventListener('click', function(e) { e.preventDefault(); // 替换为你获取目标文本的逻辑 const textToCopy = this.getAttribute('data-copy-text') || this.nextElementSibling.textContent; // 调用Flutter端注册的处理方法 window.flutter_inappwebview.callHandler('handleCopy', textToCopy); }); }); """); }
- 注册Flutter端复制回调
在onWebViewCreated中注册JS回调,使用Flutter官方API完成复制:
onWebViewCreated: (controller) { controller.addJavaScriptHandler( handlerName: 'handleCopy', callback: (args) async { if (args.isNotEmpty) { String targetText = args[0]; await Clipboard.setData(ClipboardData(text: targetText)); // 可选:提示用户复制成功 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('已复制到剪贴板')), ); } }, ); }
方案二:调整Android WebView配置
移除无用权限
Android 10+已采用分区存储,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE对剪贴板操作无作用,直接从AndroidManifest.xml中删除这两个权限声明。配置WebView权限
在AndroidInAppWebViewOptions中启用相关权限:
android: AndroidInAppWebViewOptions( useHybridComposition: true, allowContentAccess: true, allowFileAccess: true, ),
方案三:iOS平台适配
若iOS端出现同类问题,需在Info.plist中添加剪贴板权限描述:
<key>NSClipboardUsageDescription</key> <string>需要访问剪贴板以完成文本复制</string>
内容的提问来源于stack exchange,提问作者HeIsDying
相关产品推荐
相关产品推荐

