【问题标题】:When is the State object destroyed in a StatefulWidget?StatefulWidget 中的 State 对象什么时候销毁?
【发布时间】:2019-12-09 15:47:19
【问题描述】:

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

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

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

【问题讨论】:

  • "However, when are the State objects themselves destroyed?" - here

标签: flutter state statefulwidget


【解决方案1】:

关于处理方法

@override
dispose()

【讨论】:

    【解决方案2】:

    一般的答案是:当它的关联元素(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 的状态。

    【讨论】:

    • 谢谢雷米。我假设如果您使用导航器在小部件之间移动 - 例如,如果您在表单中填写了一些信息,然后导航离开,然后弹出,表单信息将消失,因为(我假设)表单将从小部件树中删除?
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2020-02-21
    相关资源
    最近更新 更多