颤振变量失去价值

时间:2018-06-18 21:27:52

标签: 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
  }
}

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

2 个答案:

答案 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的部分内容,以便更深入地了解它们的工作原理。