Flutter Desktop端使用file_picker库选中文件后file.bytes返回null求助
问题原因
file_picker 4.0.2版本的平台实现存在天然差异:Web端默认会将选中的文件读取字节数据填充到PlatformFile.bytes字段中,但桌面端(Windows/macOS/Linux)为了避免大文件选择时占用过多内存,默认不会自动加载字节数据,因此bytes字段会返回null,属于设计上的平台差异而非Bug。
解决方案
根据你的文件使用场景,可以选择以下两种方案解决:
- 方案1:小文件场景直接开启自动读字节
调用pickFiles时传入withData: true参数,强制桌面端也自动读取文件字节到bytes字段,无需修改后续业务逻辑即可实现全端适配。
修改后的调用代码如下:
FilePickerResult? result = await FilePicker.platform.pickFiles(withData: true); if (result != null) { PlatformFile file = result.files.first; print(file.name); print(file.bytes); // 桌面端也可以正常拿到字节数据 print(file.size); print(file.extension); print(file.path); } else { // 用户取消了文件选择 }
注意:该方案仅适合选择小体积文件的场景,如果选中的文件过大,一次性读取全量字节会占用大量内存,甚至导致应用卡顿崩溃。
- 方案2:大文件场景手动读字节
桌面端选择文件后PlatformFile.path字段会返回文件在本地的绝对路径,你可以直接通过该路径手动读取字节数据,按需控制读取逻辑,避免内存占用过高。
示例代码如下:
import 'dart:io'; import 'package:flutter/foundation.dart'; FilePickerResult? result = await FilePicker.platform.pickFiles(); if (result != null) { PlatformFile file = result.files.first; Uint8List? fileBytes; // 区分平台处理 if(kIsWeb) { fileBytes = file.bytes; } else { // 桌面端通过路径手动读取 fileBytes = await File(file.path!).readAsBytes(); } print(fileBytes); // 全端均可正常拿到字节数据 } else { // 用户取消了文件选择 }
内容的提问来源于stack exchange,提问作者Kamith Lakmal
相关产品推荐
相关产品推荐

