You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,确保retrofitretrofit_generatordio的版本是兼容的。比如当前比较稳定的版本组合可以参考:

  • dio: ^5.4.0+1
  • retrofit: ^4.1.0
  • retrofit_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

火山引擎 最新活动