Flutter调用Yummly2 API获取preparationSteps返回null求助
解决Flutter调用Yummly2 API获取preparationSteps为null的问题
排查方向
API字段结构不匹配
Yummly2 API的preparationSteps可能并非直接返回String类型,而是List数组;部分食谱可能无步骤数据,直接返回null;甚至字段名可能存在差异(如文档标注为 instructions或嵌套在其他对象中)。类型转换与空值未处理
原代码直接强转json['preparationSteps'] as String,若字段不存在、类型不符,会直接返回null或抛出异常,未做任何兜底处理。
解决方案
1. 先确认API返回结构
在API请求成功后,打印原始JSON数据(如print(jsonDecode(response.body))),明确preparationSteps的实际类型和存在性,同时对照RapidAPI官方文档确认字段名是否正确。
2. 修改Recipe模型类
针对常见的数组类型步骤和空值情况,调整fromJson工厂方法,增加类型判断和空值兜底:
class Recipe { final String name; final String images; final double rating; final String totalTime; final String preparationSteps; Recipe({ required this.name, required this.images, required this.rating, required this.totalTime, required this.preparationSteps, }); factory Recipe.fromJson(dynamic json) { // 处理preparationSteps的多种可能情况 dynamic stepsData = json['preparationSteps']; String steps = '暂无烹饪步骤'; if (stepsData is List) { // 若为数组,拼接为换行分隔的字符串 steps = stepsData.join('\n'); } else if (stepsData is String) { steps = stepsData; } return Recipe( name: json['name'] as String? ?? '未知食谱名称', images: json['images']?[0]?['hostedLargeUrl'] as String? ?? '', rating: (json['rating'] as num?)?.toDouble() ?? 0.0, totalTime: json['totalTime'] as String? ?? '未知时长', preparationSteps: steps, ); } static List<Recipe> recipesFromSnapshot(List snapshot) { return snapshot.map((data) => Recipe.fromJson(data)).toList(); } @override String toString() { return 'Recipe {name: $name, image: $images, rating: $rating, totalTime: $totalTime, preparationSteps: $preparationSteps}'; } }
3. 额外优化点
- 若API返回的步骤是嵌套对象(如每个步骤含
text字段),需进一步解析数组中的对象,例如:if (stepsData is List) { steps = stepsData.map((step) => step['text'] as String).join('\n'); } - 去掉不必要的
dart:html导入(若不是Web平台开发),替换为dart:convert用于JSON解析。
内容的提问来源于stack exchange,提问作者user12779587
相关产品推荐
相关产品推荐

