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

Flutter 长列表优化的更多相关文章

  1. UIWrapContent(NGUI长列表优化利器)

    NGUI长列表优化利器 优化原理 NGUI3.7.x以上版本 有个新组件 UIWrapContent ,当我们的列表内容很多时,可以进行优化.它不是一次生成全部的child,而是只有固定数量的chil ...

  2. 记一次vue长列表的内存性能分析和优化

    好久没写东西,博客又长草了,这段时间身心放松了好久,都没什么主题可以写了 上周接到一个需求,优化vue的一个长列表页面,忙活了很久也到尾声了,内存使用和卡顿都做了一点点优化,还算有点收获 写的有点啰嗦 ...

  3. react-native中使用长列表

    React Native 提供了几个适用于展示长列表数据的组件,一般而言我们会选用FlatList或是SectionList. FlatList组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而 ...

  4. Flutter ListView 列表组件

    列表常见的情况: 1.垂直列表 2.垂直图文列表 3.横向列表 4.动态列表 名称 类型 说明 scrollDirection Axis Axis.horizontal 横向列表 Axis.verti ...

  5. React解决长列表方案(react-virtualized)

    github地址 高效渲染大型列表的响应式组件 使用窗口特性,即在一个滚动的范围内,呈现你给定数据的一小部分,大量缩减了呈现组件所需的时间,以及创建DOM节点的数量. 缺点:滑动过快,可能会出现空白的 ...

  6. 网络编程Netty IoT百万长连接优化

    目录 IoT推送系统 IoT是什么 IoT推送系统的设计 心跳检测机制 简述心跳检测 心跳检测机制代码示例 百万长连接优化 连接优化代码示例 TCP连接四元组 配置优化 IoT推送系统 IoT是什么 ...

  7. [UGUI]滑动列表优化(循环利用)

    需要注意的有下面几点: 1. 区分好表现上的index和逻辑上的index.表现上的index是指这个go是go列表中的第几项,但实际上这个index的意义并不大,因为在滚动的过程中go列表是轮转的: ...

  8. PoI导出列表优化

    针对写了头信息之后,使用for循环遍历会导致数据丢失问题的优化,使用迭代器替代for循环,具体如下: public static boolean ExportDeptLeaderFileToLocal ...

  9. h5ai目录列表优化

    h5ai是HTTP Web服务器的现代文件索引器,专注于您的文件.目录以有吸引力的方式显示,浏览它们通过不同的视图,面包屑和树状概述增强.最初,h5ai是HTML5 Apache Index的缩写,但 ...

  10. Python笔记9-----不等长列表转化成DataFrame

    1.不同长度的列表合并成DataFrame. 法1: ntest=['a','b'] ltest=[[1,2],[4,5,6]] 先变成等长的列表:(a:1),(a:2),(b:4),(b:5),(b ...

随机推荐

  1. foobar2000 v1.6.13 汉化版(更新于2022.11.22)

    foobar2000 v1.6.13 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  2. c++中的读写锁

    读写锁是一种特殊的锁机制,允许多个线程同时读取共享数据,但在写入共享数据时,只有一个线程可以进行写操作,其他线程必须等待. 这种机制对于读多写少的场景非常有效,可以提高并发性能.以下是通过 share ...

  3. 利用cv2.dilate对图像进行膨胀

    cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))介绍,请看这个博客.我简要说一下cv2.getStructuringElement,可用于构造一个特定大 ...

  4. Nodejs C++插件(N-API)

    Nodejs C++插件(N-API) 0. 环境搭建 1. JS中调用C++方法 1.1 JS中调用源文件的C++方法 1.2 JS中调用动态库的C++方法 2. C++中调用JS方法 2.1. C ...

  5. 在Vue3中如何实现四种全局状态数据的统一管理?

    四种全局状态数据 在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端).同步数据.同步数据又分为三种:localstorage.cookie.内存.在传统的 Vue3 当中,分别采用不同 ...

  6. 工作使用:Exchange问题汇总

    工作使用:Exchange问题汇总 1:邮件不能发给公司内部的人,但是可以发公司外部人员 解析:GC出问题 2:xchange 2016环境,最近经常发生邮件队列堆积的现象.邮件服务器整体性能看上去没 ...

  7. 鲸鸿动能广告助力App流量高效变现,促进商业增长

    广告是App开发者实现流量变现的常用方法之一.当App积累了一定数量的用户后,开发者需要考虑如何有效地将流量转化为收入,以支持App的商业可持续增长. HarmonyOS SDK广告服务(Ads Ki ...

  8. 高效求解 n 个点之间的最大曼哈顿距离

    平面上有 n 个点,如何求出任意两点的曼哈顿距离的最大值? 曼哈顿距离的公式为: \[d((x_1, y_1), (x_2, y_2)) = |x_1 - x_2| + |y_1 - y_2| \] ...

  9. 基于QToolButton封装,解决Icon不能设置hover和press态的问题

    1 #pragma once 2 #include <QToolButton> 3 #include <QBoxLayout> 4 #include <QLabel> ...

  10. 指针进阶(C语言终)

    1. sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候,我们学习了sizeof , sizeof 计算变量所占内存内存空间大小的,单位是 字节,如果操作数是类型的话,计算的是 ...