返回

Flutter Timer的基本使用与取消

见解分享

Flutter Timer是一个非常有用的类,它可以让我们在指定的时间间隔后执行指定的代码。它在许多场景中都有着广泛的应用,比如计时器、倒计时、轮询等。

基本使用

使用Flutter Timer非常简单,只需要创建一个Timer对象,并传入两个参数:

  • duration: 执行代码的时间间隔。
  • callback: 执行的代码。
Timer timer = new Timer(const Duration(seconds: 1), () {
  print("Hello, world!");
});

上面的代码会在1秒后执行print("Hello, world!")。

取消Timer

在某些情况下,我们需要取消Timer。比如,当页面销毁或应用进入后台时,如果我们不取消Timer,它可能会继续执行,从而导致问题。

我们可以使用Timer的cancel方法来取消Timer。

timer.cancel();

常见场景下的取消Timer

1. 返回到上一个页面时没有销毁Timer

在Flutter中,当我们使用Navigator.push()方法打开一个新页面时,旧页面并不会被销毁,它只是被隐藏了。因此,如果我们在旧页面中创建了一个Timer,并且没有在返回到旧页面时取消它,那么它可能会继续执行,从而导致问题。

我们可以通过在旧页面中重写dispose()方法来取消Timer。在dispose()方法中,我们可以使用Timer的cancel方法来取消Timer。

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

2. 应用进入后台时没有销毁Timer

当应用进入后台时,所有的页面都会被销毁。因此,如果我们在页面中创建了一个Timer,并且没有在应用进入后台时取消它,那么它可能会继续执行,从而导致问题。

我们可以通过在应用的AppDelegate中重写applicationWillResignActive()方法来取消Timer。在applicationWillResignActive()方法中,我们可以使用Timer的cancel方法来取消Timer。

@override
void applicationWillResignActive(UIApplication application) {
  super.applicationWillResignActive(application);
  timer.cancel();
}

3. 在切换到其他页面时没有销毁Timer

在Flutter中,使用TickerProviderService创建的Timer可以在页面之间共享。我们可以通过在页面中创建TickerProviderService并传递给Timer来实现这一点。这样,当页面销毁时,Timer不会被销毁,它会继续在新的页面中执行。

如果我们不想让Timer在新的页面中继续执行,我们可以通过在页面中重写didChangeDependencies()方法来取消Timer。在didChangeDependencies()方法中,我们可以使用Timer的cancel方法来取消Timer。

@override
void didChangeDependencies() {
  super.didChangeDependencies();
  timer.cancel();
}

总结

Flutter Timer是一个非常有用的类,它可以在指定的时间间隔后执行指定的代码。在使用Flutter Timer时,我们需要特别注意在不同情况下取消Timer,以避免出现问题。