Dart For循环无法完成导致无限加载无返回值问题求助
Dart For循环无法完成导致无限加载无返回值问题求助
嘿,我仔细看了你的代码和问题描述,发现几个很可能导致循环卡住、无法返回结果的关键点,咱们一个个来解决:
1. 普通for循环的边界错误(直接导致循环无法结束)
你尝试的for (int i = 0; i <= jsonResponse['Restaurants'].length; i++)有个经典的索引越界问题:数组/列表的索引是从0开始的,比如有5个餐厅,索引范围是0-4,但<= length会让i走到5,这时候访问jsonResponse['Restaurants'][i]会直接抛出异常,代码中断,自然到不了return restaurants这一步,导致无限加载。
修复方式:把判断条件改成<,确保i不会超出有效索引范围:
for (int i = 0; i < jsonResponse['Restaurants'].length; i++)
2. 未处理的null字段引发异常(循环中途中断)
虽然你说所有值都能正确获取,但实际数据里可能存在个别字段为null的情况(比如某个餐厅的Address是null,或者DeliveryEtaMinutes缺失),这时候直接访问restaurant['Address']['FirstLine']这类嵌套字段会抛出NoSuchMethodError,导致循环在中途突然停止,后续代码(包括return)都无法执行。
修复方式:给所有可能为null的字段添加空安全检查,比如:
- 处理地址字段:
var addressFirstLine = restaurant['Address']?['FirstLine'] ?? ''; var city = restaurant['Address']?['City'] ?? ''; var restaurantAddress = '$addressFirstLine, $city'.trim().replaceAll(RegExp(', +'), ', ');
- 处理配送时间字段:
var etaMinutes = restaurant['DeliveryEtaMinutes']; var restaurantDeliveryETA = etaMinutes != null ? "${etaMinutes['RangeLower']} - ${etaMinutes['RangeUpper']}" : "Unknown";
- 处理菜系列表:
for (var tag in restaurant['Cuisines'] ?? []) { restaurantTags.add(tag['Name'] ?? ''); }
3. 单个餐厅处理失败中断整个循环
即使某个餐厅的数据有问题,我们也不希望整个循环直接挂掉。可以给循环内部套一个try-catch块,捕获单个餐厅处理时的异常,保证循环能继续执行完所有元素。
优化后的完整循环代码:
int index = 0; for (var restaurant in jsonResponse['Restaurants']) { try { var restaurantName = restaurant['Name']; if (!hiddenRestaurants.contains(restaurantName)) { var restaurantOnline = restaurant['IsOpenNow']; if (restaurantOnline) { var restaurantImage = restaurant['LogoUrl'] ?? ''; var addressFirstLine = restaurant['Address']?['FirstLine'] ?? ''; var city = restaurant['Address']?['City'] ?? ''; var restaurantAddress = '$addressFirstLine, $city'.trim().replaceAll(RegExp(', +'), ', '); var restaurantDeliveryPrice = restaurant['DeliveryCost'] ?? 0.0; var restaurantDeliveryInt = restaurant['DeliveryCost'] ?? 0; var etaMinutes = restaurant['DeliveryEtaMinutes']; var restaurantDeliveryETA = etaMinutes != null ? "${etaMinutes['RangeLower']} - ${etaMinutes['RangeUpper']}" : "Unknown"; var restaurantETA = restaurant['DeliveryWorkingTimeMinutes'] ?? 0; var restaurantTags = []; for (var tag in restaurant['Cuisines'] ?? []) { restaurantTags.add(tag['Name'] ?? ''); } var restaurantRating = (restaurant['RatingStars'] ?? 0.0) * 2.0; var loc = restaurant['Id'] ?? ''; restaurants.add(Restaurant( title: restaurantName ?? 'Unnamed Restaurant', image: restaurantImage, address: restaurantAddress, tags: restaurantTags, loc: loc, slug: restaurantName?.toString().replaceAll(" ", "-") ?? 'unnamed-restaurant', service: DeliveryService.tenbis, deliveryPrice: restaurantDeliveryPrice, deliveryInt: restaurantDeliveryInt, estimateRange: restaurantDeliveryETA, online: restaurantOnline ?? false, eta: restaurantETA, country: "", score: restaurantRating, priceRange: null)); } } print(++index); } catch (e, stackTrace) { print('处理第${index+1}个餐厅时出错: $e'); print('错误堆栈: $stackTrace'); index++; } } return restaurants;
额外检查点
- 确认
hiddenRestaurants没有意外包含所有餐厅名称,导致所有元素都被过滤,你可以在循环里加个print看看哪些餐厅被跳过了。 - 确认
jsonResponse['Restaurants']确实是一个非空列表,避免循环根本没执行。
按照这些修改后,应该就能解决循环无法完成、无返回值的问题了!
备注:内容来源于stack exchange,提问作者Shaked Levy
相关产品推荐
相关产品推荐

