Flutter开发中HTTP请求结果无法赋值给自定义模型列表问题求解
报错原因
- 模型构造函数命名错误:类名是
AstronomyModel,但构造函数写为AstronomyPicModel,属于基础语法错误。 - 解析逻辑与接口返回结构不匹配:你当前的
astronomyModelFromJson方法只能解析单个AstronomyModel对象,但传入count=20参数后接口返回的是包含20个对象的JSON数组,类型不匹配导致赋值报错。 - 额外问题:模型中描述字段名写错,常见天文图片接口的描述字段为
explanation不是description,会导致解析后描述字段为空;URL拼接最后会多出冗余的&符号,可能触发接口参数校验报错。
修复方案
1. 修正数据模型与解析逻辑
import 'dart:convert'; // 新增JSON数组解析方法 List<AstronomyModel> astronomyModelListFromJson(String str) => List<AstronomyModel>.from(json.decode(str).map((item) => AstronomyModel.fromJson(item))); class AstronomyModel { // 修正构造函数名称与类名一致 AstronomyModel({ this.date, this.hdurl, this.description, this.mediaType, this.thumbnailUrl, this.title, this.url, }); DateTime? date; String? hdurl; String? description; String? mediaType; String? thumbnailUrl; String? title; String? url; factory AstronomyModel.fromJson(Map<String, dynamic> json) => AstronomyModel( date: DateTime.parse(json["date"]), hdurl: json["hdurl"], // 修正字段名匹配接口返回 description: json["explanation"], mediaType: json["media_type"], thumbnailUrl: json["thumbnail_url"], title: json["title"], url: json["url"], ); }
2. 修正列表请求逻辑的解析调用
class AstronomyService { Future<List<AstronomyModel>?> getAstronomy() async { try { final response = await ApiService().fetchData({ "thumbs": true.toString(), "count": "20", }); if (response.statusCode == 200) { // 调用数组解析方法返回列表 final result = astronomyModelListFromJson(response.body); return result; } return null; } catch (e) { rethrow; } } }
3. (可选)优化URL拼接逻辑
避免手动拼接参数出现冗余&符号:
String combineUrl({Map<String, String>? urlParams}) { final uri = Uri.parse("$baseUrl/api/"); if (urlParams == null || urlParams.isEmpty) return uri.toString(); return uri.replace(queryParameters: urlParams).toString(); }
内容的提问来源于stack exchange,提问作者P-J
相关产品推荐
相关产品推荐

