Flutter Desktop开发中如何将文件保存到用户指定目录?
Flutter MacOS 桌面端实现用户自定义选择目录保存文件
实现这个功能不需要编写原生桥接代码,直接通过系统文件选择器获取用户指定路径,再完成文件写入即可,具体步骤如下:
- 第一步:添加依赖
在pubspec.yaml中添加桌面端兼容的文件选择器依赖:
执行dependencies: flutter: sdk: flutter file_picker: ^6.1.1 # 支持全平台文件/目录选择,Mac端适配完善flutter pub get完成依赖安装。 - 第二步:配置MacOS权限
MacOS沙盒机制默认禁止应用随意读写用户目录,需要在macos/Runner/DebugProfile.entitlements和macos/Runner/Release.entitlements两个配置文件中,添加用户所选目录的读写权限:<!-- 允许读写用户自主选择的文件/目录 --> <key>com.apple.security.files.user-selected.read-write</key> <true/> - 第三步:替换原有保存逻辑
移除原来直接获取临时目录的代码,先调用系统目录选择器让用户指定保存位置,再执行文件写入,完整可运行代码如下:import 'dart:io' as io; import 'package:file_picker/file_picker.dart'; // 你的文件保存逻辑 try { // 唤起系统目录选择弹窗 String? targetDirPath = await FilePicker.platform.getDirectoryPath( dialogTitle: '选择文件保存文件夹', ); // 用户点击取消选择时直接中断流程 if (targetDirPath == null) { print('用户取消选择保存目录'); return; } // 拼接完整文件路径,建议引入path包用join方法拼接,避免跨平台分隔符问题 io.File saveFile = io.File('$targetDirPath/$filename.xlsx'); // 写入接口返回的文件字节 await saveFile.writeAsBytes(result.bodyBytes); print('文件保存成功,路径:${saveFile.path}'); } catch (e) { print('文件保存失败:$e'); }
可选优化:使用系统保存文件对话框
如果想要更符合桌面端用户的操作习惯,不需要让用户先选文件夹再存固定文件名,可以直接唤起系统的「另存为」对话框,支持用户自定义文件名、选择保存位置,示例代码:
try { String? saveFilePath = await FilePicker.platform.saveFile( dialogTitle: '保存Excel文件', fileName: '$filename.xlsx', // 默认填充的文件名 allowedExtensions: ['xlsx'], // 限制可选文件类型 type: FileType.custom, ); if (saveFilePath == null) return; await io.File(saveFilePath).writeAsBytes(result.bodyBytes); print('文件保存成功:$saveFilePath'); } catch (e) { print('保存失败:$e'); }
注意:如果应用需要上架Mac App Store,上述权限配置必须正确添加,否则会因权限问题被审核驳回;如果是打包非沙盒版本的桌面应用,可以根据实际需求调整权限配置。
内容的提问来源于stack exchange,提问作者Stephen Boikanyo
相关产品推荐
相关产品推荐

