Flutter桌面端保存截图时FileSystemException无法捕获怎么办?
问题原因
你的代码里的dFile.writeAsBytes(capturedImage)是异步方法,它返回一个Future,但你没有用await等待它执行完成。同步的try-catch无法捕获异步操作抛出的异常,这些异常会直接变成未处理的Future异常,所以你的catch块永远不会触发。
修正方案
有两种方式可以解决这个问题:
方式一:在.then回调中使用async/await
把回调函数改成async,并用await等待writeAsBytes完成,这样try-catch就能捕获异步异常:
final dFile = File('$dPath(AS-Logo) $logoText.png'); screenshotController .captureFromWidget(makeLogoShow(completeImageSize, logoText)) .then((capturedImage) async { // 加上async关键字 try { await dFile.writeAsBytes(capturedImage); // 用await等待异步操作完成 } on FileSystemException catch (e) { print("Error: $e"); // 这里可以添加自定义错误处理逻辑,比如提示用户保存失败 } });
方式二:改用async/await替代.then链式调用
这种写法更直观,代码可读性和维护性更好:
final dFile = File('$dPath(AS-Logo) $logoText.png'); try { final capturedImage = await screenshotController.captureFromWidget( makeLogoShow(completeImageSize, logoText) ); await dFile.writeAsBytes(capturedImage); } on FileSystemException catch (e) { print("Error: $e"); // 添加错误处理逻辑 } catch (e) { // 捕获其他类型的异常 print("Unexpected error: $e"); }
额外注意点
- 确认
dPath是合法路径,比如Mac上要确保应用有对应目录的读写权限,Windows上避免写入系统受保护目录(如C盘根目录),否则即使捕获了异常,也需要处理权限问题。 - 检查文件名是否包含平台非法字符,虽然括号是合法的,但路径拼接后要确保整体格式正确。
内容的提问来源于stack exchange,提问作者gundrabur
相关产品推荐
相关产品推荐

