我试图在按下按钮时发生一系列事件:
- 用户点击开始按钮
- 按钮文字变为“停止”
- 发生计算,然后更新另一个小部件
但似乎 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/