我有一个页面A,它在每个时间间隔都执行一些任务。我只想在页面A处于活动状态并显示在屏幕上时执行这些任务。
如果屏幕显示页面B,它将不执行任务。
我应该如何解决这个问题?
答案 0 :(得分:0)
这很简单,无需检查页面堆栈。因为只有当页面处于当前状态时,它才位于页面堆栈的顶部,所以所有其他页面都将从堆栈中删除(弹出)。如果您使用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
变量重新分配了一个新计时器。
P.S。别忘了用t.cancel()
方法调用dispose()
!