type
status
date
slug
summary
tags
category
icon
password
<ins/>
减少 widget 重建次数有助于提升 Flutter 应用的性能。以下是一些优化方法,可以帮助减少不必要的重建:
1. 使用 const
构造
- 在不可变的 widget(如文本、静态图片等)前加上
const
关键字,确保它们只构建一次。例如:
- 使用
const
关键字可以让 Flutter 在构建时重用相同的实例,而不是每次重建都创建新实例。
2. 分离状态和布局
- 将有状态逻辑和布局分离:可以将有状态的 widget 与布局分离,尽量让 State 管理最小区域。这样可以避免状态改变时导致大范围的 widget 重建。例如,将计数器状态放到单独的 widget 中,只让该 widget 重建。
3. 使用 AutomaticKeepAliveClientMixin
- 在
ListView
或PageView
中,默认情况下不可见的子项会被销毁,可以使用AutomaticKeepAliveClientMixin
保持 widget 状态,使滑出视图的 widget 不被重建。
4. 使用 ValueListenableBuilder
和 StreamBuilder
等
- 当 widget 需要实时更新时,例如监听器、流数据,可以用
ValueListenableBuilder
、StreamBuilder
等来限定重建的范围。它们会确保只有所需的数据变化时才更新 UI,而不会影响整个 widget 树。
5. 避免使用 setState
更新大范围区域
- 将局部状态更新尽可能限制在最小 widget 范围内。通过更细粒度的
setState
控制,只更新需要变化的局部 widget。
6. 使用 Builder
和 LayoutBuilder
Builder
widget 可以创建一个局部的BuildContext
,用于避免整体 widget 重建。例如在Scaffold
中使用Builder
包裹某些部分,使得它们不会随着外部Scaffold
的变化而重建。
7. 使用 RepaintBoundary
控制重绘
- Flutter 中的
RepaintBoundary
用于隔离重绘。将频繁更新的部分包裹在RepaintBoundary
中,可以避免整个 widget 树被重建和重绘,提高性能。
8. 优化 ListView 和 GridView
- 对于长列表,使用
ListView.builder
和GridView.builder
,而不是静态ListView
或GridView
。builder
构造器会在需要时动态构建 item,节省内存和计算资源。
9. 使用 memoization
技术
- 对于不会频繁变化的数据,缓存计算结果,以避免重复计算。例如,使用一个
Map
或其他缓存机制保存计算结果。
10. Avoid Unnecessary Parent Widgets
- 避免无用的父 widget 层级,尽量保持 widget 树的简洁,减少层级可以减少构建和布局的复杂度。
通过这些优化方法,可以有效减少 Flutter 中的 widget 重建次数,从而提升应用的性能和响应速度。
<ins/>