StatelessWidget的所有代码都在一个类中,甚至在build方法中。对于StatefulWidget,为什么State是一个独立于Widget的类?它们不能结合在一起吗?StatefulWidget可以直接调用setState本身吗?
发布于 2017-09-08 02:59:57
StatefulWidget类是不可变的,并将其构造函数参数存储在final成员中。当它的配置信息发生变化时,它就会被丢弃,取而代之的是一个新的StatefulWidget。此操作通常非常便宜,并触发重建。
相比之下,关联的State的StatefulWidget可以是长寿的.在替换State时,即使构造函数参数更改,只要树结构和键匹配,也会重新使用StatefulWidget。这允许您防止State被吹走,即使父程序更改了有关StatefulWidget的一些内容。例如,您可能希望在小部件处于动画中间时更改它的颜色或文本,State会注意到,因为它使用widget getter读取这些值。(这就是为什么State绝不能有任何构造函数参数;它必须使用widget来读取它的配置。)
如果您希望为重新配置didUpdateWidget的情况提供特殊处理,则可以将StatefulWidget中的更改通知给您,尽管通常只是简单地重新构建将给出预期的结果。
发布于 2018-06-01 06:36:32
也许这对你有帮助:设计讨论
将Widget (BuildContext上下文)方法放置在StatefulWidget上而不是将Widget (BuildContext上下文、状态状态)方法放在StatefulWidget上,这为开发人员在子类StatefulWidget时提供了更大的灵活性。 例如,AnimatedWidget是StatefulWidget的一个子类,它引入了一个抽象的Widget (BuildContext上下文)方法来实现它的子类。如果StatefulWidget已经有了一个使用状态参数的构建方法,那么即使它的状态对象是AnimatedWidget的内部实现细节,AnimatedWidget也会被迫将其状态对象提供给子类。 在概念上,StatelessWidget也可以以类似的方式作为StatefulWidget的子类来实现。如果构建方法是在StatefulWidget上而不是在状态上,那就不可能了。 将构建函数放在State (而不是StatefulWidget )上也有助于避免与闭包相关的一类错误,从而隐式捕获它。如果在StatefulWidget上的构建函数中定义了闭包,则该闭包将隐式捕获这个闭包,这是当前的小部件实例。
https://stackoverflow.com/questions/46107609
复制相似问题