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. 五行强度得分_喜用神api免费接口_json数据八字五行强弱接口

    本API接口基于深厚的八字学原理,为用户提供详尽的五行(金.木.水.火.土)强弱分析.五行打分评估,以及精准的喜用神判断.用户只需输入自己的八字信息,即可获得全面而深入的命理解读. ‌一.核心功能‌ ...

  2. 谈谈你对 vue 的理解

    vue 是创建用户界面的 js 框架 ,是创建 spa 应用的框架 :使用 mvvm 模式,数据驱动视图模型 ,业务逻辑和页面解构分离开发:使用高效的 diff 算法渲染页面结构 : 采用组件化模式, ...

  3. Vue 项目优化解决方案 有哪些 ?

    1. 打包的时候 , 通过插件把css代码单独抽离出来使用 link 引入 2. 打包的时候 , 通过webpack内置插件optimization  把 公共的js代码抽离出来 ps:打包之后,代码 ...

  4. 谈谈 keep-alive 组件,以及它们的实现原理

    keep-alive 组件的使用场景: 我们切换 2 个组件的时候,2个组件会轮流被销毁创建,但是现在需求,切换到一个组件,另一个组件不会别销毁,会保留原来的状态 :就要使用 vue 内置的组件 ke ...

  5. activiti教程

    一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进行传递文档.信息或任务的过程,从 ...

  6. mysql主从复制详细部署

    1.异步复制:这是MySQL默认的复制模式.在这种模式下,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理.这种模式的优点是实现简单,但缺点是如果主库崩溃,已经提 ...

  7. springboot-实现excle文件导出的单元格相同内容合并

    导出excle文件中的单元格有些需要合并如何操作 例如:左边的表格想合并单元格成右边的表格更加便于观看           一.依赖文件 <!-- excle操作--> <depen ...

  8. 分支定界方法(branch and cut,branch and price的基础)

    分支定界方法(branch and cut,branch and price的基础) 目录 1.基础版的分支定界算法(假设是min问题) 2.分支定界算法的步骤及其注意事项 2.1 具体的分支定界方法 ...

  9. TrueNAS关闭5357端口

    sockstat -4l 查看监听5357端口进程的ID. 用kill -9 PID 干掉进程.

  10. spring boot下跨域安全配置

    1 @Bean 2 public FilterRegistrationBean corsFilter() { 3 final UrlBasedCorsConfigurationSource sourc ...