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

Flutter/Dart中while循环仅执行一次的问题求助

问题排查:Flutter/Dart中while循环仅执行一次的原因及修复

核心问题分析

你的循环只执行一次,本质原因是第一次循环的成功分支里直接调用了return语句——函数执行到return会立即终止,后续循环迭代根本没机会运行。另外还有个小问题:当前循环条件i < 12+初始值i=1,实际只会执行11次(i从1到11),和你预期的12次不符。

具体问题点

  • 提前return终止函数:在if (response.statusCode == 200)代码块里,你执行完setState后直接return cardBillsall.map(...),这会让整个fetcheach函数直接返回,循环被迫中断。
  • 循环次数偏差:i <12的条件下,i从1开始,最后一次执行是i=11,总共11次,不是你要的12次。

修复方案及代码示例

  1. 移除循环内部的return,等所有循环完成后统一返回结果;
  2. 调整循环条件为i <=12(确保覆盖1-12月,共12次);
  3. 把token读取和headers初始化移到循环外,避免重复IO操作。

修正后的代码:

Future<List<Evsebillall>> fetcheach() async {
  // 仅读取一次token,减少重复存储IO
  String? token = await this.storage.read(key: "token");
  Map<String, String> headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer " + (token ?? ""),
  };

  int i = 1;
  // 调整条件为i<=12,确保执行12次(1-12月)
  while (i <= 12) {
    print(i);
    try {
      final response = await http.get(
        Uri.parse(
          "${this.serverIP}:${this.serverPort}/user/contractedChargeTransactions?month=$i&year=2022",
        ),
        headers: headers,
      );

      if (response.statusCode == 200) {
        setState(() {
          cardBillsTotaleach = jsonDecode(response.body)["cardBillsTotal"] as List;
          var resultTotal = cardBillsTotaleach.map((e) => Evsebill.fromJson(e)).toList();
          if (resultTotal.isNotEmpty) {
            TotalTotaleach = resultTotal[0].total;
            print("totaleach =$TotalTotaleach");
            Totaleachlist.add(TotalTotaleach);
          }
          print("listtotal =$Totaleachlist");
        });
      } else {
        print("加载第$i月账单失败:状态码${response.statusCode}");
        // 可选:若需单个失败就终止,取消下面注释
        // throw Exception('Failed to load Bills for month $i');
      }
    } catch (e) {
      print("获取第$i月账单出错:$e");
      // 捕获异常,避免单个请求失败导致整个循环终止
    }
    i++;
  }

  // 所有循环完成后统一返回结果
  return cardBillsall.map((e) => Evsebillall.fromJson(e)).toList();
}

额外优化说明

  • 添加try-catch包裹请求逻辑,避免单个月份请求抛出异常时,整个循环直接终止;
  • 提取token和headers到循环外,减少不必要的存储读取和对象创建,提升性能;
  • 可根据业务需求,决定单个请求失败时是继续执行还是终止函数。

内容的提问来源于stack exchange,提问作者Bill Tertis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:05:21