Надежный / постоянный таймер во флаттере - PullRequest
0 голосов
/ 01 марта 2020

В моем приложении необходим таймер для асинхронного запуска нового экрана интерфейса пользователя по истечении таймера. Следующий код показывает желаемую семантику:

Timer t = Timer(Duration(seconds: myDuration), () { askQuestion('How are you doing?'); }); // Maybe later, before the timer goes off... t.cancel();

Используя Timer, моя реализация иногда работает, особенно с небольшой продолжительностью.

Но если длительность велика, скажем, 25 или 400 минут, мое приложение будет убито и перезапущено, тогда таймер будет потерян, таймаут никогда не произойдет.

Мой вопрос Как я могу сделать Timer постоянным после перезапуска приложения или надежным с помощью какого-то эквивалентного механизма?

Я могу предоставить однозначное c постоянное решение, проверив сохраненное значение времени для таймера, чтобы истечь при (пере) запуске моей программы, и решив, должен ли я перезапустить таймер. Но я хотел бы узнать, существует ли уже обобщенное решение c, поскольку для операции Future.delayed это общее требование, чтобы выдержать перезапуск программы, в противном случае использование Future.delayed ограничено.

В противном случае я мог бы искать альтернативные решения, обеспечивающие постоянство. Я помню местное уведомление мощи.

1 Ответ

1 голос
/ 01 марта 2020

Я думаю, вам нужно запустить таймер при запуске приложения, но вам также нужно записать время, когда вы должны показать экран, чтобы кэшировать сервис / предпочтения / дБ. Затем, если ваше приложение будет убито и запущено снова, вы запустите таймер с временем отдыха (потому что вам нужно каждый раз запускать таймер при запуске, и вы знаете, сколько стоит отдых).

Представьте, что вы должны показывать экран каждые 400 минут. Хорошо, с этого момента DateTime.now().add(Duration(minutes:400)), и мы можем безопасно запустить таймер с этого момента и до этого времени (псевдокод), но идея должна быть ясна

timeLeft = cachedDateTime - DateTime.now()
if(timeLeft<0){
show you page immediately and write to cache next time
}
else {
start timer with time left here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...