滚动时触发的 ListView itemBuilder 方法

Posted

技术标签:

【中文标题】滚动时触发的 ListView itemBuilder 方法【英文标题】:ListView itemBuilder method triggered on scroll 【发布时间】:2021-08-07 04:09:07 【问题描述】:

我正在使用带有以下 itemBuilder 的 ListView.separated

itemBuilder: (context, index) 
                return _buildRow(dataList[index]);
              

我注意到这个 _buildRow() 方法是在我滚动时触发的。它似乎只触发滚动时屏幕外的行。

我不使用 _buildRow() 中的 setState() 方法。 另外,我验证了超级方法 build(BuildContext context) 没有被触发。它实际上只是 itemBuilder 之一。

我不确定这是否是正常行为。有没有办法避免在滚动时重新触发 itemBuilder 方法?如果这不可能,有没有办法在 ListView 构建完成后触发方法?

【问题讨论】:

我相信这个答案应该澄清一切:***.com/a/56272858/12964903 是的,这是完全正常的行为。 ListView 根据需要构建它的子视图。如果您的孩子在列表区域之外,则不会构建该孩子。此外,当一个孩子出现在屏幕上并离开列表区域时,它会非常有效地为下一个即将到来的孩子回收该视图。 【参考方案1】:

ListView.separated在滚动时重新触发了它的itemBuilder,因为它只加载屏幕上显示的项目,不像ListView在初始化时加载所有项目,因为这个ListView不是一个好长列表的选项。

当我们有一个长列表和复杂的小部件要呈现为ListView.separated 的项目时,这会显着提高性能。这是问题中提到的预期行为。

【讨论】:

以上是关于滚动时触发的 ListView itemBuilder 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ListView 的项目构建器之前添加初始小部件,或者如何在 ListView.itemBuilder 之上注入小部件?

Flutter实战自定义滚动条

Flutter:防止边缘削波

如何让滚动条一直可见?

ListView 更新后滚动到顶部

在 Xamarin Forms iOS 中出现 ListView 之前,如何将 ListView 滚动位置设置为底部?