flutter多个定时器销毁不了的问题
flutter 多个 定时器 不了 销毁 问题
2023-09-14 09:04:28 时间
如果定义了多个定时器,但是有一些定时器没用到,在dispose的时候又销毁它,那么那段代码就会出错(因为没有用到,怎么可能销毁得了),下面的代码就不会运行了,所以剩下的定时器就不会关闭了,所以可以在initState时用一遍就可以了
//循环计时器,摇骰子切换图片
late Timer? _diceChangeTimer;
//简单计时器,摇骰子定时播完动画后停止
late Timer? _diceStopTimer;
//简单计时器,摇骰子重置动画
late Timer? _diceReverseTimer;
//简单计时器,猜拳重置动画
late Timer? _guessReverseTimer;
//循环计时器,猜拳切换图片
late Timer? _guessFingerTimer;
//简单计时器,摇骰子定时播完动画后停止
late Timer? _guessStopTimer;
@override
void initState() {
//初始化的时候使用一下,避免在销毁的时候出错
_diceChangeTimer=Timer.periodic(Duration(milliseconds: 0), (timer) { });
_diceStopTimer=Timer.periodic(Duration(milliseconds: 0), (timer) { });
_diceReverseTimer=Timer.periodic(Duration(milliseconds: 0), (timer) { });
_guessReverseTimer=Timer.periodic(Duration(milliseconds: 0), (timer) { });
_guessFingerTimer=Timer.periodic(Duration(milliseconds: 0), (timer) { });
_guessStopTimer=Timer.periodic(Duration(milliseconds: 0), (timer) { });
// TODO: implement initState
super.initState();
}
@override
void dispose() {
if (_guessFingerTimer!=null) {
_guessFingerTimer!.cancel();
_guessFingerTimer=null;
}
if(_diceChangeTimer!=null) {
if(_diceChangeTimer!.isActive){
_diceChangeTimer!.cancel();
_diceChangeTimer=null;
}
}
if (_diceStopTimer!=null) {
_diceStopTimer!.cancel();
_diceStopTimer=null;
}
if (_diceReverseTimer!=null) {
_diceReverseTimer!.cancel();
_diceReverseTimer=null;
}
if (_guessStopTimer!=null) {
_guessStopTimer!.cancel();
_guessStopTimer=null;
}
if (_guessReverseTimer!=null) {
_guessReverseTimer!.cancel();
_guessReverseTimer=null;
}
super.dispose();
}
//循环定时器,不断切换图片
if (mounted) {
_diceChangeTimer =
Timer.periodic(const Duration(milliseconds: 100), (Timer t) {
print("摇骰子定时器");
if (mounted) {
setState(() {
dicePhotoIndex = dicePhotoIndex + 1;
if (dicePhotoIndex == 4) {
if (mounted) {
setState(() {
dicePhotoIndex = 0;
});
}
}
});
}
});
}
//延时两秒钟停止动画,显示结果
_diceStopTimer = Timer(const Duration(seconds: 2), () {
setState(() {
var rng = new Random();
switch (rng.nextInt(5)) {
case (0):
diceResultPath = 'assets/images/icon_dice_res_1.png';
break;
case (1):
diceResultPath = 'assets/images/icon_dice_res_2.png';
break;
case (2):
diceResultPath = 'assets/images/icon_dice_res_3.png';
break;
case (3):
diceResultPath = 'assets/images/icon_dice_res_4.png';
break;
case (4):
diceResultPath = 'assets/images/icon_dice_res_5.png';
break;
case (5):
diceResultPath = 'assets/images/icon_dice_res_6.png';
break;
}
//延时两秒后显示结果动画
diceAppearResult = true;
});
//关闭循环定时器
if (_diceChangeTimer!=null) {
_diceChangeTimer!.cancel();
}
_diceReverseTimer = Timer(const Duration(seconds: 1), () {
setState(() {
//等结果出来后才可以继续点摇骰子
diceIsPress = false;
//延时一秒后重置动画回摇的图片,方便下次重新摇
diceAppearResult = false;
//显示结果后,延时一秒关闭动画
blankAnim = true;
});
});
});