【发布时间】:2020-08-23 07:31:02
【问题描述】:
我是 Flutter 的新手,我真的很想知道当我们调用 setState 时,是否所有小部件的子树都会重建。
这里的子树是指该小部件下面的所有小部件树(包括该小部件作为根节点)。
当我们调用setState 函数时,会在子树的root node 上调用build 方法,从而触发其子树的构建方法。假设子树(该小部件的子级)的分支(此处为 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应该不会对其产生影响。
我想知道是否应该进行任何优化以避免在调用setState 函数时构建无用的MyWidget1。由于MyWidget1 下方的树可能太大,因此也将再次重建。
我的问题:
这个独立小部件(此处为
MyWidget1)是否可以在setState上再次构建?有没有更好的方法来处理这种情况以避免重建。
注意:我已阅读此question
在这个问题中,有一种方法可以避免无用的构建,方法是在构建方法之外创建一个独立分支的实例,
我的疑问是:
这是处理这种情况的方法还是其他更好的方法,或者这种情况根本没有那么大,因为树在 O(n) 时间内构建(我认为这不应该是答案,因为构建树可能是 O(n) 操作,但它可能包括许多耗时的操作,这些操作可能对优化不友好,一次又一次地无用地调用。
【问题讨论】:
标签: flutter