1.框架层优化
1)及时更新Flutter版本,每个新的版本都会有很多性能上的优化
2)关注Flutter代码规范,使用Flutter团队代码规范使用我们代码更性能更高效,如Android Studio的Dart Analysis
3)使用状态管理框架对widget实现局部刷新,常用的状态管理框架有provider,get
2.代码优化
1)简单的ui样式,可以自己封装实现
系统封装的按钮功能比较丰富里面的Widget嵌套很多,但是实际业务需求可能只需要些普通效果,为了提升性能可以根据需求自定义封装达到突破性能瓶颈
2)如果要执行一些比较耗时操作建议使用isolate,如果任务比较耗时使用异步也会导致ui卡顿
3)优先使用StatelessWidget,而不是全部用StatefulWidget
使用 StatelessWidget 的最大好处在于:能尽量避免不必要的重建
4)使用Widget 而不是函数
5)避免在Build()方法中,堆砌大量Widget,将 Widget 拆小,这样 Widget 会享有更细粒度的重建和复用。
6)尽可能地使用 const,为此,同样应该尽可能地使用 const 构造器。
7)避免更改组件树的结构和组件的类型,树结构改变会导致树重新rebuild
使用Visibility,而非If、else判断
8)对于频繁更新的控件(比如倒计时,秒表),使用RepaintBoundary隔离它,让他在一个独立的paint区域
9)避免调用 saveLayer,这是一种昂贵的操作。
10)尽量减少不透明度和剪裁的使用(opacity and clipping)
11)在保证清晰度的情况下,尽量使用小尺寸图片
12)列表优化
A、如果展示大量数据请使用 ListView.builder 或者 ListView.separated,尽量避免使用 ListView(children: [],) 或 GridView(children: [],)。
B、如果item布局高度可以固定可以使用itemExtent 属性提高性能(提高系统测量效率)
C、减少可折叠 ListView 的构建时间:针对于可折叠的 ListView,未展开状态时,设置其 itemCount 为 0,这样 item 只会在展开状态下才进行构建,以减少页面第一次的打开构建时间。
13)动画优化
AnimatedBuilder 、TweenAnimationBuilder 等一类的组件的问题,这些组件都有一个共同点,带有 builder 且其参数重有 child。以 AnimatedBuilder 为例,如果 builder 中构建的树中包含与动画无关的组件,将这些无关的组件当作 child 传递到 builder 中比直接在 builder 中构建更加有效。
14)分帧渲染
错峰加载方案使用分帧渲染,分帧渲染的原理是将一棵Widget树中的部分绘制时间较长的节点在第一帧时只占位不绘制,等到下一帧开始时,节点替换UI占位,单独使用一帧时间绘制。