
Flutter 嵌套地狱?不存在的,ConstraintLayout 来解救!(五)
性能优化
1. 当布局复杂时,如果子元素需要频繁重绘,可以考虑使用 RepaintBoundary。当然合成 Layer 也有开销,所以需要合理使用。
2. 尽量使用 const Widget。如果你没法将子元素声明为 const 而它自身又不会改变。可以使用内置的 OffBuildWidget 来避免子元素重复 build。
3. 子元素会自动成为 RelayoutBoundary 除非它的宽或高是 wrapContent。可以酌情地减少 wrapContent 的使用,因为当 ConstraintLayout 自身的大小发生变化时(通常是窗口大小发生变化,移动端几乎不存在此类情况),所有宽或高为 wrapContent 的子元素都会被重新布局。而其他元素由于传递给它们的约束未发生变化,不会触发真正的布局。
4. 如果你在 children 列表中使用 Guideline 或 Barrier, Element 和 RenderObject 将不可避免的被创建,它们会被布局但不会绘制。此时你可以使用 GuidelineDefine 或 BarrierDefine 来优化, Element 和 RenderObject 就不会再创建了。
5. 每一帧,ConstraintLayout 会比对参数并决定以下事情:
1. 是否需要重新计算约束?
2. 是否需要重新布局?
3. 是否需要重新绘制?
4. 是否需要重排绘制顺序?
5. 是否需要重排事件分发顺序?
这些比对不会成为性能瓶颈,但会提高 CPU 占用率。如果你对 ConstraintLayout 内部原理足够了解,你可以使用 ConstraintLayoutController 来手动触发这些操作,停止参数比对。
扩展
ConstraintLayout 基于约束的布局算法极其强大和灵活,似乎可以成为了一个通用的布局框架。你只需要生成约束,将布局的任务交给 ConstraintLayout 即可。部分内置功能比如圆形定位、瀑布流、网格、列表以扩展的形式提供。
在线示例中的图表就是一个典型的扩展:
charts.gif
欢迎为 ConstraintLayout 开发扩展。
文章转自公众号:FlutterFirst
