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; }
额外提示
- 原代码中
_progress计算里的/2看起来是多余的,根据实际进度需求调整即可。 - 必须在下载完成或出现异常时关闭文件写入流,防止文件损坏。
- 如果是超大文件(GB级),iOS端还可以考虑使用系统后台下载API,但上述方案已经能解决绝大多数内存溢出场景。
内容的提问来源于stack exchange,提问作者Ivan Zhadnov
相关产品推荐
相关产品推荐

