在颤振中删除 GetxController 时,定时器永远不会取消

Timer is never cancelled when GetxController is deleted in flutter

假设我有两个屏幕(屏幕 A 和屏幕 B)。我使用以下方法从屏幕 A 导航到 B:

Get.toNamed('/screen_b');

我在屏幕 b 中有一个计时器,它调用函数或打印语句。定时器代码在GetxController里面。

class Controller extends GetxController{

 
  Timer? timer;

@override
  void onInit() {
    super.onInit();
      timer = Timer.periodic(const Duration(seconds: 5), (Timer t) {
        print('timer is running');
        //DO SOMETHING
      });

    }

  }

@override
  void dispose() {
    print('I am disposed');
    timer!.cancel();
    super.dispose();

  }

  @override
  void onClose() {
    timer!.cancel();
    super.onClose();
    print('I am closed');


  }

}

我尝试使用 GetxController 提供的 onDispose 和 onClose 方法取消计时器,但看起来计时器从未被取消。当我导航回屏幕 A 时,打印语句 **timer is running** 永远保持 运行 并且该语句打印了 6/7 次。我做错了什么?当我从屏幕 B 返回到屏幕 A 时,Getx 打印以下语句

[GETX] CLOSE TO ROUTE /screen_b
[GETX] "Controller" onDelete() called
[GETX] "Controller" deleted from memory

我确实遇到了和你上次一样的问题,当你已经删除了控制器,但时间仍然 运行 像我一样滴答作响,如果安装了定时器。

ifTimerMounted(){
 final itimer = timer == null ? false : timer!.isActive;
 if(itimer){
   timer!.cancel();
 }else{
  // Or Do Nothing Leave it Blank
  log('Timer Stop Running')
  }
}

试着把它放在 onClose

@override
  void onClose() {
    super.onClose();
   ifTimerMounted();  
  }

onInit() 函数上尝试使用这个:

替换 Timer t -> timer

void onInit() {
    super.onInit();
      timer = Timer.periodic(const Duration(seconds: 5), (timer) {
        print('timer is running');
      });
    }
  }