在Flutter中实现WebView长按图片保存到相册,可以通过以下步骤完成:
-
添加依赖
在 pubspec.yaml 中添加 webview_flutter 和 image_gallery_saver 依赖:
dependencies:
webview_flutter: ^4.4.2
image_gallery_saver: ^2.1.1
-
配置权限
-
实现WebView并监听长按事件
使用 WebViewController 监听长按事件,通过JavaScript获取图片URL并保存:
import 'package:webview_flutter/webview_flutter.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:http/http.dart' as http;
class WebViewPage extends StatefulWidget {
@override
_WebViewPageState createState() => _WebViewPageState();
}
class _WebViewPageState extends State<WebViewPage> {
late WebViewController controller;
@override
Widget build(BuildContext context) {
return Scaffold(
body: WebView(
onWebViewCreated: (WebViewController webViewController) {
controller = webViewController;
},
onPageFinished: (String url) {
// 注入JavaScript监听长按事件
controller.runJavascript('''
document.addEventListener('contextmenu', function(e) {
e.preventDefault();
var src = e.target.src;
if (src) {
FlutterInvoker.saveImage(src);
}
});
''');
},
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: <JavascriptChannel>{
JavascriptChannel(
name: 'FlutterInvoker',
onMessageReceived: (JavascriptMessage message) async {
// 收到图片URL后保存
String imageUrl = message.message;
await _saveImage(imageUrl);
},
),
},
),
);
}
Future<void> _saveImage(String url) async {
try {
var response = await http.get(Uri.parse(url));
final result = await ImageGallerySaver.saveImage(
response.bodyBytes,
quality: 100,
);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('图片保存成功!')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('保存失败:$e')),
);
}
}
}
注意事项:
- 需要处理网络权限和存储权限请求(可使用
permission_handler 包)。
- 实际部署时需适配不同图片格式和错误处理。
- 在iOS模拟器中保存可能无效,需用真机测试。
此方法通过JavaScript拦截长按事件,将图片URL传递到Flutter端,再用 image_gallery_saver 保存到相册。