Flutter ListView仅渲染列表1个子元素的问题排查
可能的原因如下
- 全局列表引用被反复覆盖
你代码中dataRowsForCompletedExercises = [];写在for循环内部,每次遍历都会清空这个类级别/全局的列表,而你生成的_completedExercisesDataTableWidget如果是直接引用这个列表构建内容,所有添加到completedExercisesWidgetsList的组件都会共享同一个列表实例。后续循环清空列表时,前面已经添加的组件的内容也会同步被清空,只有最后一次循环生成的组件能保留数据,视觉上就只显示1个元素。
修复方案:每次循环单独创建新的行列表,把当前练习的行列表作为参数传给_completedExercisesDataTableWidget,不要用共享的全局变量存储行数据。 - 条件判断导致大部分组件无内容
你代码中if (!(doc.id == exerciseId))的判断如果仅1个doc满足,剩下5个doc遍历后dataRowsForCompletedExercises始终为空,对应的_completedExercisesDataTableWidget没有可渲染的行,高度为0,视觉上无法观测到,看起来就像只渲染了1个。 - 布局约束异常
如果你返回的ListView嵌套在其他滚动组件(如另一个ListView、SingleChildScrollView)中,即使设置了shrinkWrap: true,也可能出现高度计算错误,仅第一个组件能正常撑开高度,后续组件高度被压缩为0无法显示。 - 组件高度占满视口
如果_completedExercisesDataTableWidget的高度被设置为父容器最大高度,第一个组件会占满整个ListView的可视区域,后续组件需要手动滚动才能看到,容易被误认为没有渲染。 - Key重复导致渲染异常
如果所有_completedExercisesDataTableWidget使用了相同的Key,Flutter的组件Diff算法会判定它们是同一个组件,仅保留最后一个的状态进行渲染,前面的组件会被忽略。
内容的提问来源于stack exchange,提问作者who-aditya-nawandar
相关产品推荐
相关产品推荐

