代码之家  ›  专栏  ›  技术社区  ›  srbcheema1 Feu

整个子树在颤振状态下重建吗

  •  0
  • srbcheema1 Feu  · 技术社区  · 6 年前

    我是新手,我真的很想知道,当我们调用setState时,是否所有的小部件子树都得到了重建。

    我们打电话的时候 setState build 方法调用 root node 在子树上触发生成方法。说一根树枝(这里 MyWidget1 )子树的(该小部件的子级)与状态变量无关。我注意到即使是独立的分支也在 设置状态

    class _MyAppState extends State<MyApp> {
      int count=0;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Column(children: <Widget>[ MyWidget1(),MyWidget2(count),],),
          floatingActionButton: FloatingActionButton(onPressed: ()=>setState((){count++;}),), 
        );
      }
    }
    
    class MyWidget1 extends StatelessWidget {
      @override
      Widget build(BuildContext context) { print("widget builds 1");
        return Container(height: 100, color: Colors.orange,);
      }
    }
    class MyWidget2 extends StatelessWidget {
      final int count;
      MyWidget2(this.count);
      @override
      Widget build(BuildContext context) { print("widget builds 2");
        return Text(count.toString());
      }
    }
    

    在这里我们可以看到 我的妻子1 count ),所以一般来说, 设置状态 应该不会有影响。 我想知道是否应该进行任何优化来避免 我的妻子1 在…的召唤下 设置状态 功能。就像下面的树一样 我的妻子1

    1. 这个可以吗 独立小工具 我的妻子1 设置状态

    2. 有没有更好的方法来处理这种情况,以避免重建。

    注:我读过这个 question

    在这个问题中,有一种方法可以通过在build方法之外创建独立分支的实例来避免无用的构建,

    我的疑问是:

    这是处理这种情况的方法还是其他更好的方法,或者这种情况根本就没有那么大,因为树在O(n)时间内构建(我认为这不是答案,因为构建树可能是O(n)操作,但它可能包含许多耗时的操作,这些操作可能不利于优化而反复调用,毫无用处)。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Gazihan Alankus Frank van Puffelen    6 年前

    对, MyWidget1 是在这个基础上重建的 setState . 相信密码。你打电话后 , build 调用,它调用 我的妻子1 . 每次之后 设置状态

    ,重建整个子树。

    没关系,别担心。

    这里的widget类是非常轻量级的类。Dart的垃圾收集器经过优化,可以实例化许多这样的对象并将它们一起丢弃。

    这棵树,你可以一次又一次地重建,只是一个门面。还有两个并行树不是轻量级的,也不是重新创建的。你的widget树被区分在一起,以找出系统应该如何修改实际的ui元素。

    你可能会问,为什么这么麻烦。因为创造树木很容易,而维护它们却很困难。这种反应式的声明性框架使我们可以只创建树而不维护它。

    https://www.youtube.com/watch?v=996ZgFRENMs