我有一个包含文本字段列表和下拉选项的屏幕。我在StatefulWidget类中声明了一个变量,并通过widget.variableName在类中使用它,但是在文本字段中输入一些值之后,我注意到小部件得到了更新,我的变量丢失了它的值,我留下了一个null变量。我尝试在initState()中初始化它,但它仍然失去了它的价值。
示例:
class Screen extends StatefulWidget{
var variable;
@override
_ScreenState createState(){
variable = "dummyText";
return _ScreenState();
}
}
class _ScreenState extends State<Screen>{
@override
Widget build(BuildContext context) {
return Scaffold(
body: _layout(),
);
}
_layout(){
print(" value of variable: ${widget.variable}");
//imagine lots of textfields here in a listview
}
}
在某些文本字段上输入文本后,variable
会丢失它的值并将其重置为null。我怎样才能保持它的价值,或者我应该在哪里宣布它不会失去它的价值。
答案 0 :(得分:6)
您无法在StatefulWidget
子类中设置可变变量。 StatefulWidget
的所有字段必须是final或const。
相反,将该变量移到State
子类中。
class Screen extends StatefulWidget {
_ScreenState createState() => _ScreenState();
}
class _ScreenState extends State<Screen> {
String variable;
@override
void initState() {
variable = "dummyText";
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: _layout(),
);
}
_layout() {
print(" value of variable: $variable");
//imagine lots of textfields here in a listview
}
}
答案 1 :(得分:5)
任何状态(即变量)都应该保留在继承State
的类中。继承StatefulWidget的类实际上应该只有final
个变量 - 如果你看一下Dart Analysis,它实际上应该显示一个错误,因为它继承了@immutable
类。
如果没有更多关于你正在做什么的上下文,很难分辨,但通常如果将值传递给对象,则要将其作为继承的类中的最终变量存储StatefulWidget
,并将实际值存储在实际影响更改的状态。
Flutter针对构建对象进行了优化,因此不必担心多次实例化对象的性能影响。
请注意,如果您的类是保留变量的正确位置,但您还需要初始值,则可以将初始值传递给StatefulWidget,然后将值检索到{{1}中的State中打电话。
我建议您阅读颤动教程about stateless and stateful widgets的部分内容,以便更深入地了解它们的工作原理。