Проверка флаттера - это страница поверх стека экранов

У меня есть страница 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() метод!

Другие вопросы по тегам