首页 > 其他分享 >Flutter 长列表优化

Flutter 长列表优化

时间:2024-06-23 15:22:01浏览次数:21  
标签:缓存 const 列表 像素数 内存 组件 优化 Flutter

Flutter 长列表优化

固定列表和长列表的区别

  • 固定列表中的组件,每次都会被重新构建

  • ListView.builder会按需构建列表元素,也就是只有那些可见得元素才会调用itemBuilder 构建元素

减少列表项的构建次数

  • addRepaintBoundaries :将列表项用一个RepaintBoundary(重绘边界)包裹,在滚动时避免重绘,如果页面比较简单则可以关闭提升流畅度。
  • addAutomaticKeepAlives :对于实际可见的子项,构建器只会调用一次,可以保持状态,如果关闭这个参数可以自己将组件封装到AutomaticKeepAliveClientMixin中保持状态,这样下次列表的子项目滚动进入视野时,build方法就不会被调用。 并且不会丢失状态,可以大幅度减少重绘的消耗。

确定性设置

  • itemExtent可以确定每个列表项的尺寸,避免在绘制的过程中,计算每个列表项的尺寸,产生不必要的运算。在列表项的尺寸固定时可以指定 itemExtent
  • ListView.itemExtentBuilder: 给每一个列表项设置尺寸
ListView.builder(
      itemBuilder: (context, index) {
        return const SizedBox();
      },
      itemExtentBuilder: (int index, SliverLayoutDimensions dimensions) {
        if (index % 2 == 0) {
          return 30;
        } else {
          return 90;
        }
      },
    )

const constructor

const构造函数是一种优化技术,用于创建常量对象。常量对象是指在运行时无法改变的对象,通过使用const构造函数,可以避免在运行时创建新的对象,从而提高性能

cacheExtent的按需定义

cacheExtent属性用于设置列表中预缓存的像素数。默认情况下,cacheExtent的值为0{double? cacheExtent},表示不预缓存任何内容。如果你希望在列表中预缓存一些内容,你可以将其设置为一个合适的值,例如1000.0。这可以提高列表的滚动性能,因为预缓存的像素数越多,滚动时加载的像素数就越少,从而减少了绘制和布局的次数。然而,需要注意的是,预缓存的像素数越多,内存占用越多,所以需要根据实际情况来确定预缓存。

避免使用较大内存的组件

注意在ListView中嵌入内存占用较大的组件,是永远不推荐的,比如较大的图片,这会占用大量内存,导致应用崩溃。或者Webview等PlatformView组件,滑动时也会这会占用大量内存。

避免布局变化

在列表滚动的时候,页面布局发生变化,或者不停更新列表项的尺寸,这是非常不明智的做法。布局变化,那么剩余空间的高度就得重新计算。

Performance overlay

MaterialApp中有showPerformanceOverlay的选项,在调试长列表时,一定要开启,并观测是否有重绘发生,或者掉帧的情况,针对掉帧或者渲染较慢的组件进行优化。开启showPerformanceOverlay是一个好习惯,就像你在web开发时,习惯打开devtool>console,观察页面的渲染情况的习惯,是一样的。

参考:https://www.jkkf.cn/flutter-optimization/component-list.html

标签:缓存,const,列表,像素数,内存,组件,优化,Flutter
From: https://www.cnblogs.com/r1cardo/p/18263483

相关文章

  • 智能优化算法应用:基于平衡优化器算法PID参数优化 - 附代码
    智能优化算法应用:基于平衡优化器算法PID参数优化-附代码文章目录智能优化算法应用:基于平衡优化器算法PID参数优化-附代码1.PID简介2.平衡优化器算法简介3.适应度函数设计4.算法实验与结果5.参考文献:6.Matlab代码摘要:本文主要介绍如何用平衡优化器算法进行PID参......
  • python组合数据类型(列表)
              ......
  • 四. TensorRT模型部署优化-quantization(calibration)
    目录前言0.简述1.校准2.calibrationdataset3.calibrationalgorithm4.如何选择calibrationalgorithm5.calibrationdataset与batchsize的关系总结参考前言自动驾驶之心推出的《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考本次课......
  • 手把手教你java CPU飙升300%如何优化
    背景今天有个项目运行一段时间后,cpu老是不堪负载。排查top命令TOP命令topt按cpu排序topm按内存使用率排序从上面看很快看出是pid4338这个进程资源消耗很高。top-Hppidtop-Hp4338找到对应线程消耗的资源shft+pcpu占用进行排序,shift+m按照内存排......
  • 将socks5列表转换成sing-box格式的json
    将socks5列表转换成sing-box格式的jsonfunctiongetRowMap($tag,$server,$port,$user,$pass){$mRow=[];$mRow['tag']=(string)$tag;$mRow['type']='socks';$mRow['version']='5';$mRow[......
  • 基于鲸鱼优化的knn分类特征选择算法matlab仿真
    1.程序功能描述       基于鲸鱼优化的KNN分类特征选择算法。使用鲸鱼优化算法,选择最佳的特征,进行KNN分类,从而提高KNN分类的精度。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行    3.核心程序  %---开始迭代-------------------------------......
  • C#实现禁用DataGridView控件列表头自动排序功能 (附完整源码)
    C#实现禁用DataGridView控件列表头自动排序功能代码说明:在C#中,可以通过设置DataGridView控件的列的SortMode属性来禁用列头的自动排序功能。以下是一个完整的示例代码,展示了如何实现这一功能:usingSystem;usingSystem.Windows.Forms;​namespace......
  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法
    在ElementUI(为Vue2设计)和ElementPlus(为Vue3设计)中,Descriptions(描述列表)组件通常用于展示一系列的结构化信息。然而,需要明确的是,ElementUI官方库中并没有直接名为Descriptions的组件,但在ElementPlus中,该组件是存在的。以下将分别介绍ElementPlus中的De......
  • 为什么JavaScript要书写优化?
    第一个原因:我们写代码是给机器看的,也是给程序员看的第二个原因:JS是弱类型语言,写得太随意编码风格就不好第三个原因:潜移默化提高程序性能那要怎么书写优化?要按强类型风格写代码varnum,str,obj;//没有指明类型varnumVal=0,strVal=......
  • 3_3、MFC常用控件用法:列表视图、树型控件和标签
    列表视图、树型和标签1、列表视图控件1.1简介通知消息列表视图控件相关结构体1.2创建CListCtrl类的主要成员函数1.3实例2、树型控件2.1简介通知信息相关数据结构2.2创建CTreeCtrl类的主要成员函数2.3实例3、标签控件3.1简介标签页的通知信息标签控件的相关......