You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 15:27:27