1. 开启flutter
代码规范,使用flutter
团队代码规范使用我们代码更性能更高效。
2. 使用const
修饰widget
,这样可以使用系统知道我们的widget
可以缓存下来,提高rebuild
的效率。
3. 我们再开发中经常会把复杂的wiedget
提取出一个方法使用代码看起来比较简洁,其实Flutter
团队建议封装成个StatelessWidget
性能会更好,你封装成方法底层框架不是你这方法是否需要复用所以他是不会缓存起来,如果你封装成一个StatelessWidget
系统就知道你这个Widget
是可以缓存复用的,间接提高效率。
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
的背景颜色实现。