gpt4 book ai didi

flutter - 整个子树是否在 flutter 中在 setState 上重建

转载 作者:行者123 更新时间:2023-12-03 21:56:26 29 4
gpt4 key购买 nike

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

这里的子树是指该小部件下方的所有小部件树(包括该小部件作为根节点)。

当我们调用 setState函数,buildroot node 上调用方法子树,它触发其子树的构建方法。假设子树(该小部件的子级)的分支(此处为 MyWidget1)独立于状态变量。我注意到即使是独立的分支也会在 setState 上重建。在父节点中调用。

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());
}
}

在这里我们可以看到 MyWidget1独立于状态变量(此处为 count ),因此通常为 setState应该对它没有影响。
我想知道是否应该进行任何优化以避免 MyWidget1 的无用构建接到 setState 的电话功能。如下面的树 MyWidget1可能太大了,那也将再次重建。

我的问题:
  • 这个可以吗独立小部件 (此处为 MyWidget1 )在 setState 上再次构建?
  • 有没有更好的方法来处理这种情况以避免其重建。

  • 注意:我已阅读此 question

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

    我的疑问是:

    这是处理这种情况的方法还是其他更好的方法,或者这种情况根本没有那么大,因为树在 O(n) 时间内构建(我认为这不应该是答案,因为构建树可能是 O( n) 操作,但它可能包括许多耗时的操作,这些操作可能对优化不友好,无用地一次又一次地调用)。

    最佳答案

    是的,MyWidget1在此基础上重建 setState .只要相信代码。调用后setState , build被调用,它调用了MyWidget1的构造函数.在每个 setState 之后,整个子树被重建。旧的小部件被丢弃。但是,国家并没有被抛弃。状态实例继续存在,它们不会被重新创建(参见 didUpdateWidget)。

    所以,是的。在每个 setState 之后,整个子树被重建。

    这没关系,别担心。

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

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

    你可能会问,为什么会有这么多麻烦。因为创建树很容易,维护它们很困难。这种响应式(Reactive)声明框架让我们摆脱了只创建树而不维护它的情况。

    有一些关于 Flutter 内部的资源,您可以阅读更多相关信息。一个这样的资源是这个视频:https://www.youtube.com/watch?v=996ZgFRENMs

    关于flutter - 整个子树是否在 flutter 中在 setState 上重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61667344/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com