Flutter中使用Retrofit+Dio上传图片时遭遇“toJson() method have to add to MultipartFile”异常的解决求助
Flutter中使用Retrofit+Dio上传图片时遭遇“toJson() method have to add to MultipartFile”异常的解决求助
嘿,这个问题我之前踩过坑!其实核心原因是retrofit_generator在生成序列化代码时,会要求API方法里的所有参数都具备toJson()方法,但Dio自带的MultipartFile类并没有实现这个方法,所以直接触发了这个报错。下面给你几个亲测有效的解决办法:
方法一:给Dio的MultipartFile扩展toJson方法
你可以在项目里新建一个工具类,给MultipartFile加一个空实现的toJson()扩展(因为文件上传场景下根本不需要真正序列化它,只是为了哄过代码生成工具的检查):
import 'package:dio/dio.dart'; extension MultipartFileJson on MultipartFile { dynamic toJson() { // 不需要实际逻辑,仅满足retrofit_generator的校验要求 return this; } }
把这个扩展类导入到你的schedule_remote_datasource.dart文件里,再重新运行build_runner命令试试,大部分情况下这个方法就能解决问题。
方法二:检查Retrofit与Dio的版本兼容性
有时候版本不匹配也会引发这类莫名的代码生成错误。你可以打开pubspec.yaml,确保retrofit、retrofit_generator和dio的版本是兼容的。比如当前比较稳定的版本组合可以参考:
dio: ^5.4.0+1retrofit: ^4.1.0retrofit_generator: ^8.1.0
修改版本后先执行flutter pub get,再重新跑flutter pub run build_runner build --delete-conflicting-outputs。
方法三:改用Dart自带的File类型作为参数
要是不想折腾扩展方法,你也可以把API方法里的MultipartFile换成Dart原生的File类型,retrofit_generator会自动帮你把File转换成Dio需要的MultipartFile:
@POST(ScheduleConstants.createMeal) @MultiPart() Future<void> createMeal({ @Part(name: 'meal_type') required String mealType, @Part(name: 'description') required String description, @PartFile(name: 'image') required File image, });
这样生成代码时就不会再要求toJson方法了,属于更偷懒但有效的方案。
优先试试第一种方法,这是最直接对应你当前代码结构的解决方案。如果还是不行,再换版本或者第三种方法试试。
内容来源于stack exchange




