我有一个无状态的widget,其中有一个textfield,现在我将textfield的onChanged值存储在变量String? newValue;
中,因为它是一个无状态的小部件,我必须将它标记为final,但是如果它被标记为final,那么我就不能使用它作为一个设置器来做,
onChanged: (value) {
newValue = value;
}
我所做的就是把它放在build()
方法中,所以
Widget build(BuildContext context) {
String? newValue;
return Container();
}
现在我可以用它作为一个策划人,或者所以我觉得他们骗了我.当我在newValue中打印onChanged的值时,它实际上是在收集值,但是当用户提交或单击键盘时,newValue的值返回到默认值'null',当我使类有状态时,可以很容易地将newValue
作为字段变量放置,而且一切正常,无论我做什么,它都不默认为默认值,
所以我的问题是,为什么在build()
方法中存储变量时会发生这种情况,而不是当我将其存储为类字段变量时,有人可以告诉我这是如何工作的,为什么它默认为初始值,并且不管怎么解决它,而不必更改为有状态小部件并使其成为字段变量。
发布于 2022-05-11 19:23:31
不能在build方法中存储状态的原因是,在函数(或在任何块范围内)中声明的任何变量的作用域都是该块。因此,当再次调用build方法来重新呈现您的小部件时,变量将在函数开始时再次初始化,并在函数返回时超出范围,这将发生在每次构建时。*
这正是StatefulWidget
和State<T>
解决的问题--通过在实例上将变量存储为可变属性,这些变量可用于后续对build
的调用,并在对build
的调用之间保持不变。
* --在本例中--由于您的onChanged
回调引用它,所以变量仍然在附近徘徊,这就是为什么您仍然可以打印它的原因;但是,它的值对后续对build
的调用没有任何影响。
https://stackoverflow.com/questions/72206233
复制相似问题