近日,见到有人遇到针对特殊列表滚动时占用内存严重导致闪退的问题,原因是没有对列表中的动画和加载的耗时操作做优化。我们知道,cell是重用的,没加载在屏幕上的cell内部是不会进行布局和任务处理的,而加载完的列表最多也就一屏,所以这个问题发生一定是在滑动的时候大量加载动画导致的。
知道了原因,我们只需要在滑动时控制动画的加载和暂停与否就可以优化这个列表。
在原生中这种优化比较常见,也不难,但出现的场景却颇为少见,接下来,我们针对原生思想来对这样一个列表做优化。
在网上搜索了下针对这个问题的博客,都是讲的监听,也是从官方那里拿来的,对于怎么使用讲解也比较浅薄,对于一个初学者来说不好下手,这也是这篇博客诞生的初衷,帮助初学者更好的学习监听列表状态,并解决一些优化问题。
ps:虽说这个东西简单,那也只是针对有丰富开发经验的人来说,对于一些入行几年的人,还是有些难度的。
方案一:
博主一开始想到的是通过ScrollController监听ListView的滑动偏移量,通过一个bool变量来控制全局的cell内显示,我们来看下效果:

在上图中发现了一个问题,暂停后,列表的状态并没有恢复,代码部分也没有执行,这明显不是我们想要的效果,通过打印偏移量发现没有规律可言,即使滑动速度慢的地方偏移量变化和速度快的地方差别也不大,所以不能作为依据来改变bool值,这套方案只能pass掉。
虽说方案不对,但是监听偏移
本文介绍了如何优化Flutter中的特殊列表,解决滑动时占用内存严重的问题。通过监听ListView滑动状态,控制动画加载和暂停,以避免在滑动时大量加载动画。文中提供了两种方案,一种是通过ScrollController监听滑动偏移量,另一种是使用NotificationListener,后者能更好地满足需求。在实际项目中,还需要判断cell内部状态以确保优化效果。
订阅专栏 解锁全文
2130

被折叠的 条评论
为什么被折叠?



