Flutter-使用计时器和.cancel()函数

ax6ht2ek  于 2023-01-18  发布在  Flutter
关注(0)|答案(2)|浏览(228)

更新

我遇到了一个问题。当我在Flutter中使用计时器并在之后取消它时,但一旦触发了取消方法,什么也没有发生。

var counter = 0;

Timer.periodic(const Duration(milliseconds: 50), (timer) {

developer.log('Actual counter ' + counter.toString());
counter++;
 
if (counter == 5) {
   developer.log('TIMER DONE');
    timer.cancel();
}

});

developer.log('This comes afterwards');

预期产出:

Actual counter 0
Actual counter 1
Actual counter 2
Actual counter 3
Actual counter 4
TIMER DONE
This comes afterwards

输出:

Actual counter 0
Actual counter 1
Actual counter 2
Actual counter 3
Actual counter 4
TIMER DONE

通常我应该在控制台中看到一条消息“这是以后的”,但是似乎使用cancel时,complete方法将被取消。
先谢谢你了。

pdsfdshx

pdsfdshx1#

更新:执行定时器结束操作。
您需要在if条件中添加逻辑来执行操作。

if (counter == firmwareList.length) {
    timer.cancel();
    developer.log('This comes afterwards'); //here
      }
});

下面是一个微件示例

class TimerF extends StatefulWidget {
  const TimerF({super.key});

  @override
  State<TimerF> createState() => _TimerFState();
}

class _TimerFState extends State<TimerF> {
  var counter = 0;

  Timer? timer;

  bool isTimerActive = true;

  @override
  void initState() {
    super.initState();
    timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      print('Still timer');

      if (counter == 5) {
        timer.cancel();
        isTimerActive = false;
      }
      counter++;
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Text("current value ${counter}"),
          if (timer?.isActive == false) Text("Timer isnt active"),
          if (isTimerActive == false) Text("Timer isnt active $isTimerActive"),
        ],
      ),
    );
  }
}

我在当前代码片段中看不到counter上的任何增量。这就是为什么counter保持为0并且不满足取消计时器的条件。
也许会是

var counter = 0;
Timer.periodic(const Duration(milliseconds: 50), (timer) {
  print('Still timer');

  if (counter == 5) {
    timer.cancel();
  }
  counter++; //increment the value
  print('this is afterwards');
});
3ks5zfa0

3ks5zfa02#

下面是一个使用Timer的完整示例

Timer? timer;

startTimer() {
  var counter = 0;
  timer = Timer.periodic(const Duration(milliseconds: 50), (timer) {
    counter += 1;
    print('Actual step $counter');
    if(counter==5) {
      cancelTimer();
    }
  });
}

cancelTimer() {
  timer?.cancel();
  print('this is afterwards');
  //do something here
}

当您startTimer()时,输出如下

Actual step 1
Actual step 2
Actual step 3
Actual step 4
Actual step 5
this is afterwards

相关问题