Flutter(二十八)-定时器Timer的使用

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

Timer

关于Timer定时器的使用,我们在iOS中会发现,定时器会与一些操作有冲突,比如滑动UITableView的时候,定时器会停止,需要切换模式才能解决冲突问题;那么Flutter中的Timer是否也有同样的问题呢?

我们在列表界面中,添加一个Timer,代码如下:

image.png

我们在initState方法中添加一个Timer定时器,每1秒执行一次,_count每次加1,当_count值为99的时候,我们将定时器销毁cancel();

我们来看定时器运行期间,滑动列表的效果:

iShot2021-11-16 16.29.29.gif

FlutterTimer不会影响到列表的滑动操作;滑动列表也不会定时器也不会收到影响;

Timer的内存泄漏问题

虽然Flutter中的Timer与列表的滑动不会产生冲突了,但是目前我们这样用依然会有问题,请看下边的操作:

我们将页面切出去之后,定时器并没有被完全销毁,此时我们的页面是保留状态的情况下,如果选择不保留状态,将会变成下边的情况:

可以看到,当页面处于wantKeepAlive = false的情况下,如果切换界面,那么再次切换回来的时候,将会出现两个定时器同时存在的情况;那么如何解决呢?

这个时候,我们需要用到Widget生命周期中的另一个函数dispose

Widget的dispose方法

dispose方法类似于iOS中的dealloc方法,此方法在我们切换页面之后将会调用,我么你可以在此方法中进行一些对象的销毁操作;我们需要再dispose方法中将Timer进行释放,代码如下:

dispose方法中销毁Timer之前,需要判断_timer是否为空,并且是否出去执行状态;

这样的话,如果我们的wantKeepAlive = false,那么每次页面切换出去的时候Timer都会被销毁,返回页面之后将会重新创建一个Timer;如果wantKeepAlive = true,那么页面切换出去之后,因为状态保留了,所以dispose并不会执行,也不会进行Timer的销毁操作,页面再次出现时,也不会出现第二次创建Timer的情况;

Guess you like

Origin juejin.im/post/7034686735661400095