значение обратного отсчета таймера не обновляется немедленно в flutter

#flutter #dart #countdown #countdowntimer

#флаттер #dart #обратный отсчет #countdowntimer

Вопрос:

Я использую пакет timer_count_down. (https://pub.dev/packages/timer_count_down ) когда я перезапущу свой таймер с новым значением (секунды таймера). таймер запускается со старым значением, а затем перезапускается с новым значением. короче говоря, мое состояние обновляется не сразу. и таймер перезапускается со старым значением. пожалуйста, помогите мне с этим.

 Widget build(BuildContext context) {
return Countdown(
  controller: contrl,//controller for timer
  seconds: time, //time is a state which store seconds.
  build: (BuildContext context, double time) => Text(time.toString()),
  interval: Duration(milliseconds: 100),
  onFinished: () {
    time = 30;//new time updated for timer
    contrl.restart();// this will restart mytimer// but timer is not taking new value it restarts with old value//
  },
);
  

}
}

Ответ №1:

Похоже, пакет не предназначен для использования таким образом (onFinished -> restart). Это не чистый обходной путь, но вы можете попробовать следующее

 Countdown(
        controller: contrl, //controller for timer
        seconds: time, //time is a state which store seconds.
        build: (BuildContext context, double time) => Text(time.toString()),
        interval: Duration(milliseconds: 100),
        onFinished: () {
          //new time updated for timer
          setState(() {
            time = 10;
          });
          Future.delayed(Duration(seconds: 1)).then((value) {
            contrl.restart();
          });

          // this will restart mytimer// but timer is not taking new value it restarts with old value//
        },
      ),
  

Или реализуйте свою собственную логику обратного отсчета следующим образом:

 class NewPage extends StatefulWidget {
  @override
  _NewPageState createState() => _NewPageState();
}

class _NewPageState extends State<NewPage> {
  Duration time = Duration(seconds: 3);
  Timer _timer;

  void startTimer(Duration reStartTime, Duration interval) {
    _timer = Timer.periodic(interval, (Timer t) {
      if (time <= Duration()) {
        setState(() {
          time = reStartTime;
        });
      } else {
        setState(() {
          time -= interval;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          startTimer(Duration(seconds: 30), Duration(milliseconds: 100));
        },
      ),
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(child: Text('$time')),
    );
  }
}