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

Flutter使用Dio上传二进制图片列表时遇类型转换错误求助

解决Dio上传Multipart文件时的Null转String异常问题

问题根源

你直接将Stream<List<int>>列表传给FormData的Documents字段,不符合Dio处理文件上传的规范——Dio需要用MultipartFile类型包装文件数据,而非原始Stream。另外,documents参数未指定泛型类型,也可能引发类型推断错误。

修正方案

  1. 将File列表转换为MultipartFile列表,Dio会自动处理文件二进制上传;
  2. 给documents参数指定明确泛型List<File>,消除类型歧义;
  3. 确保所有传入的字符串/数字参数不为null(后端允许空值则忽略)。

修正后的代码:

@override
Future createVisaFirstStep(
    String departureDate,
    String returnDate,
    int visaType,
    int destinationCountryId,
    int entryCountry,
    List<File> documents) async {
  List<MultipartFile> files = [];
  for (File file in documents) {
    // 用MultipartFile.fromFile包装文件,可自定义文件名
    files.add(await MultipartFile.fromFile(
      file.path,
      filename: file.path.split('/').last,
    ));
  }

  final formData = FormData.fromMap({
    'DepartureDate': departureDate,
    'ReturnDate': returnDate,
    'VisaType': visaType,
    'DestinationCountryId': destinationCountryId,
    'EntryCountry': entryCountry,
    'Documents': files,
  });

  Response response = await refDio.post(
    EndPoints.visaFirstStep,
    data: formData,
  );

  if (response.statusCode != null &&
      response.statusCode! >= 200 &&
      response.statusCode! <= 299) {
    return response.data['data'];
  } else {
    return Future.error('Error ${response.statusCode}');
  }
}

额外说明

如果需要读取文件二进制后再上传,也可使用MultipartFile.fromBytes:

files.add(MultipartFile.fromBytes(
  await file.readAsBytes(),
  filename: 'custom_image.jpg',
));

若后端要求Documents为单个文件而非列表,直接传单个MultipartFile即可,无需包装成列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:13:12