我正在建立一个包含图片和视频的帖子的时间轴。
在列表中滚动时,图像和帖子本身会不断重新渲染。这会导致应用程序呆滞,因为必须重新计算尺寸+加载图像(第二次加载时从本地缓存中加载)。
如何防止整个帖子小部件被重建?
这是说明的问题。请注意滚动后的加载图标+淡入动画。
Demo of the problem here (GIF)
这是ListView
的代码。
ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
cacheExtent: 30,
addAutomaticKeepAlives: true,
padding: const EdgeInsets.all(0),
itemCount: _posts.length,
itemBuilder: (context, index) {
var post = _posts[index];
return OBPost(
post,
onPostDeleted: _onPostDeleted,
key: Key(
post.id.toString(),
),
);
})
我尝试使OBPost
小部件成为有状态的并添加AutomaticKeepAliveClientMixin
和wantKeepAlive => true
,但是并没有改变,总的来说Flutter使用了key
属性来防止-项目渲染。
更新:我也尝试过将帖子窗口小部件缓存在本地List<Widget> _postsWidgets
变量中,也不会改变任何事情。
答案 0 :(得分:1)
您的列表看起来像是无限滚动列表,因此,我不建议您缓存OBPost小部件。您如何处理图像缓存?您是否将它们保存到本地文件系统?如果是,那么我建议您也有一个图像小部件的内存缓存。
将builder用于ListView的整个想法是,不创建大量的列表项小部件,而出于内存和性能方面的原因,将它们的数量保持在合理的最低水平。