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

    • ListViewPageView 中,默认情况下不可见的子项会被销毁,可以使用 AutomaticKeepAliveClientMixin 保持 widget 状态,使滑出视图的 widget 不被重建。

      4. 使用 ValueListenableBuilderStreamBuilder

      • 当 widget 需要实时更新时,例如监听器、流数据,可以用 ValueListenableBuilderStreamBuilder 等来限定重建的范围。它们会确保只有所需的数据变化时才更新 UI,而不会影响整个 widget 树。

      5. 避免使用 setState 更新大范围区域

      • 将局部状态更新尽可能限制在最小 widget 范围内。通过更细粒度的 setState 控制,只更新需要变化的局部 widget。

      6. 使用 BuilderLayoutBuilder

      • Builder widget 可以创建一个局部的 BuildContext,用于避免整体 widget 重建。例如在 Scaffold 中使用 Builder 包裹某些部分,使得它们不会随着外部 Scaffold 的变化而重建。

      7. 使用 RepaintBoundary 控制重绘

      • Flutter 中的 RepaintBoundary 用于隔离重绘。将频繁更新的部分包裹在 RepaintBoundary 中,可以避免整个 widget 树被重建和重绘,提高性能。

      8. 优化 ListView 和 GridView

      • 对于长列表,使用 ListView.builderGridView.builder,而不是静态 ListViewGridViewbuilder 构造器会在需要时动态构建 item,节省内存和计算资源。

      9. 使用 memoization 技术

      • 对于不会频繁变化的数据,缓存计算结果,以避免重复计算。例如,使用一个 Map 或其他缓存机制保存计算结果。

      10. Avoid Unnecessary Parent Widgets

      • 避免无用的父 widget 层级,尽量保持 widget 树的简洁,减少层级可以减少构建和布局的复杂度。
      通过这些优化方法,可以有效减少 Flutter 中的 widget 重建次数,从而提升应用的性能和响应速度。
      <ins/>