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次。
修复方案及代码示例
- 移除循环内部的
return,等所有循环完成后统一返回结果; - 调整循环条件为
i <=12(确保覆盖1-12月,共12次); - 把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
相关产品推荐
相关产品推荐

