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

如何从multipart/form-data接口响应中提取mainUrl并赋值给_pictureController

正确提取mainUrl的实现方案

1. 补充缺失的Catalogue实体类定义

你当前只定义了StorageResponse类,但嵌套的catalogueUrl对象对应的Catalogue类没有实现,这是导致解析失败的核心原因,新增代码如下:

@JsonSerializable()
class Catalogue {
  String? mainUrl;
  List<dynamic>? thumbnailUrls; // 如果确定数组元素类型可替换为对应具体类型

  Catalogue({
    this.mainUrl,
    this.thumbnailUrls,
  });

  factory Catalogue.fromJson(Map<String, dynamic> json) => _$CatalogueFromJson(json);
  Map<String, dynamic> toJson() => _$CatalogueToJson(this);
}

2. 优化StorageResponse类的字段定义

原类中所有字段都用var声明,类型不明确容易导致序列化异常,修正后代码如下:

@JsonSerializable()
class StorageResponse {
  String? id;
  String? name;
  String? fileKey;
  String? fileExtension;
  String? mimeType;
  Catalogue? catalogueUrl;
  String? createdAt;

  StorageResponse({
    this.id,
    this.name,
    this.fileKey,
    this.fileExtension,
    this.mimeType,
    this.catalogueUrl,
    this.createdAt,
  });

  factory StorageResponse.fromJson(Map<String, dynamic> json) => _$StorageResponseFromJson(json);
  Map<String, dynamic> toJson() => _$StorageResponseToJson(this);

  @override
  String toString() {
    return '{id: $id, name: $name, fileKey: $fileKey, fileExtension: $fileExtension, mimeType: $mimeType, catalogueUrl: $catalogueUrl, createdAt: $createdAt}';
  }
}

3. 生成序列化逻辑代码

实体类修改完成后,在项目根目录执行以下命令生成json解析的配套逻辑代码:

dart run build_runner build

4. 优化赋值逻辑的空安全处理

原代码直接用!强制解包,遇到接口返回空的情况会直接崩溃,优化后的赋值代码如下:

if (response.statusCode == 200) {
  var data = StorageResponse.fromJson(jsonDecode(result));
  print('data: $data');
  setState(() {
    // 先判空再赋值,异常情况下默认赋值为空字符串避免崩溃
    _pictureController.text = data.catalogueUrl?.mainUrl ?? '';
  });
  return data;
}

完成以上步骤即可正常从响应中提取到mainUrl的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:08