Flutter报错:预期File类型却得到FilePickerResult类型该如何解决?
问题原因
你触发类型错误的根本原因是:调用FilePicker.platform.pickFiles()返回的是FilePickerResult类型对象,你直接把这个对象传给了Provider的file变量,但是后续请求逻辑里你直接把它强转为File类型,类型不匹配导致报错。
修改方案
按以下三个位置修改代码即可:
修改文件选择按钮的点击逻辑,从
FilePickerResult里提取实际文件对象再传给Provider
把ElevatedButton的onPressed逻辑替换为:ElevatedButton( onPressed: () async { final result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['txt', 'docx'], ); if(result == null) return; // 新增空判断,防止用户取消选文件时报空指针 // 提取选中的文件对象传入Provider,兼容移动端、Web全平台 value.setFile(result.files.first); }, child: Text('Seleccionar archivo') )修改LoginFormProvider里的file变量定义和setFile逻辑
替换对应代码为:// 把原来的var file;替换为下面的定义 PlatformFile? selectedFile; // 修改setFile方法 void setFile(PlatformFile file) { selectedFile = file; notifyListeners(); }修改makePostRequest里的文件上传逻辑
把请求方法里的文件处理部分替换为:Future makePostRequest(String title, int subjectid, int teacherid, String limitDate) async { var url = Uri.parse('http://localhost:8000/newHomework'); var request = http.MultipartRequest('POST', url); // 删掉原来手动设置Content-Type的代码,MultipartRequest会自动生成带boundary的正确请求头,手动设置会导致服务端无法解析表单 // 直接用PlatformFile自带的字节数据生成MultipartFile request.files.add(http.MultipartFile.fromBytes( 'text', selectedFile!.bytes!, filename: selectedFile!.name )); request.fields['title'] = title; request.fields['limitDate'] = limitDate; request.fields['subjectid'] = subjectid.toString(); request.fields['teacherid'] = teacherid.toString(); request.fields['ext'] = selectedFile!.extension ?? '.txt'; // 自动取实际文件后缀,兼容docx格式 var res = await request.send(); return res.stream.bytesToString().asStream().listen((event) { var parsedJson = json.decode(event); print(parsedJson); }); }
内容的提问来源于stack exchange,提问作者Irwin
相关产品推荐
相关产品推荐

