#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')),
);
}
}