如何从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
相关产品推荐
相关产品推荐

