zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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;
        });
      });
    });