StatelessWidget
s的所有代码都在一个类中,甚至是build
方法。对于StatefulWidget
s,为什么State
a separate class from theWidget
?它们不能组合起来,StatefulWidget
就可以自己调用setState
?
最佳答案
StatefulWidget
类是不可变的,并将其构造函数参数存储在final
成员中。当它的配置信息发生变化时,它会被丢弃,并被一个新的StatefulWidget
替换。此操作通常非常便宜,并触发重建。
相比之下,aState
的相关StatefulWidget
可以长期存在。只要树结构和键匹配,当替换State
时,即使构造函数参数发生更改,也会重新使用StatefulWidget
。这允许您避免自己的State
被吹走,即使家长改变了一些关于StatefulWidget
的事情。例如,您可能希望在小部件处于动画中间时更改其颜色或文本,State
会注意到,因为它使用widget
getter读取这些值。(这就是为什么State
不能有任何构造函数参数;它必须使用widget
来读取其配置。)
如果您希望为重新配置了didUpdateWidget
的情况提供特殊处理,则可以通知您在StatefulWidget
中所做的更改,尽管通常只需重新构建即可获得预期的结果。