как остановить Timer.periodic, который начался внутри initState при выходе из флаттера страницы

Я запускаю 2 таймера в моей функции initState , вот код:

  @override
  void initState() {
    readingSavedData();
    _timeString = _formatDateTime(DateTime.now());
    Timer.periodic(Duration(seconds: 1), (Timer t) => _getTime());
    Timer.periodic(Duration(seconds: 3), (Timer t) => gettingLocation());
    super.initState();

так как функции _getTime() запускаются setState() каждую 1 секунду в текстовом виджете, который показывает таймер.

Проблема в том, что он никогда не останавливается, когда я покидаю страницу с помощью Navigator .. он продолжает работать и выдает эту ошибку в консоли:

Unhandled Exception: setState() called after dispose()

так как он не может вызвать setSatate(){} для виджета, который больше не виден. как этого избежать.

Всего 1 ответ


Основываясь на ответе @pskink, я решил, используя этот метод:

  Timer _clockTimer;
  Timer _locationTimer;
  @override
  void initState() {
    readingSavedData();
    _timeString = _formatDateTime(DateTime.now());
    _clockTimer = Timer.periodic(Duration(seconds: 1), (Timer t) => _getTime());
    _locationTimer = Timer.periodic(Duration(seconds: 3), (Timer t) => gettingLocation());
    super.initState();
  }

  @override
  void dispose() {
    _clockTimer.cancel();
    _locationTimer.cancel();
    super.dispose();
  }

Есть идеи?

10000