Я реализую таймер во флаттере. Вот структура приложения.
Страница A (Содержит несколько списков, где пользователь нажимает и переводит их на страницу таймера).
Страница B форматирует, запускает таймер. Я могу правильно запустить таймер / секундомер, но когда я нажимаю кнопку «Назад» на странице B, я вызываю setstate (), вызываемую после устранения ошибки. Я понимаю, что это ожидаемое поведение.
Если я использую timer.cancel () при утилизации, я не получу ошибку, но таймер перестанет работать. Таймер / секундомер должен продолжать работать, даже если я перейду на страницу A или скажу любую другую новую страницу (виджет).
Я знаю, что это может быть возможно с использованием слушателей и WidgetBindingObserver, но у меня нет четких знаний о его реализации. Надеюсь, я получу некоторую помощь по этому вопросу.
Класс сборки страницы B:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: new IconButton(icon: new Icon(Icons.arrow_back), onPressed: ()async{
Navigator.pop(context,widget._elapsedTime);
}),
title: Text("widget.title"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'$_elapsedTime'),
RaisedButton(
child: Text('Start'),
onPressed: () {
if(watch.isRunning){
stopWatch();
}
else{
startWatch();
}
},
),
],
),
));
Функция StartWatch:
startWatch() {
watch.start();
timer = new Timer.periodic(new Duration(milliseconds:1000), updateTime);}
Функция обновления времени, которая вызывается каждую секунду:
updateTime(Timer timer) {
if (watch.isRunning) {
print(_elapsedTime);
var time= formatedTime(watch.elapsedMilliseconds);
print("time is"+time);
setState(() {
_elapsedTime = time;
});
}