Flutter iOS端无法将下载文件保存至documents目录问题求助
问题原因
你的代码在iOS运行失败核心是两个平台的文件系统规则差异:
- Android对手动拼接的路径容错率更高,即使格式存在小问题也能正常识别
- iOS沙盒路径校验严格,你手动用
/拼接路径的方式存在兼容问题,同时从报错日志可见,实际存储路径被误定位到了Library/Caches目录而非你预期的Documents目录,路径不匹配导致系统找不到目标文件。
修复步骤
- 先添加官方路径处理依赖
path到pubspec.yaml,避免手动拼接路径的分隔符兼容问题:
dependencies: path: ^1.8.3
- 替换原有路径生成逻辑,使用
path包的join方法自动适配平台路径规则:
// 顶部导入path包 import 'package:path/path.dart' as path; // 路径生成部分修改为以下代码 var dir = await getApplicationDocumentsDirectory(); // 提前校验目录存在性,兼容异常情况 if (!await dir.exists()) { await dir.create(recursive: true); } const documentName = "testname.pdf"; final storePath = path.join(dir.path, documentName);
- 优化dio下载配置,避免全局配置覆盖存储路径:
try { await dio.download( url, storePath, // 单独指定下载配置,避免全局配置干扰 options: Options( responseType: ResponseType.bytes, followRedirects: true, receiveTimeout: const Duration(minutes: 2), ), onReceiveProgress: (rec, total) { // 增加total合法性校验,避免总大小为0时出现除以0异常 if (total <= 0) return; print("Rec: $rec , Total: $total"); _setState(() { downloading = true; progressString = "${((rec / total) * 100).toStringAsFixed(0)}%"; }); }, ); } catch (e) { print(e); }
- 如果你使用的下载链接是HTTP协议,需要在iOS项目的
ios/Runner/Info.plist中添加网络权限配置,iOS默认禁止HTTP请求:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
以上修改完成后重新运行即可正常在iOS平台下载文件到Documents目录。
内容的提问来源于stack exchange,提问作者Viktor Vostrikov
相关产品推荐
相关产品推荐

