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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:45:46