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

标签 flutter

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

  • 用户点击开始按钮
  • 按钮文字变为“停止”
  • 发生计算,然后更新另一个小部件

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

这是按钮小部件:

       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());
      });
    }

计算正在显示,但在计算过程中按钮文本永远不会更改为“停止”(注意 sleep 1 秒)。但是打印语句正在打印,所以我知道 _setCalculating 正在按预期调用。

每次按下按钮只能进行一次更新,还是有其他方法可以解决?

最佳答案

比你想象的要简单

  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

关于Flutter:按下按钮时调用 setState() 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51758188/

相关文章:

flutter - Dart 中的全局变量 : Singleton versus Static

android - 更改build.gradle文件上的applicationId后出现错误

flutter - 如何在用 singlechildscrollview 包裹的列内使用间隔器?

dart - 使用 flutter dart 从 pdf 和 word 中获取文本

firebase - flutter 包 flutter_stripe 是否需要后端来处理付款?

dart - 如何在 Flutter 中使抽屉按钮不可点击

dart - TextSize 不会根据 deviceSize 或 devicePixelRatio 进行缩放

android - Flutter:升级Play商店的版本代码

dart - 兼容 Flutter 和 javascript 的 AES 加解密

android - 什么相当于 Flutter 中的圆形显示动画?