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

Flutter iOS流式下载文件触发内存耗尽错误,求排查方案

问题分析与解决方案

问题根源

iOS设备上的内存耗尽错误,核心原因是你把整个下载文件的字节全部累加在内存中。Android对内存的容忍度更高,而iOS的内存管控更严格,当文件接近100MB时,持续在内存中缓存所有字节会触发内存溢出,错误日志里的1GB分配请求是内存累计过载导致的异常表现。

修复方案

不要在内存中缓存全部字节,改为边下载边写入本地文件,这样内存占用只会维持在单次读取的newBytes大小,彻底解决内存压力。

修改后的代码示例:

// 先创建目标本地文件
final targetFile = File('你的文件保存路径');
final fileSink = targetFile.openWrite();

try {
  await response.stream.listen(
    (List<int> newBytes) {
      // 直接写入文件,而非在内存中累加
      fileSink.add(newBytes);
      // 获取已下载的文件长度计算进度
      final downloadedLength = await targetFile.length();
      _progress = (downloadedLength / contentLength!) * 100; // 原代码的/2疑似笔误,按需调整
      fileInfo.progress = _progress;
    },
    cancelOnError: true,
    onDone: () => fileSink.close(),
  ).asFuture();
} catch (e) {
  // 异常时关闭流,避免文件损坏
  fileSink.close();
  rethrow;
}

额外提示

  1. 原代码中_progress计算里的/2看起来是多余的,根据实际进度需求调整即可。
  2. 必须在下载完成或出现异常时关闭文件写入流,防止文件损坏。
  3. 如果是超大文件(GB级),iOS端还可以考虑使用系统后台下载API,但上述方案已经能解决绝大多数内存溢出场景。

内容的提问来源于stack exchange,提问作者Ivan Zhadnov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:40:13