「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」
Timer
关于Timer
定时器的使用,我们在iOS
中会发现,定时器会与一些操作有冲突,比如滑动UITableView
的时候,定时器会停止,需要切换模式才能解决冲突问题;那么Flutter
中的Timer
是否也有同样的问题呢?
我们在列表界面中,添加一个Timer
,代码如下:
我们在initState
方法中添加一个Timer
定时器,每1
秒执行一次,_count
每次加1
,当_count
值为99
的时候,我们将定时器销毁cancel()
;
我们来看定时器运行期间,滑动列表的效果:
在Flutter
中Timer
不会影响到列表的滑动操作;滑动列表也不会定时器也不会收到影响;
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
的情况;