小部件消失时如何取消正在运行的Timer()

时间:2018-07-26 21:32:48

标签: dart flutter

在StatefulWidget中,我实现了deactivate()方法,该方法进行了一些清理。

实际上,StatefulWidget会定期轮询服务,并使用新接收的数据重新加载自身。因此,它使用Timer(),它会定期调用服务器轮询回调。

调用deactivate()就好了。但是,在停用小部件时,异步Timer()仍会触发最后一个事件并调用回调-而部分停用小部件。

这是我的deactivate():

  @protected
  @mustCallSuper
  void deactivate() {

    // allow callback of Timeer() to not execute 
    _timerCanceled = true;

    // Cancel the periodic Timer()
    _timer.cancel();

    // Should be called LAST or FIRST?
    super.deactivate();

  }

问:一般问题:如何取消一些异步Timer()并确保不再调用提供的回调。

或者:如何编写取消Timer()的代码并在完成取消操作之后执行代码,以使Timer()的回调绝对不会被调用。

1 个答案:

答案 0 :(得分:2)

在Flutter gallery application example中,他们在dispose类中使用覆盖State

@override
void dispose() {
  _timeDilationTimer?.cancel();
  super.dispose();
}

我不确定在Timer内创建StatefulWidget是正确的。您可能要参考图库示例(和other examples in the Flutter repository)。