flutter开发性能优化

1. 开启flutter代码规范,使用flutter团队代码规范使用我们代码更性能更高效。

2. 使用const修饰widget,这样可以使用系统知道我们的widget可以缓存下来,提高rebuild的效率。

3. 我们再开发中经常会把复杂的wiedget提取出一个方法使用代码看起来比较简洁,其实Flutter团队建议封装成个StatelessWidget性能会更好,你封装成方法底层框架不是你这方法是否需要复用所以他是不会缓存起来,如果你封装成一个StatelessWidget系统就知道你这个Widget是可以缓存复用的,间接提高效率。

1)、允许性能优化:const 构造函数,更细粒度的重建等等。

2)、确保在两个不同的布局之间切换时,能够正确地处理资源(因为函数可能重用某些先前的状态)。

3)、确保热重载正常工作,使用函数可能会破坏热重载。

4)、在 flutter 自带的 Widget 显示工具中能看到 Widget 的状态和参数。

5)、发生错误时,有更清晰的提示:此时,Flutter 框架将为你提供当前构建的 Widget 名称,更容易排查问题。

6)、可以定义 key 和方便使用 context 的 API

4. 使用状态管理框架对widget实现局部刷新,常用的状态管理框架有provider,mobx,get,前面两个都是Flutter社区推荐的。

5. 避免更改组件树的结构和组件的类型,树结构改变会导致树重新rebuild。如果需要返回两种不同类型的widget,可以把变化的widget封装到StatefulWidget里面,如果你使用状态管理框架可以封装到StatelessWidget里面。添加const或key实现缓存复用。

6. ListView是我们最常用的组件之一,用于展示大量数据的列表。如果展示大量数据请使用ListView.builder 或者 ListView.separated, 实现复用,如果item布局高度可以固定可以使用itemExtent 属性提高性能(提高系统测量效率)。

7. AnimatedBuilder 、TweenAnimationBuilder 等一类的组件的问题,这些组件都有一个共同点,带有 builder 且其参数重有 child。以 AnimatedBuilder 为例,如果 builder中构建的树中包含与动画无关的组件,将这些无关的组件当作 child 传递到 builder 中比直接在 builder 中构建更加有效。

8. 避免调用 saveLayer(调用 saveLayer()会开辟一片离屏缓冲区。将内容绘制到离屏缓冲区可能会触发渲染目标切换,这些切换在较早期的 GPU 中特别慢)。

9. 如果你要执行一些比较耗时操作建议使用isolate,如果任务比较耗时使用异步也会导致ui卡顿。

10. 优先使用StateLessWidget,而不是全部用StateFulWidget。

11. 对于频繁更新的控件(比如倒计时,秒表),使用RepaintBoundary隔离它,让他在一个独立的paint区域。

12. 简单的ui样式,可以自己封装实现。

13. 建议及时更新Flutter版本,每个新的版本都会有很多性能上的优化。

14. Opacity减少使用特别是动画中,淡入效果可以使用AnimatedOpacity和FadeInImage,透明效果可以设置widget的背景颜色实现。

链接:Flutter常用性能优化方式 - 简书

15、我们应该尽量避免在 build() 中执行耗时操作,因为 build() 会被频繁地调用,尤其是当 Widget 重建的时候。比如一些计算任务,尽量不要放到build里面,除非每次build的时候都要重新计算

16在build里面不要进行文件,数据库,网络请求等阻塞操作

17: 启用代码缩减和资源缩减

打开 minifyEnabled 和 shrinkResources,构建出来的 release 包会减少 10% 左右的大小,甚至更多

18: 针对 ListView item 中有 image 的情况来优化内存

Listview 里的item移除之后默认不会删除,因为其addAutomaticKeepAlives和addRepaintBoundaries属性默认为true,如果持有大图片,那么就会严重消耗内存,所以需要移除之后立马销毁item,只需要如下设置,但是每次进入屏幕都要重新加载渲染,有利有弊,有大图可以选择牺牲渲染,优化内存,listview如何item高度固定,可以设置itemExtent

ListView.builder(

  ...

  addAutomaticKeepAlives: false (true by default)

  addRepaintBoundaries: false (true by default)

);

19: 构建单 ABI 架构的包

目前手机市场上,x86 / x86_64/armeabi/mips / mips6 的占有量很少,arm64-v8a 作为最新一代架构,是目前的主流,而 armeabi-v7a 只存在少部分的老旧手机中

flutter build apk --split-per-abi

15:熟悉flutter的渲染管线,flutter rebuild ,relayout ,repaint的原理机制,在页面绘制中尤其是动画中,尽量降低局部变化对全局的rebuild,relayout,repaint,这边需要注意,平时只会注意局部rebuild对全局rebuild的影响,其实还要考虑是否引起了不必要的relayout和repaint,rebuild 比较好监听,可以在代码中打断点或者查看

如果要监听是否有不必要的repaint,如何监听?

使用这个,然后查看手机中布局的边框颜色,只要颜色变一次,就说明repaint了一次

比如书城顶部的appbar,里面包含了一个小动画,最理想的状态,动画触发的时候,几不会引起全局的rebuild,也不会引起全局的relayout,也不会引起全局的repaint

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值