Flutter Timer.periodi c зарегистрироваться / запустить один раз - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы, чтобы таймер запускался один раз в main.dart для проверки активности пользователя

@override
  void initState() {
    super.initState();

    initPlatformState();
    _fetchMasterData("a", "b");
    _startActivityTimer();
  }

  bool _activityTimerRunning = false;
  void _startActivityTimer() {
    if (!_activityTimerRunning) {
      Timer.periodic(Duration(seconds: 5), (timer) {
        _timerTicked(timer);

        setState(() {
          _activityTimerRunning = true;
        });
        print("Timer started");
      });
    }
  }

Но initState вызывается более одного раза, поэтому это не подходящее место для регистрации таймера. Где это должно быть размещено?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Код в вопросе имеет глупую ошибку, оператор печати находится в неправильном месте. Вот рабочий код:

@override
  void initState() {
    super.initState();

    initPlatformState();
    _fetchMasterData("a", "b");
    _startActivityTimer();
  }

  void _startActivityTimer() {
    print("Timer started");
    Timer.periodic(Duration(seconds: 5), (timer) {
      _timerTicked(timer);
    });
  }

«TimerStarted» выполняется только один раз

0 голосов
/ 04 мая 2020

Попробуйте этот пример кода.

int start =  5;
fName(){
    Timer _timer;
    const oneSecond = Duration(seconds: 5);
        _timer = Timer.periodic(
          oneSecond,
            (Timer timer) => setState((){
              if(start == 0)
                timer.cancel();
              else{
               _activityTimerRunning = true;
               start -= 1;
              }
            })
          );
}

Если вы хотите запустить таймер, вызовите метод fName () после того, как этот таймер может запуститься. Так же и вы можете проверить состояние, когда

if(start != 0){ ... }

...