StatefulWidget 中的 State 对象何时销毁?

lar*_*ryq 1 state flutter statefulwidget

Flutter 的口头禅之一是小部件是不可变的,并且可以在收到通知后立即重建。使用 StatefulWidget 的一个原因是伴随的 State 对象,它在任何单独的build()方法调用之外“徘徊” 。这样,当小部件本身被重建时,文本值、复选框选择可以保持不变。

但是,State 对象本身何时被销毁?是当它们关联的小部件从小部件树中删除时吗?在什么情况下会发生这种情况——当使用导航器转到新小部件时?当您转到 TabBar 中的不同条目时?

对我来说有点模糊,小部件实际上从小部件树中删除并且它们的关联状态被破坏的场景。我还需要注意哪些其他情况,我的 State 对象可能会消失,以便我可以对 PageStorageKeys 等采取适当的措施?

Rém*_*let 5

一般的答案是:当它的关联元素(BuildContext 对象)在从元素树中删除后被释放时。

请注意,元素(因此也是小部件)不能从树中删除自己。它成为其父,消除它。

大多数情况下,这取决于其父级的构建方法的作用。

主要有两种情况:

  • build 方法返回了一个不同的小部件树。通常来自:
return Foo();
Run Code Online (Sandbox Code Playgroud)

到:

return Bar();
Run Code Online (Sandbox Code Playgroud)

将破坏 的状态Foo

请注意,这也会在Foo“移动”时发生:

return Foo();
Run Code Online (Sandbox Code Playgroud)

到:

return Bar(child: Foo());
Run Code Online (Sandbox Code Playgroud)

依然处置的状态Foo

  • 第二种情况是什么时候Key改变:
return Foo();
Run Code Online (Sandbox Code Playgroud)

进入:

return Foo(key: Key("foo")) ;
Run Code Online (Sandbox Code Playgroud)

或者:

return Foo(key: Key("bar"));
Run Code Online (Sandbox Code Playgroud)

进入:

return Foo(key: Key("foo")) ;
Run Code Online (Sandbox Code Playgroud)

都会破坏之前创建的状态Foo