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

Flutter中ListView展示月度数据仅显示最后一条索引数据问题

问题原因

你的问题核心在于单个变量data被循环反复覆盖——每次循环都会把当前条目的月度数据赋值给data,循环结束后data只会保留最后一条数据的值,所以ListView里所有条目都只会显示这个最后值。而且你一开始定义的data不是数组,用data[childIndex]自然无效。

另外注意:原代码循环从i=1开始,会漏掉transactionLists[0]这条数据,建议循环起始索引改为0。


解决方案

方案1(推荐:直接在条目构建时处理,无需提前循环)

直接在ListView.builder的回调里,根据当前条目索引和选中月份提取对应数据,代码更简洁高效,还能避免提前循环的内存消耗:

myMethod(){
  return ListView.builder(
    padding: EdgeInsets.zero,
    shrinkWrap: true,
    physics: const NeverScrollableScrollPhysics(),
    itemCount: transactionLists.length,
    itemBuilder: (context, childIndex) {
      String data;
      final currentItem = transactionLists[childIndex];
      // 用switch替代多if,代码更整洁
      switch(monthName[monthIndex]){
        case "July":
          data = currentItem.july.toString();
          break;
        case "August":
          data = currentItem.august.toString();
          break;
        case "September":
          data = currentItem.september.toString();
          break;
        case "October":
          data = currentItem.october.toString();
          break;
        // 补充其余12个月的case
        default:
          data = ""; // 无匹配时的默认值
      }
      return Text(data);
    },
  );
}

方案2(修改原循环逻辑:用列表存储所有数据)

如果一定要保留提前处理的逻辑,把data改成列表,循环时将每个条目对应的数据添加进去:

// 先声明存储所有数据的列表
List<String> dataList = [];

myMethod(){
  dataList.clear(); // 每次调用先清空旧数据,避免重复叠加
  // 循环从0开始,确保不会漏掉第一条数据
  for (var i = 0; i < transactionLists.length; i++) {
    String itemData;
    final currentItem = transactionLists[i];
    if (monthName[monthIndex] == "July") {
      itemData = currentItem.july.toString();
    } else if (monthName[monthIndex] == "August") {
      itemData = currentItem.august.toString();
    } else if (monthName[monthIndex] == "September") {
      itemData = currentItem.september.toString();
    } else if (monthName[monthIndex] == "October") {
      itemData = currentItem.october.toString();
    } 
    // 补充其余月份的判断
    else {
      itemData = "";
    }
    dataList.add(itemData); // 将当前条目数据加入列表
  }
  return ListView.builder(
    padding: EdgeInsets.zero,
    shrinkWrap: true,
    physics: const NeverScrollableScrollPhysics(),
    itemCount: transactionLists.length,
    itemBuilder: (context, childIndex) {
      return Text(dataList[childIndex]); // 取列表对应索引的值
    },
  );
}

内容的提问来源于stack exchange,提问作者Ravindra S. Patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:55:17