Я хочу, чтобы таймер истек после того, как он используется во флаттере - PullRequest
1 голос
/ 13 апреля 2020

Я использую Timer () в Flutter для переключения между экранами, у меня есть screen1, который переключается на screen2 после некоторой задержки и обратно на screen1 после некоторой задержки.

Я хочу, чтобы функциональные возможности работали одинаково, но я хочу, чтобы переключение выполнялось только один раз. Прямо сейчас, после того как я запустил таймер, экраны продолжают переключаться назад и вперед (что логически правильно, так как я не использую никакую функцию для истечения срока действия Таймера ()). Я хочу знать, как истечь таймер (), чтобы он не переключался более одного раза. Вот мой код.

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(...);
  }

}

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Следите за созданным таймером в своем коде и когда вы хотите отменить этот вызов 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, когда вы перейдете на третий -page. Поскольку у вас есть два разных класса, у которых есть два разных таймера, вы должны написать это в обоих классах.

0 голосов
/ 18 апреля 2020
Timer.periodic(Duration(milliseconds: 600),(timer){
  timer.cancel(); //cancel time after first invoke
  //your code
});
0 голосов
/ 13 апреля 2020

Я не уверен, является ли это решением или обходным путем, но он подойдет для вашей цели.

В screen1 добавьте конструктор в параметр. Допустим, имя параметра isComingFromScreen2. Значением по умолчанию будет false.

На экране 2 вы вызываете screen1 с isComingFromScreen2 : true.

Теперь в screen1 initState () вы можете решить, запускать таймер или нет, в зависимости от значения isComingFromScreen2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...