Flutter文件选择插件file_picker_fork的使用
Flutter文件选择插件file_picker_fork的使用
File Picker #
这是一个允许你使用原生文件浏览器选择单个或多个文件的包,并支持扩展名过滤。
目前支持的功能 #
- 使用操作系统默认的原生选择器
- 支持多种平台(移动设备、网页、桌面和Flutter GO)
- 使用自定义格式过滤选择文件——你可以提供一个文件扩展名列表(如pdf、svg、zip等)
- 从云文件中选择文件(如GDrive、Dropbox、iCloud)
- 单个或多个文件选择
- 不同的默认类型过滤(媒体、图像、视频、音频或任何类型)
- 选择目录
- 如果需要,可以立即将文件数据加载到内存中(
Uint8List
) - 打开保存文件/另存为对话框(让用户指定文件保存的位置、目录和名称)
如果你有任何希望在这个包中看到的功能,请随时提出建议。🎉
兼容性图表 #
API | Android | iOS | Linux | macOS | Windows | Web |
---|---|---|---|---|---|---|
clearTemporaryFiles() | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
getDirectoryPath() | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
pickFiles() | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
saveFile() | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ |
有关详细信息,请参阅 API部分的File Picker Wiki 或 pub.dev上的官方API引用。
文档 #
有关如何安装、设置和使用的详细信息,请参阅File Picker Wiki。
File Picker Wiki #
用法 #
快速简单的使用示例:
单个文件 #
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
File file = File(result.files.single.path);
} else {
// 用户取消了选择
}
多个文件 #
FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
if (result != null) {
List<File> files = result.paths.map((path) => File(path)).toList();
} else {
// 用户取消了选择
}
带扩展名过滤的多个文件 #
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['jpg', 'pdf', 'doc'],
);
选择目录 #
String? selectedDirectory = await FilePicker.platform.getDirectoryPath();
if (selectedDirectory == null) {
// 用户取消了选择
}
保存文件/另存为对话框 #
String? outputFile = await FilePicker.platform.saveFile(
dialogTitle: '请选择输出文件:',
fileName: 'output-file.pdf',
);
if (outputFile == null) {
// 用户取消了选择
}
加载结果和文件详情 #
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
PlatformFile file = result.files.first;
print(file.name); // 文件名
print(file.bytes); // 文件字节
print(file.size); // 文件大小
print(file.extension); // 文件扩展名
print(file.path); // 文件路径
} else {
// 用户取消了选择
}
使用Flutter Web选择并上传文件到Firebase Storage #
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
Uint8List fileBytes = result.files.first.bytes;
String fileName = result.files.first.name;
// 上传文件
await FirebaseStorage.instance.ref(‘uploads/$fileName’).putData(fileBytes);
}
有关完整的用法细节,请参阅上面的Wiki。
示例应用 #
Android #
iOS #
MacOS #
Linux #
Windows #
开始使用 #
有关如何开始使用Flutter的详细信息,请查看我们的在线 文档。
有关如何编辑插件代码的详细信息,请查看 文档。
完整示例Demo
以下是一个完整的示例Demo,展示了如何使用file_picker_fork
插件选择文件并在控制台中打印文件信息。
import 'package:flutter/material.dart';
import 'package:file_picker_example/src/file_picker_demo.dart';
import 'package:file_picker/file_picker.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('File Picker Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 选择文件
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
// 获取文件信息
PlatformFile file = result.files.first;
// 打印文件信息
print('文件名: ${file.name}');
print('文件字节: ${file.bytes}');
print('文件大小: ${file.size}');
print('文件扩展名: ${file.extension}');
print('文件路径: ${file.path}');
} else {
// 用户取消了选择
print('用户取消了选择');
}
},
child: Text('选择文件'),
),
),
),
);
}
}
更多关于Flutter文件选择插件file_picker_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter文件选择插件file_picker_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
file_picker_fork
是 file_picker
插件的一个分支,用于在 Flutter 应用中选择文件和目录。它支持多平台(包括 Android、iOS、Web、Linux、macOS 和 Windows),并且允许用户从设备中选择文件、目录或者创建新文件。以下是如何在 Flutter 项目中使用 file_picker_fork
插件的步骤。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 file_picker_fork
依赖:
dependencies:
flutter:
sdk: flutter
file_picker_fork: ^5.0.0 # 请检查最新版本
然后运行 flutter pub get
以安装依赖。
2. 导入插件
在你的 Dart 文件中导入 file_picker_fork
:
import 'package:file_picker_fork/file_picker_fork.dart';
3. 使用插件选择文件
选择单个文件
void pickFile() async {
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
PlatformFile file = result.files.first;
print('File name: ${file.name}');
print('File size: ${file.size}');
print('File path: ${file.path}');
} else {
// 用户取消了文件选择
print('No file selected.');
}
}
选择多个文件
void pickMultipleFiles() async {
FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
if (result != null) {
List<PlatformFile> files = result.files;
for (var file in files) {
print('File name: ${file.name}');
print('File size: ${file.size}');
print('File path: ${file.path}');
}
} else {
// 用户取消了文件选择
print('No files selected.');
}
}
选择目录
void pickDirectory() async {
String? selectedDirectory = await FilePicker.platform.getDirectoryPath();
if (selectedDirectory != null) {
print('Selected directory: $selectedDirectory');
} else {
// 用户取消了目录选择
print('No directory selected.');
}
}
4. 处理文件类型限制
你可以通过 type
参数限制用户选择的文件类型。例如,只允许选择图片文件:
void pickImage() async {
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.image,
);
if (result != null) {
PlatformFile file = result.files.first;
print('Image file: ${file.name}');
} else {
print('No image selected.');
}
}
FileType
枚举支持以下类型:
FileType.any
:任何文件类型FileType.image
:图片文件FileType.video
:视频文件FileType.audio
:音频文件FileType.media
:媒体文件(图片和视频)FileType.custom
:自定义文件类型(通过allowedExtensions
参数指定)
5. 自定义文件类型
如果你想限制用户选择特定扩展名的文件,可以使用 FileType.custom
并指定 allowedExtensions
参数:
void pickCustomFile() async {
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['pdf', 'doc', 'docx'],
);
if (result != null) {
PlatformFile file = result.files.first;
print('Custom file: ${file.name}');
} else {
print('No custom file selected.');
}
}
6. 处理权限
在某些平台上,可能需要请求文件访问权限。file_picker_fork
内部会自动处理大部分权限请求,但在某些情况下,你可能需要手动处理权限(例如在 Android 上访问存储)。
7. Web 平台支持
在 Web 平台上,file_picker_fork
使用了浏览器的文件选择对话框,因此与原生平台的行为略有不同。你可以通过 FileType
和 allowedExtensions
参数来控制文件选择。
8. 处理大文件
如果你需要处理大文件,建议将文件读取为流(FilePickerResult.files.first.readAsStream()
)以减少内存占用。
9. 错误处理
在使用 file_picker_fork
时,可能会遇到一些错误,例如用户取消选择或权限问题。你可以使用 try-catch
块来捕获并处理这些错误:
void pickFile() async {
try {
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
PlatformFile file = result.files.first;
print('File selected: ${file.name}');
} else {
print('No file selected.');
}
} catch (e) {
print('Error picking file: $e');
}
}