【问题标题】:I want timer to expire after once it is used in flutter我希望计时器在颤振中使用后过期
【发布时间】:2020-04-13 10:00:29
【问题描述】:

我在 Flutter 中使用 Timer() 在屏幕之间切换,我有 screen1 在一些延迟后切换到 screen2 并在一些延迟后返回到 screen1。

我希望功能以相同的方式工作,但我希望只进行一次切换。现在,在我运行计时器之后,屏幕不断来回切换(这在逻辑上是正确的,因为我没有使用任何函数来使 Timer() 过期)。我想知道如何使 Timer() 过期,这样它就不会多次切换。这是我的代码。

class _SpeedometerScreenState extends State<SpeedometerScreen> {

  var duration;

  @override
  void initState() {
    super.initState();
    startTimer();
  }

  startTimer() async {
    duration = Duration(seconds: 5);
    return Timer(duration, route);
  }

  route() {
    Navigator.pushReplacement(
       context,
       MaterialPageRoute(
         builder: (context) => MapScreen(),
       ),
    );
  }

  @override
  Widget build(BuildContext context) {
     return Scaffold(...);
  }

}

我们将不胜感激任何形式的帮助。提前致谢。

【问题讨论】:

  • 如何从第 2 页(地图屏幕)切换回第 1 页(速度计屏幕)?
  • 我在两个文件中都写了相同的代码,不同的是 Navigator.pushReplacement() 方法。在 MapScreen() 中,我推入 SpeedometerScreen(),反之亦然。
  • 在 MapScreen 中使用 Navigator.pop(context);,它将解决您的问题。
  • 对不起,我希望它们在我在任一屏幕上时继续切换,但是一旦我转到第三个屏幕,我希望计时器立即停止。现在它继续在后台运行,无论我在哪里,它都会根据轮到谁切换回地图或速度计屏幕......任何猜测即使在我切换到第三个屏幕后也可以做些什么来避免切换?
  • 查看我的答案,如果您需要任何其他详细信息,请告诉我

标签: flutter dart mobile


【解决方案1】:

跟踪您的代码中创建的计时器以及何时取消对该计时器对象的调用cancel()

class _SpeedometerScreenState extends State<SpeedometerScreen> {
  Timer _timer;

  Timer startTimer() {
    var duration = Duration(seconds: 5);
    return Timer(duration, route);
  }


  @override
  void initState() {
    super.initState();
    _timer = startTimer();
  }

  _cancelTimer() {
    if (_timer?.isActive) {
      _timer.cancel()
    }
  }

  // Your other code
}

导航到第三页时调用 _cancelTimer。由于你有两个不同的类,它们有两个不同的计时器,你必须在两个类中都写这个。

【讨论】:

  • 非常感谢。按照我想要的方式工作。 :))
【解决方案2】:

我不确定这是一个解决方案还是解决方法,但它会适合您的目的。

在screen1中,在参数中添加一个构造函数。假设参数名称是isComingFromScreen2。默认值为 false。

在屏幕 2 中,您使用 isComingFromScreen2 : true 调用 screen1。

现在,在screen1的initState()中,你可以根据isComingFromScreen2的值来决定是否启动定时器。

【讨论】:

    【解决方案3】:
    Timer.periodic(Duration(milliseconds: 600),(timer){
      timer.cancel(); //cancel time after first invoke
      //your code
    });
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2020-05-11
    • 2022-11-15
    • 2019-07-03
    • 1970-01-01
    • 2021-04-24
    • 2021-10-28
    相关资源
    最近更新 更多