flutter 性能

2020-08-08  本文已影响0人  liboxiang

https://flutter.dev/docs/perf/rendering/best-practices

ModalRoute中的参数maintainState。其意义为:已经不可见(被上面的盖住完全看不到啦~)的组件,是否还需要保存状态。OverlayEntry类源码中说maintainState设置为true是昂贵的,但是如果maintainState为false,那当不可见时,对应的页面会被销掉,如果pop回去时重新创建的(State 会跑initState方法),那上个页面的状态就无法保持了。这可能也是MaterialPageRoute默认maintainState为true的原因。

这里的saveLayer()是说canvas的saveLayer()方法。一般用于合成特殊效果

  • 剪辑不会调用saveLayer()(除非通过明确请求Clip.antiAliasWithSaveLayer),所以这些操作不像Opacity那样昂贵,但是剪辑仍然很昂贵,
  • 透明图像不要使用Opacity,可以用以下代码
Image.network(
 'https://raw.githubusercontent.com/flutter/assets-for-api-docs/master/packages/diagrams/assets/blend_mode_destination.jpeg',
color: Color.fromRGBO(255, 255, 255, 0.5),
colorBlendMode: BlendMode.modulate
)

可能触发saveLayer()并可能代价高昂的其他小部件:

  • ShaderMask
  • ColorFilter
  • Chip:可能导致saveLayer()如果disabledColorAlpha != 0xff
  • Text— saveLayer() 如果有overflowShader

避免调用saveLayer()

  • 要在图像中实现淡入淡出,请考虑使用 FadeInImage小部件,该小部件使用GPU的片段着色器应用渐变的不透明度。有关更多信息,请参阅Opacity文档。
  • 要创建带有圆角的矩形,而不是应用剪切矩形,请考虑使用borderRadius许多小部件类提供的属性。
上一篇 下一篇

猜你喜欢

热点阅读