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
相关产品推荐
相关产品推荐

