首页 > 其他分享 >性能优化 flutter

性能优化 flutter

时间:2024-03-05 17:02:10浏览次数:26  
标签:widget saveLayer 方法 性能 StatefulWidget 使用 优化 flutter 页面

 

1.widget build()方法避免执行重复耗时的非必要操作
避免在widget或者state的build()方法中进行重复且耗时的非必要工作,因为当父 widget 重建时,子 widget 的 build() 方法会被频繁地调用。因此确保非必要的耗时工作不放在build()方法中。

2.控制widget setState()的重建范围
在StatefulWidget中调用setState()会引起该widget的重建,会调用state的build()方法。当一个页面只有一个StatefulWidget,把全部widget的状态都放在这个StatefulWidget,并且该StatefulWidget为页面最顶端的父widget时,setState方法会让整个页面的widget重建。因此,将一个页面中的widget进行多个StatefulWidget的状态划分,每个StatefulWidget只负责自己的状态维护,将大大缩小flutter页面绘制范围。

3.控制widget重建次数
不会改变的widget使用const,如Text、Icon、Image等,这样可以复用这部分widget,不会导致widget重建
动画使用AnimatedBuilder时,将不需要动的子widget赋值给child参数,builder方法中使用该child,可以做到复用子widget,以避免在动画过程中重建其后代 widget。
使用CustomPaint自定义组件的时候,使用重写shouldRepaint方法,返回false即不重绘,true为重绘,我们可以根据条件返回true,减少自定义组件的重绘次数

4.尽量避免saveLayer操作
saveLayer方法是Flutter框架中最重量的操作之一。更新屏幕时这个方法很有用,但它可能使应用变慢,如果不是必须的话,应该避免使用这个方法。即便没有显式地调用saveLayer,也可能在其他操作中间接调用了该方法。
有两个方法可以检查页面是否使用saveLayer,
1.可以使用在MeterialApp中时使用checkerboardOffscreenLayers属性开关来检查当前界面是否使用了saveLayer,打开开关之后,运行应用并检查是否有图像的轮廓闪烁。如果有新的帧渲染的话,容器就会闪烁;
2.使用flutter screenshot --type=skia --observatory-url=这里填timeline的观察台地址,生成skp文件,再上传到https://debugger.skia.org/,就可详细分析页面中的saveLayer的调用,推荐该方法,第一种方法有的saveLayer无法检查出来。
在官网中可以看到,以下组件会触发saveLayer,应尽量避免使用,寻找其他代替。透明度(Opacity)、裁剪(clipping)、阴影(shadows)以及文字(Text)

5.使用懒加载、按需加载模型Slive
滚动列表中SingleChileScrollView不支持Slive,会直接加载整个子widget,如果滑动部分很长,请使用ListView、gridView等支持按需加载模型的列表,并且使用ListView.builder或者ListView.separated加载子项。

6.使用RepaintBoundary
使用RepaintBoundary,给页面设置重绘范围,将提高我们的性能。比如页面滑动不需要重绘动画,使用RepaintBoundary包住我们的动画widget,页面滑动将不会导致动画重绘。还可以用该widget包住我们的图片,做图片缓存,ListView里面就使用了RepaintBoundary来包住item,缓存item。

7.复用Element
element tree是flutter三棵树之一,我个人把他当作渲染树的manager,widget内部有个canUpdate方法。

 

原文链接:https://blog.csdn.net/weixin_42468452/article/details/120534954

标签:widget,saveLayer,方法,性能,StatefulWidget,使用,优化,flutter,页面
From: https://www.cnblogs.com/huangzs/p/18054406

相关文章

  • 前端性能优化
    1、尽量不要使用第三方库,考虑是否可以通过代码实现,比如时间格式化,可以自己写代码实现指定格式的转换,不要使用第三方库来实现,这样可以减少打包代码的体积2、去除大的base64体积3、首屏数据尽量并行,让一些小的接口合并到其他接口,请求接口的时间包括三次握手的时间,这也是时间,合并到......
  • 2024 年春节集训 _ 第二课 - 数据结构优化动态规划
    【例题\(1\)】递增子序列\(\color{white}{link}\)考虑\(dp.\)\(dp[i][j]\)表示以元素\(i\)为结尾,长度为\(k\)的方案数。那么显而易见就有一个转移方程:\[dp[i][j]=\sum_{a[k]<a[i],\k<i}dp[k][j-1]\]先抛去第二维度的\(j\),这是可以做一个关于\(a[i]\)值的大......
  • 基于preparedStatement方式优化
    1packagecom.atsyc.api.preparedstatement;23/*4*使用预编译statement完成用户登录5*6*TODO:7*防止注入攻击,演示preparedstatement完成用户登录8*/910importjava.sql.*;11importjava.util.Scanner;1213publicclassPSUserLogi......
  • spfa优化
    1.SLF优化在我们学SPFA的时候,要把每一个入队的点插入到队尾,可是有些时候这个点作为队尾没有作为队头效率高,因为这个点有时放在队首就能直接用,那么什么样的点作为队首更好呢?当然是dis值越小越可能刷新其它\(dis\)值,所以对比当前元素与对首元素的\(dis\)值,如果当前元素的\(dis......
  • 使用 explain 索引优化(转)
    使用explain索引优化(转)原文:https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ==&mid=2247490262&idx=1&sn=a67f610afa984ecca130a54a3be453ab&source=41#wechat_redirect1、前言对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢......
  • 聊聊sql优化的15个小技巧(转)
    原文:https://mp.weixin.qq.com/s/DsUrEHdkMvsO7RvnDcKNhg1避免使用select*很多时候,我们写sql语句时,为了方便,喜欢直接使用select*,一次性查出表中所有列的数据。反例:select*fromuserwhereid=1;在实际业务场景中,可能我们真正需要使用的只有其中一两列。查了很多数据,但......
  • Flutter的Icon
    1基本的组件使用(自带)Cloumn算一个和自定义Container齐平的一个组件使用比较简单,但是Icon中有很多对Icon进行设置的方式疑问:是否能够对Icon进行圆角修饰呢??returnconstColumn(children:[SizedBox(height:20,),Icon(Icons.home_work_rounded,......
  • mysql8.0 性能优化配置 innodb_buffer_pool_size(配置原则和方式)
    1. BufferPool缓冲池是主内存中的一个区域,InnoDB在访问表和索引数据时会在该区域进行缓存。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,通常会将高达80%的物理内存分配给缓冲池。2.简单优化把innodb_buffer_pool_size设置为1G。专用服务......
  • flutter动画— —显式动画
    常见的显式动画有RotationTransition、FadeTransition、ScaleTransition、SlideTransition、AnimatedIcon。在显示动画中开发者需要创建一个AnimationController,通过AnimationController控制动画的开始、暂停、重置、跳转、倒播等。RotationTransition(旋转动画)、AnimationC......
  • 44对象优化
    对象优化对象优化的原则:函数参数传递的过程中,对象优先按引用传递,不要按值传递,这样少形参的构造和析构函数返回对象时,优先返回一个临时对象,而不要返回一个定义过的对象,这样少一个函数中对象的构造析构接受返回值是对象的函数调用时,用初始化的方式接受,而不用先定义再赋值的方式......