基本上,flutter有自己的状态管理,称为setState(() {}),itu将更新调用setState的屏幕状态,如果我在它自己的文件中有按钮类小部件,如果我按下按钮,我想将按钮名称更改为其他名称,则setState将更新按钮类/小部件中的状态或变量。 现在,如果按钮想更新不同类中的状态/变量,但在同一屏幕中,该怎么办?由于setState只更新它自己的类,因此您需要使用函数构造器(如final Function onButtonTap;)给予按钮onTap属性,然后将其放在onTap上,如
3条答案
按热度按时间txu3uszq1#
问题的第一部分是正确的-如果小部件的状态发生变化,可能需要重绘它的所有子部件。
但这正是为什么尽可能深地将状态嵌套在小部件树中是很重要的!
假设相反,所有状态信息都存储在小部件树的根,最顶端。现在,如果任何信息发生变化,无论多小,都会导致小部件树的完整遍历,在最坏的情况下重建所有内容。
而且除了树遍历之外,你的应用程序还会变得非常占用内存。如果所有的状态都存储在根目录下,flutter永远不能判断什么时候可以从内存中释放一些信息。如果用户留下一些视图,而这些视图又从内存中被清除,它们的信息仍将存储在顶部。而唯一的方法来检查是否仍然需要这些信息将是再次检查整个树-非常昂贵!
所有这些问题都可以通过将状态尽可能靠近使用它的小部件来缓解。
isr3a4wc2#
是的!每个
state widget
都有自己的state
,并且它们都是独立的。如果widget X的状态更新,则只更新widget X假设您具有播种家谱的应用程序。在
widget A
中,您从API
获得gradfather,当您点击它时,您将被重定向到widget B
,在那里您可以找到他的孩子,当您点击他的孩子之一时,您转到widget C
,其示出了widget B
中所选父亲的孩子,现在让我们假设你想添加一个孩子到这个父亲.你叫add-childrenendpoint
.这里的问题是widget A
不会被更新.对此,理解状态树逻辑的一个解决方案是,将更新
widget A
的function
从widget A
传递到widget B
,并将其从widget B
传递到widget C
,并在小部件B或C甚至A上发生更新时调用它,这样widget A
得到更新,您在widget A
中得到更新的系谱树jk9hmnmh3#
基本上,flutter有自己的状态管理,称为
setState(() {})
,itu将更新调用setState的屏幕状态,如果我在它自己的文件中有按钮类小部件,如果我按下按钮,我想将按钮名称更改为其他名称,则setState将更新按钮类/小部件中的状态或变量。现在,如果按钮想更新不同类中的状态/变量,但在同一屏幕中,该怎么办?由于setState只更新它自己的类,因此您需要使用函数构造器(如
final Function onButtonTap;
)给予按钮onTap属性,然后将其放在onTap上,如然后,在您想要更新状态的屏幕中,只需调用onButtonTap,然后在那里使用setState