Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 缓存子窗口小部件与重新创建它们_Flutter_Dart_Flutter Layout - Fatal编程技术网

Flutter 缓存子窗口小部件与重新创建它们

Flutter 缓存子窗口小部件与重新创建它们,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我不确定是否缓存一个小部件实例并在build()方法中重用它会产生显著的不同 假设我们有两个小部件类: class ParentWidget extends StatelessWidget { ParentWidget({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Container( // or some other widgets tha

我不确定是否缓存一个小部件实例并在
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
     */
  }
}
据我所知,每次flatter在
ParentWidget
上调用
build()
,都会创建一个新的
ChildWidget
,并附加到元素树中的同一元素。除非
const-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()
    );
  }
}
类ParentWidget扩展了无状态widget{
最后一个孩子;
ParentWidget({Key})
:child=ChildWidget(/*…*/),
超级(键:键);
@凌驾
小部件构建(构建上下文){
返回容器(
//或者其他一些定义ui的小部件

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

官方的FlatterAPI文档确实建议在某些情况下使用缓存。但一般来说,在尝试优化视图时,不应该首先使用缓存

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

  • 如果子树没有更改,则缓存表示该子树的小部件,并在每次可以使用时重新使用它
  • 尽可能使用const小部件(这相当于缓存小部件并重新使用它)
在的文档中,如果小部件表示的子树没有更改,建议缓存该小部件:

如果子树没有更改,则缓存表示该子树的小部件,并在每次可以使用时重新使用它。与新的(但配置相同)小部件相比,重新使用小部件的效率大大提高要创建的小部件。将有状态部分分解成一个接受子参数的小部件是一种常见的方法

因此,我得出结论,每当小部件更改状态时,不基于状态更改的子树都应该被缓存和重用


然而,问题中声明的示例并不是选择缓存小部件是一个好选择的情况,因为只有未更改子树的根应由该子树的父树缓存。但是由于
ParentWidget
本身是一个
无状态小部件
,每次
C时它都将是未更改子树的一部分hildWidget
是。因此,
ParentWidget
的某个有状态的父级应该负责缓存。

多亏了您,我在的文档中找到了相关部分。他们建议在子树不发生变化时缓存它,因为“重新使用一个小部件要比重新使用一个新的(但配置相同)小部件效率更高。”在许多情况下,你可以通过其他方式优化渲染。我制作了颤振应用程序,而不需要缓存一个小部件。我同意。这个问题不是关于我在开发中遇到的具体问题,而是关于框架的工作。而且“效率更高”表示我的性能有了很大提高。