颤动变量失去价值

spo*_*oss 2 dart flutter

我有一个带有文本字段列表和下拉选项的屏幕.我在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
  }
}
Run Code Online (Sandbox Code Playgroud)

在某些文本字段上输入文本后,它variable会丢失它的值并重置为null.我怎样才能保持它的价值,或者我应该在哪里宣布它不会失去它的价值.

Rém*_*let 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
  }
}
Run Code Online (Sandbox Code Playgroud)


rmt*_*zie 5

任何状态(即变量)都应该保存在继承的类中State.继承StatefulWidget的类实际上应该只有final变量 - 如果你看一下Dart Analysis它实际上应该在继承一个@immutable类时显示错误.

如果没有更多关于你正在做什么的上下文,很难说,但是通常如果将值传递给对象,则要将其作为继承的类中的最终变量StatefulWidget存储,并将实际值存储在State中实际影响变化的地方.

Flutter针对构建对象进行了优化,因此不必担心多次实例化对象的性能影响.

请注意,如果您的类是保持变量的正确位置,但您还需要初始值,则可以将初始值传递给StatefulWidget,然后将值检索到initState调用中的State中.

我建议阅读有关无状态和有状态小部件的颤振教程的一部分,以深入了解它们的工作原理.