Performance 在颤振中使用大量图像(缩略图)提高滚动性能

Performance 在颤振中使用大量图像(缩略图)提高滚动性能,performance,listview,flutter,dart,flutter-layout,Performance,Listview,Flutter,Dart,Flutter Layout,我一直在制作一个有水平列表的应用程序(类似于Spotify)。在这些水平列表中,是使用CachedNetworkImage小部件显示的缩略图 我还没有设法使滚动性能平稳(每帧少于16毫秒,或者接近16毫秒) 以下是一些示例代码(使用lorem picsum获得随机生成的JPEG): 有效地(尽管在实际应用中这会明显不同),列表中有600个图像(30个水平列表,每个列表20个图像)要显示。lorem picsum自动生成的JPEG为100x100 这是否过于雄心勃勃,无法在颤振中顺利执行,还是我在

我一直在制作一个有水平列表的应用程序(类似于Spotify)。在这些水平列表中,是使用CachedNetworkImage小部件显示的缩略图

我还没有设法使滚动性能平稳(每帧少于16毫秒,或者接近16毫秒)

以下是一些示例代码(使用lorem picsum获得随机生成的JPEG):

有效地(尽管在实际应用中这会明显不同),列表中有600个图像(30个水平列表,每个列表20个图像)要显示。lorem picsum自动生成的JPEG为100x100

这是否过于雄心勃勃,无法在颤振中顺利执行,还是我在这里遗漏了什么?

我会关注颤振团队优化颤振应用程序的情况。基本上,对于列表中显示的每个项目,您至少要创建15个新的小部件(const小部件应该被缓存),这将是600*15=9000个小部件


如果要跳转到解决方案,请尝试将项目提取到无状态小部件中,该小部件接受当前索引作为参数并呈现项目。这很可能会加快速度。

我确实看了那场演讲,但出于某种原因,天文台似乎对我不起作用(),无论如何,我尝试了你所说的,它大大提高了性能,所以我会接受。谢谢!
Widget build(BuildContext context) {
    return new Scaffold(
      backgroundColor: Colors.black,
      body: new CustomScrollbar(
        child: new ListView.builder(
          controller: _scrollController,
          itemCount: 30,
          itemBuilder: (context, index){
            return new Padding(
              padding: const EdgeInsets.symmetric(vertical: 10.0),
              child: new Container(
                width: double.infinity,
                height: 100.0,
                child: new ListView.builder(
                  scrollDirection: Axis.horizontal,
                  itemCount: 20,
                  itemBuilder: (context, innerIndex){
                    return new Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 10.0),
                      child: new Container(
                        height: 100.0,
                        width: 100.0,
                        alignment: Alignment.center,
                        decoration: BoxDecoration(
                          border: Border.all(color: Colors.white, width: 1.0),
                          borderRadius: BorderRadius.circular(10.0)
                        ),
                        child: new ClipRRect(
                          borderRadius: BorderRadius.circular(10.0),
                          child: new CachedNetworkImage(
                            imageUrl: _thumbnailsByArtist[index.toString()][innerIndex],
                          ),
                        ),
                      ),
                    );
                  }
                ),
              ),
            );
          }
        ),
      )
    );
  }