我有一个艰难的时间了解当一个国家的Widget的init方法被调用。
假设我有下面的Widget
class FooWidget extends StatefulWidget
{
FooWidget(this._title)
{
//----------->A
}
String _title;
@override
FooWidgetState createState() => new FooWidgetState();
}
class FooWidgetState extends State<FooWidget>
{
FooWidgetState(); //----------->B
@override
void initState() {
super.initState(); //----------->C
}
@override
Widget build(BuildContext context)
{
//------>D
}
我注意到,在第一时间FooWidget
创建A,B,C,d都被调用。然而,当FooWidget
的父母,然后重建只有A和d是called.Is这个观察是否正确?为什么会这样?我怎么知道什么时候B和C不会被调用?当将init
的FooWidgetState
方法再次调用?
一个initState
的State
只调用一次为它的整个生命(基本上,直到dispose
被调用)。
所以,简单的答案是:只要创建一个initState
State
和构造被称为,仅此而已。
长的故事是,有一些方法来告诉大家,State
实例应该用一个新的来代替框架。
当StatefulWidget
更新后,扑在内部检查两件事情:
widget.runtimeType
widget.key
如果其中任何一个不与以前的小部件匹配就意味着我们要卸载旧的部件并重新安装一个新的。
因此,分配UniqueKey
到构建方法中的小部件会导致其后代永远摧毁和重建他们State
:
Widget build(BuildContext context) {
return SomeStatefulWidget(
key: UniqueKey(),
);
}