缓存子部件与重新创建它们

Tob*_*aun 7 dart flutter flutter-layout

我不确定缓存小部件实例并在build()方法中重用它是否会产生显着差异。

假设我们有两个小部件类:

class ParentWidget extends StatelessWidget {
  ParentWidget({Key key})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container( // or some other widgets that define the ui
      child: ChildWidget(/*...*/),
    );
  }
}

class ChildWidget extends StatelessWidget {
  ChildWidget({Key key}) : super(key: key); // no constant

  @override
  Widget build(BuildContext context) {
    /*
     * returns some Widget
     */
  }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,每次 Flutter 调用build()ParentWidget,都会创建一个新元素ChildWidget并将其附加到元素树中的同一元素。除非 ifconst ChildWidget可用(例如ChildWidget有一个 const 构造函数)。

但是,我们可以像这样缓存孩子:

class ParentWidget extends StatelessWidget {
  final Widget child;
  ParentWidget({Key key})
      : child = ChildWidget(/*...*/),
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      // or some other widgets that define the ui
      child: child, // <-- use child instead of ChildWidget()
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,将使用相同的小部件,并且颤动不需要对元素树进行任何修改。但我不确定在哪些情况下这很重要。

缓存小部件和创建具有相同配置的新小部件之间有显着差异吗?如果是这样,是否有关于何时缓存小部件而不是重建它们的规则?

Kri*_*ian 1

例如,如果子部件分配资源或具有较大的子部件树,则可能存在差异。

官方 flutter api 文档确实建议在某些情况下进行缓存。但一般来说,在尝试优化您的视图时,这不应该是首先要做的事情。

阅读有关有状态无状态的文档,特别是“性能注意事项”部分有很多相关的进一步信息。例如:

  • 如果子树没有更改,则缓存代表该子树的小部件,并在每次可以使用时重新使用它。
  • 尽可能使用 const 小部件。(这相当于缓存一个小部件并重新使用它。)