setState()在statefulWidget类中无法识别

时间:2020-02-02 09:55:37

标签: flutter

class DataItem extends StatefulWidget {
  @override
  String number;

  void setNumber(String nu){
    setState(() {
      this.number=nu;
    });
  }

  _DataItemState createState() => new _DataItemState(this.number);
}

class _DataItemState extends State<DataItem> {
  @override

  String number;

  _DataItemState(this.number);
  Widget build(BuildContext context) {
    return new Container(
      child: Text(
          number,
        style: TextStyle(...),
    );
  }
}

Screenshot

请注意,我在StatefulWidget(DataItem)中未使用上述设置定义setState(),但是根据所附的屏幕截图,我要执行的操作如下。按下按钮后,我需要相应地更新标签。

3 个答案:

答案 0 :(得分:1)

这是一种导出将改变状态的函数的方法。

这是一个简单的反例,但是您应该可以执行更复杂的状态更改。

https://dartpad.dev/6d43e30eb6febfcf7ad0eec8555035db

答案 1 :(得分:0)

setState位于类State内,而不是StatefulWidget类内,您可以执行以下操作:

class _MyHomePageState extends State<MyHomePage> {
  int counter = 0;



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              counter.toString(),
            ),
           RaisedButton(
          onPressed: (){
             setState(() {
               counter++;
             });
          },
          child: Text(
            'Button',
            style: TextStyle(fontSize: 20)
          ),
        ),
          ],
        ),
      ),
    );
  }
}

这将使每次点击增加counter

答案 2 :(得分:0)

首先setState仅在StatefulWidget的状态类中使用。

第二位,对于通过构造函数接收的值,您无需使用setState,只需将其传递到小部件即可。

尝试以下代码:

class DataItem extends StatefulWidget {
  final String number;

  const DataItem(this.number) : assert(number != null);

  _DataItemState createState() => _DataItemState();
}

class _DataItemState extends State<DataItem> {

  Widget build(BuildContext context) {
    return Container(
      child: Text(
        widget.number,
        style: TextStyle(...),
      )
    );
  }
}

如果您不打算更改number属性,则可以使用StatelessWidget

class DataItem extends StatelessWIdget {
  final String number;

  const DataItem(this.number) : assert(number != null);

  Widget build(BuildContext context) {
    return Container(
      child: Text(
        number,
        style: TextStyle(...),
      )
    );
  }
}