如何防止小部件重新呈现在ListView滚动条上

时间:2019-01-24 12:28:17

标签: dart flutter

我正在建立一个包含图片和视频的帖子的时间轴。

在列表中滚动时,图像和帖子本身会不断重新渲染。这会导致应用程序呆滞,因为必须重新计算尺寸+加载图像(第二次加载时从本地缓存中加载)。

如何防止整个帖子小部件被重建?

这是说明的问题。请注意滚动后的加载图标+淡入动画。

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小部件成为有状态的并添加AutomaticKeepAliveClientMixinwantKeepAlive => true,但是并没有改变,总的来说Flutter使用了key属性来防止-项目渲染。

更新:我也尝试过将帖子窗口小部件缓存在本地List<Widget> _postsWidgets变量中,也不会改变任何事情。

1 个答案:

答案 0 :(得分:1)

您的列表看起来像是无限滚动列表,因此,我不建议您缓存OBPost小部件。您如何处理图像缓存?您是否将它们保存到本地文件系统?如果是,那么我建议您也有一个图像小部件的内存缓存。

将builder用于ListView的整个想法是,不创建大量的列表项小部件,而出于内存和性能方面的原因,将它们的数量保持在合理的最低水平。