我正在Flutter应用中实现一个计时器。这是应用的结构。
页面A(包含一些列表,用户点击后会进入计时器页面)。 页面B格式化并运行计时器。我能够正确地运行计时器/秒表,但是当我在页面B上按返回按钮时,我会得到“setState() called after dispose”错误。我知道这是预期的行为。 如果我在dispose()方法中使用timer.cancel(),那么我就不会得到这个错误,但计时器将停止运行。即使我导航到页面A或者说任何其他新页面(widget),计时器/秒表也应该继续运行。 我知道可以使用listeners和WidgetBindingObserver来实现这个功能,但我并不清楚如何实现它。希望我能在这个问题上得到一些帮助。
页面B的Build类:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: new IconButton(icon: new Icon(Icons.arrow_back), onPressed: ()async{
Navigator.pop(context,widget._elapsedTime);
}),
title: Text("widget.title"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'$_elapsedTime'),
RaisedButton(
child: Text('Start'),
onPressed: () {
if(watch.isRunning){
stopWatch();
}
else{
startWatch();
}
},
),
],
),
));
StartWatch函数:
startWatch() {
watch.start();
timer = new Timer.periodic(new Duration(milliseconds:1000), updateTime);}
每秒调用一次的更新时间函数:
updateTime(Timer timer) {
if (watch.isRunning) {
print(_elapsedTime);
var time= formatedTime(watch.elapsedMilliseconds);
print("time is"+time);
setState(() {
_elapsedTime = time;
});
}
Stopwatch
和Timer
组成)。向start
和stop
方法添加一个int timerIndex
参数。此时,只需要简单的代码,没有任何魔法。 - boformer