StatefulWidget 中的 State 对象何时销毁?
When is the State object destroyed in a StatefulWidget?
Flutter 的格言之一是小部件是不可变的,并且很容易在接到通知后立即重建。使用 StatefulWidget 的原因之一是附带的 State 对象,它 'hangs around' 超出任何单独的 build()
方法调用。通过这种方式,文本值、复选框选择可以在小部件本身被重建时保持不变。
但是,State 对象本身何时被销毁?是当他们的关联小部件从小部件树中删除时吗?在什么情况下会发生这种情况——当使用 Navigator 转到新的小部件时?当您转到 TabBar 中的不同条目时?
这对我来说有点模糊,实际上从小部件树中删除小部件并且它们的关联状态被销毁的场景。我还需要注意哪些其他情况我的 State 对象可能会消失,以便我可以使用 PageStorageKeys 等采取适当的措施?
一般的答案是:当关联的元素(BuildContext 对象)从元素树中移除后被释放。
请注意,元素(因此也是小部件)不能从树中删除自己。
它 必须 成为删除它的父级。
大多数时候,这种情况的发生取决于其父级的构建方法所做的事情。
主要有两种情况:
- 构建方法返回了不同的小部件树。
通常来自:
return Foo();
收件人:
return Bar();
会破坏Foo
的状态。
请注意,当 Foo
"moved" :
时也会发生这种情况
return Foo();
收件人:
return Bar(child: Foo());
将仍然处理Foo
的状态。
- 第二种情况是
Key
变化时:
return Foo();
进入:
return Foo(key: Key("foo")) ;
或者:
return Foo(key: Key("bar"));
进入:
return Foo(key: Key("foo")) ;
两者都会破坏先前创建的状态Foo
。
关于处置方法
@override
dispose()
Flutter 的格言之一是小部件是不可变的,并且很容易在接到通知后立即重建。使用 StatefulWidget 的原因之一是附带的 State 对象,它 'hangs around' 超出任何单独的 build()
方法调用。通过这种方式,文本值、复选框选择可以在小部件本身被重建时保持不变。
但是,State 对象本身何时被销毁?是当他们的关联小部件从小部件树中删除时吗?在什么情况下会发生这种情况——当使用 Navigator 转到新的小部件时?当您转到 TabBar 中的不同条目时?
这对我来说有点模糊,实际上从小部件树中删除小部件并且它们的关联状态被销毁的场景。我还需要注意哪些其他情况我的 State 对象可能会消失,以便我可以使用 PageStorageKeys 等采取适当的措施?
一般的答案是:当关联的元素(BuildContext 对象)从元素树中移除后被释放。
请注意,元素(因此也是小部件)不能从树中删除自己。 它 必须 成为删除它的父级。
大多数时候,这种情况的发生取决于其父级的构建方法所做的事情。
主要有两种情况:
- 构建方法返回了不同的小部件树。 通常来自:
return Foo();
收件人:
return Bar();
会破坏Foo
的状态。
请注意,当 Foo
"moved" :
return Foo();
收件人:
return Bar(child: Foo());
将仍然处理Foo
的状态。
- 第二种情况是
Key
变化时:
return Foo();
进入:
return Foo(key: Key("foo")) ;
或者:
return Foo(key: Key("bar"));
进入:
return Foo(key: Key("foo")) ;
两者都会破坏先前创建的状态Foo
。
关于处置方法
@override
dispose()