我有一个页面 A 为每个时间间隔执行一些任务。只有当页面 A 处于活动状态并显示在屏幕上时,我才想执行这些任务。
如果屏幕显示页面 B,则不会执行任务。
我应该如何解决这个问题?
我有一个页面 A 为每个时间间隔执行一些任务。只有当页面 A 处于活动状态并显示在屏幕上时,我才想执行这些任务。
如果屏幕显示页面 B,则不会执行任务。
我应该如何解决这个问题?
不检查页面堆栈就相当简单。因为如果它位于页面堆栈的顶部,则仅当该页面当前处于活动状态时才会出现这种情况,这意味着所有其他页面都将从堆栈中删除(弹出)。如果您使用 调用新页面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()
方法!