Проверка флаттера - это страница поверх стека экранов
У меня есть страница A, которая выполняет некоторые задачи для каждого временного интервала. Я хочу выполнять эти задачи, только если страница A активна и отображается на экране.
Если на экране отображается страница B, он НЕ выполняет задачи.
Как мне подойти к этой проблеме?
1 ответ
Это довольно просто сделать без проверки стека страниц. Поскольку, если он находится наверху стека страниц, это только в том случае, когда эта страница в настоящее время активна, что означает, что все другие страницы удаляются (выталкиваются) из стека. Если вы запросили новую страницу сNavigator.of(context).push....
, чтобы "приостановить" предыдущую страницу, вы можете await
это действие. В следующем примере будет периодический таймер (помните, вы должны иметь его вне области действия функции, например, в состоянии) и назначить его уже существующимTimer
переменная.
Timer t; //a variable in a Stateful widget
@override
void initState() {
super.initState();
//it's initialized somewhere and is already working
t = Timer.periodic(
Duration(milliseconds: 500),
(t) => print(
'CALL YOUR FUNCTION HERE ${t.tick}',
),
);
}
_someMethodInvokingPageB() async {
// Cancel the timer before the opening the second page
// no setState((){}) is needed here
t.cancel();
// Your calling of Page B. Key is the word AWAIT
// AWAIT will pause here until you are on the Page B
var result = await Navigator.of(context).pushNamed('/pageB');
// reassign a timer to your timer
// you don't need setState((){}) here
t = Timer.periodic(
Duration(milliseconds: 500),
(t) => print('CALL YOUR FUNCTION HERE ${t.tick}'),
);
}
Вот так у вас есть таймер, у вас есть метод, в котором вы открываете Page B
и перед открытием Page B
вы отменяете этот таймер, await
открытие Page B
и после того, как вы закончите Page B
, вы переназначаете новый таймер своему Timer t
переменная.
PS Не забудьте позвонить t.cancel()
в вашем dispose()
метод!