Flutter:按下按钮两次调用setState()

时间:2018-08-09 02:58:17

标签: flutter

我正在尝试在按下按钮时发生一系列事件:

  • 用户单击“开始”按钮
  • 按钮文本更改为“停止”
  • 进行计算,然后更新另一个小部件

但是似乎onPressed函数仅允许一个setState()更新视图,因为问题在于按钮文本永远不会改变。

这是按钮小部件:

       new RaisedButton(
          child: Text(_calculating ? "Stop" : "Start"),
          onPressed: () {

            if (_calculating) {
              _setCalculating(false);
              // stop calculating
            } else {
              _setCalculating(true);
              _doCalc();
            }
          },
        ),

以下是回调:

    void _doCalc() {
      setState(() {
        sleep(const Duration(seconds:1));
        // Do some calculation and display the result ...
        _setCalculating(false);
      });
    }

    void _setCalculating(bool calculating) {
      setState(() {
        _calculating = calculating;
        print ("Setting state: " + calculating.toString());
      });
    }

计算正在显示,但是在计算过程中按钮文本永远不会变为“停止”(请注意睡眠1秒钟)。但是print语句正在打印,所以我知道_setCalculating被按预期方式调用。

每按一次按钮是否只能进行一次更新,或者还有另一种解决方法?

1 个答案:

答案 0 :(得分:3)

比您想象的简单

  class Main extends StatefulWidget {
    @override
    MainState createState() {
      return new MainState();
    }
  }

  class MainState extends State<Main> {
    bool _calculating = false;

    void _doCalc() async {
      _setCalculating(true);
      await Future.delayed(const Duration(seconds: 2));
      _setCalculating(false);
    }

    void _setCalculating(bool calculating) {
      setState(() {
        _calculating = calculating;
        print("Setting state: " + calculating.toString());
      });
    }

    @override
    Widget build(BuildContext context) {
      return new RaisedButton(
        child: Text(_calculating ? "Stop" : "Start"),
        onPressed: _doCalc,
      );
    }
  }

您两次致电setState