flutter 在构建方法中与在字段变量中时如何更新状态
How does flutter update state when it's in the build method versus when it's a field variable
我有一个无状态的小部件,其中有一个文本字段,现在我将文本字段的 onChanged 值存储在一个变量中 String? newValue;
因为它是一个无状态的小部件,我必须将其标记为最终的,但是,如果它被标记为最终的,那么我不能将它用作 setter,
onChanged: (value) {
newValue = value;
}
我所做的是将它放在 build()
方法中,所以
Widget build(BuildContext context) {
String? newValue;
return Container();
}
现在我可以将它用作 setter,或者我认为他们欺骗了我...
当我在 onChanged 中打印 newValue 的值时,它实际上正在收集该值,但是,当用户提交或在键盘上单击时,newValue 的值返回到默认值 'null',
当我使 class 有状态时,我可以轻松地将 newValue
直接作为字段变量,并且一切正常,无论我做什么,它都不会默认为默认值,
所以我的问题是,为什么当我将变量存储在 build()
方法中时会发生这种情况,但当我将其存储为 class 字段变量时却不会发生这种情况,谁能告诉我这是怎么回事有效,为什么它默认为初始值并且无论如何都可以解决它而不必更改为有状态小部件并将其设为字段变量。
您不能在构建方法中存储状态的原因是在函数内(或任何块范围内)声明的任何变量都限定在该块范围内。因此,当构建方法再次调用 re-render 你的小部件时,变量将在函数开始时再次初始化,并且当函数 returns 时将超出范围,这将发生在每个构建。*
这正是 StatefulWidget
和 State<T>
解决的问题 - 通过将变量存储为实例上的可变属性,这些变量 可用于对 build
的后续调用,并持续 在对 build
.
的 调用之间
* 在这种情况下,变量仍然存在,因为您的 onChanged
回调正在引用它,这就是您仍然可以打印它的原因;但是,它的值不会对后续调用 build
.
产生任何影响
我有一个无状态的小部件,其中有一个文本字段,现在我将文本字段的 onChanged 值存储在一个变量中 String? newValue;
因为它是一个无状态的小部件,我必须将其标记为最终的,但是,如果它被标记为最终的,那么我不能将它用作 setter,
onChanged: (value) {
newValue = value;
}
我所做的是将它放在 build()
方法中,所以
Widget build(BuildContext context) {
String? newValue;
return Container();
}
现在我可以将它用作 setter,或者我认为他们欺骗了我...
当我在 onChanged 中打印 newValue 的值时,它实际上正在收集该值,但是,当用户提交或在键盘上单击时,newValue 的值返回到默认值 'null',
当我使 class 有状态时,我可以轻松地将 newValue
直接作为字段变量,并且一切正常,无论我做什么,它都不会默认为默认值,
所以我的问题是,为什么当我将变量存储在 build()
方法中时会发生这种情况,但当我将其存储为 class 字段变量时却不会发生这种情况,谁能告诉我这是怎么回事有效,为什么它默认为初始值并且无论如何都可以解决它而不必更改为有状态小部件并将其设为字段变量。
您不能在构建方法中存储状态的原因是在函数内(或任何块范围内)声明的任何变量都限定在该块范围内。因此,当构建方法再次调用 re-render 你的小部件时,变量将在函数开始时再次初始化,并且当函数 returns 时将超出范围,这将发生在每个构建。*
这正是 StatefulWidget
和 State<T>
解决的问题 - 通过将变量存储为实例上的可变属性,这些变量 可用于对 build
的后续调用,并持续 在对 build
.
* 在这种情况下,变量仍然存在,因为您的 onChanged
回调正在引用它,这就是您仍然可以打印它的原因;但是,它的值不会对后续调用 build
.