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()