在Flutter中,状态实际上应该位于树的根部(在大多数情况下)吗?

ve7v8dk2  于 2023-01-09  发布在  Flutter
关注(0)|答案(3)|浏览(132)

关于Flutter中的状态管理问题,我完全糊涂了。
到目前为止,我已经了解到,为了获得更好的性能,小部件的状态必须尽可能深地嵌套在树中(或者尽可能靠近受影响的小部件)。
但是,如果这样一个嵌套的状态小部件(例如InheritedWidget)在它上面的某个地方有另一个状态小部件,当树中较高的状态小部件请求为它的所有后代重建时,较低级别的状态小部件是否不会丢失它的状态?
通过这种思路,我得出了这样的结论:状态小部件最终必须位于根位置,但我想我错了。

txu3uszq

txu3uszq1#

问题的第一部分是正确的-如果小部件的状态发生变化,可能需要重绘它的所有子部件。
但这正是为什么尽可能深地将状态嵌套在小部件树中是很重要的!
假设相反,所有状态信息都存储在小部件树的根,最顶端。现在,如果任何信息发生变化,无论多小,都会导致小部件树的完整遍历,在最坏的情况下重建所有内容。
而且除了树遍历之外,你的应用程序还会变得非常占用内存。如果所有的状态都存储在根目录下,flutter永远不能判断什么时候可以从内存中释放一些信息。如果用户留下一些视图,而这些视图又从内存中被清除,它们的信息仍将存储在顶部。而唯一的方法来检查是否仍然需要这些信息将是再次检查整个树-非常昂贵!
所有这些问题都可以通过将状态尽可能靠近使用它的小部件来缓解。

  • 如果状态发生变化,只需遍历整个小部件树的一小部分子树--这很快。
  • 如果一个小部件被关闭,flutter还可以释放为它存储的所有状态信息,从而释放内存。
isr3a4wc

isr3a4wc2#

是的!每个state widget都有自己的state,并且它们都是独立的。如果widget X的状态更新,则只更新widget X
假设您具有播种家谱的应用程序。在widget A中,您从API获得gradfather,当您点击它时,您将被重定向到widget B,在那里您可以找到他的孩子,当您点击他的孩子之一时,您转到widget C,其示出了widget B中所选父亲的孩子,现在让我们假设你想添加一个孩子到这个父亲.你叫add-children endpoint.这里的问题是widget A不会被更新.
对此,理解状态树逻辑的一个解决方案是,将更新widget Afunctionwidget A传递到widget B,并将其从widget B传递到widget C,并在小部件B或C甚至A上发生更新时调用它,这样widget A得到更新,您在widget A中得到更新的系谱树

jk9hmnmh

jk9hmnmh3#

基本上,flutter有自己的状态管理,称为setState(() {}),itu将更新调用setState的屏幕状态,如果我在它自己的文件中有按钮类小部件,如果我按下按钮,我想将按钮名称更改为其他名称,则setState将更新按钮类/小部件中的状态或变量。
现在,如果按钮想更新不同类中的状态/变量,但在同一屏幕中,该怎么办?由于setState只更新它自己的类,因此您需要使用函数构造器(如final Function onButtonTap;)给予按钮onTap属性,然后将其放在onTap上,如

onTap:() {
widget.onButtonTap();
}

然后,在您想要更新状态的屏幕中,只需调用onButtonTap,然后在那里使用setState

相关问题