You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用file_picker 4.2.1出现lengthSync、openRead未定义错误如何解决

Flutter file_picker 4.x版本谷歌云盘上传报错修复方案

不需要更换依赖包,只需要适配file_picker 4.x的API调整修改代码即可。报错的核心原因是file_picker 4.0之后pickFiles方法返回值从旧版的File对象改为FilePickerResult对象,API结构发生了变化,对应三个报错的修复逻辑如下:

  • 第一个报错:你直接取FilePickerResult.paths得到的是所有选中文件的路径数组,而path.basename方法需要传入单个路径字符串,因此出现类型不匹配
  • 第二个、第三个报错:openRead和lengthSync是dart:io中File类的实例方法,你调用的是FilePickerResult实例,自然不存在这两个方法

单文件上传场景修改后的完整代码

import 'dart:io';
import 'package:path/path.dart' as path;

// 其他原有逻辑保持不变
var client = GoogleHttpClient(await googleSignInAccount!.authHeaders);
var drive = ga.DriveApi(client);
ga.File fileToUpload = ga.File();

var pickerResult = await FilePicker.platform.pickFiles(
  type: _pickingType,
  allowMultiple: _multiPick,
  onFileLoading: (FilePickerStatus status) => print(status),
  allowedExtensions: (_extension?.isNotEmpty ?? false)
      ? _extension?.replaceAll(' ', '').split(',')
      : null,
);
// 新增空校验,处理用户取消选文件的场景
if (pickerResult == null || pickerResult.files.isEmpty) {
  return;
}
// 取出选中的文件构造本地File实例
PlatformFile pickedPlatformFile = pickerResult.files.first;
File localFile = File(pickedPlatformFile.path!);

fileToUpload.parents = ["appDataFolder"];
fileToUpload.name = path.basename(localFile.path);
var response = await drive.files.create(
  fileToUpload,
  uploadMedia: ga.Media(localFile.openRead(), localFile.lengthSync()),
);
print(response);
_listGoogleDriveFiles();

多文件上传场景适配代码

如果开启了多选配置,遍历选中的文件列表逐个上传即可:

if (pickerResult == null || pickerResult.files.isEmpty) {
  return;
}
for (var platformFile in pickerResult.files) {
  File localFile = File(platformFile.path!);
  ga.File fileToUpload = ga.File();
  fileToUpload.parents = ["appDataFolder"];
  fileToUpload.name = path.basename(localFile.path);
  var response = await drive.files.create(
    fileToUpload,
    uploadMedia: ga.Media(localFile.openRead(), localFile.lengthSync()),
  );
  print('文件${fileToUpload.name}上传完成,资源ID:${response.id}');
}
_listGoogleDriveFiles();

可选替代包说明

如果仅需要上传图片/视频类资源,可以使用官方维护的image_picker包;但file_picker支持全类型文件选择,适配后完全可以正常使用,无需更换。

内容的提问来源于stack exchange,提问作者Tanu Kushwaha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:45:00