3

我有一个页面 A 为每个时间间隔执行一些任务。只有当页面 A 处于活动状态并显示在屏幕上时,我才想执行这些任务。

如果屏幕显示页面 B,则不会执行任务。

我应该如何解决这个问题?

4

1 回答 1

-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()方法!

于 2020-07-18T16:17:04.570 回答