抖动检查是屏幕堆栈顶部的页面

时间:2020-07-18 15:23:09

标签: flutter flutter-routes

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

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

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

1 个答案:

答案 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之前取消该计时器,awaitPage B打开,之后您完成了Page B上的工作,就为Timer t变量重新分配了一个新计时器。

P.S。别忘了用t.cancel()方法调用dispose()