import 'dart:io'; import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:food_hub_app/widgets/common/index.dart'; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; /// 截图工具类 class ScreenshotUtil { // 截图功能 static Future captureRecipeImage({ required GlobalKey globalKey, double pixelRatio = 3.0, Duration delay = const Duration(milliseconds: 50), }) async { // 等待一帧确保UI已渲染 await Future.delayed(delay); final RenderObject? render = globalKey.currentContext!.findRenderObject(); final RenderRepaintBoundary boundary = render as RenderRepaintBoundary; final ui.Image image = await boundary.toImage(pixelRatio: pixelRatio); final ByteData? byteData = await image.toByteData( format: ui.ImageByteFormat.png, ); return byteData?.buffer.asUint8List(); } // 保存图片到临时文件 static Future saveImageToFile(Uint8List bytes, String fileName) async { final directory = await getTemporaryDirectory(); final File imageFile = File('${directory.path}/$fileName'); await imageFile.writeAsBytes(bytes); return imageFile; } static Future captureAndShare({ required GlobalKey globalKey, required String fileName, required String shareText, }) async { try { final imageBytes = await captureRecipeImage(globalKey: globalKey); if (imageBytes != null) { final imageFile = await saveImageToFile(imageBytes, fileName); await SharePlus.instance.share( ShareParams(files: [XFile(imageFile.path)], text: shareText), ); // 分享后删除临时文件 await imageFile.delete(); } else { showErrorToast('生成图片失败,请重试'); } } catch (e) { showErrorToast('分享失败: $e'); } } }