#flutter #dart #flutter-web
Вопрос:
Я загружаю изображения в хранилище, используя метод POST с типом содержимого составных/форм-данных. api возвращает ответ объекта, который выглядит следующим образом:
{ "id": "6d50c066-cf65-4748-8b9a-183c3526f49b", "name": "hotel_6.jpg", "fileKey": "lv/im/5d9feb8e-2ea8-439d-a550-1e937081e085-hotel_6.jpg", "fileExtension": ".jpg", "mimeType": "image/jpeg", "catalogueUrl": { "mainUrl": "https://xy.abc.com/lv/im/5d9feb8e-2ea8-439d-a550-1e937081e085-hotel_6.jpg", "thumbnailUrls": [] }, "createdAt": "2021-11-25T06:40:40.0869466 00:00"
}
Как я могу извлечь переменную «mainUrl» из ответа, чтобы присвоить ее значение _pictureController? Вот что я сделал:
uploadFile() async { var accessToken = await sharedPref.read(key); var postUrl = '$baseUrl/catalogue?thumbnail=${param.thumbnailTrueFalse}'; Map lt; String, String gt; headers = { "Authorization": "Bearer $accessToken", }; // multipart request object var request = http.MultipartRequest("POST", Uri.parse(postUrl)); request.headers.addAll(headers); // add selected file with request request.files.add(http.MultipartFile("file", imageStream, imageSize, filename: imageName)); // Send request var response = await request.send(); // Read response var result = await response.stream.bytesToString(); print('readResponse: $result'); if (response.statusCode == 200) { var data = StorageResponse.fromJson(jsonDecode(result)); print('data: $data'); setState(() { _pictureController.text = data.catalogueUrl!.mainUrl!; }); return data; } else { throw Exception('Failed to upload photo.'); } }
Класс «StorageResponse» выглядит следующим образом:
@JsonSerializable() class StorageResponse { var id; var name; var fileKey; var fileExtension; var mimeType; Catalogue ? catalogueUrl; var createdAt; StorageResponse({ this.id, this.name, this.fileKey, this.fileExtension, this.mimeType, this.catalogueUrl, this.createdAt, }); factory StorageResponse.fromJson(Map lt; String, dynamic gt; json) =gt; _$StorageResponseFromJson(json); Map lt; String, dynamic gt; toJson() =gt; _$StorageResponseToJson(this); @override toString() { String output = '{id:${this.id},name:${this.name},fileKey: ${this.fileKey},fileExtension:${this.fileExtension},mimeType: ${this.mimeType}mimeType},catalogueUrl: ${this.catalogueUrl},,createdAt: ${this.createdAt}}'; return output; } }
Ответ №1:
Вы можете использовать следующую структуру для преобразования файла Json в класс и наоборот.
Следующая структура работает правильно.
import 'dart:convert'; class StorageResponse { final String id; final String name; final String fileKey; final String fileExtension; final String mimeType; Catalogue catalogueUrl; final DateTime createdAt; StorageResponse( this.id, this.name, this.fileKey, this.fileExtension, this.mimeType, this.catalogueUrl, this.createdAt, ); factory StorageResponse.fromMap(Maplt;String, dynamicgt; json) { return StorageResponse( json['id'], json['name'], json['fileKey'], json['fileExtension'], json['mimeType'], Catalogue.fromMap(json['Catalogue']), DateTime.parse(json['createdAt'])); } Maplt;String, dynamicgt; toJson() =gt; { 'id': id, 'name': name, 'fileKey': fileKey, 'fileExtension': fileExtension, 'mimeType': mimeType, 'Catalogue': catalogueUrl.toJson(), 'createdAt': createdAt }; @override toString() { String output = '{id:${this.id},name:${this.name},fileKey: ${this.fileKey},fileExtension:${this.fileExtension},mimeType: ${this.mimeType}mimeType},catalogueUrl: ${this.catalogueUrl},,createdAt: ${this.createdAt}}'; return output; } } class Catalogue { final String mainUrl; final Listlt;Stringgt; thumbnailUrls; Catalogue(this.mainUrl, this.thumbnailUrls); factory Catalogue.fromMap(Maplt;String, dynamicgt; json) { return Catalogue(json['mainUrl'], jsonDecode(json['thumbnailUrls'])); } Maplt;String, dynamicgt; toJson() =gt; {'mainUrl': mainUrl, 'thumbnailUrls': jsonEncode(thumbnailUrls)}; }
для использования
if (response.statusCode == 200) { var data = StorageResponse.fromMap(jsonDecode(result)); print('data: $data'); setState(() { _pictureController.text = data.catalogueUrl!.mainUrl!; }); return data; } else { throw Exception('Failed to upload photo.'); }