I would like to deactivate a button during a countdown. After countdown finishes button will be activated automatically.
How can I do it?
Below you could find code for timer. When this timer finishes I would like to activate a button
import 'dart:async';
import 'package:flutter/material.dart';
class OtpTimer extends StatefulWidget {
@override
_OtpTimerState createState() => _OtpTimerState();
}
class _OtpTimerState extends State<OtpTimer> {
final interval = const Duration(seconds: 1);
final int timerMaxSeconds = 60;
int currentSeconds = 0;
String get timerText =>
'${((timerMaxSeconds - currentSeconds) ~/ 60).toString().padLeft(2,'0')}: ${((timerMaxSeconds - currentSeconds) % 60).toString().padLeft(2,'0')}';
startTimeout([int milliseconds]) {
var duration = interval;
Timer.periodic(duration, (timer) {
setState(() {
print(timer.tick);
currentSeconds = timer.tick;
if (timer.tick >= timerMaxSeconds) timer.cancel();
});
});
}
@override
void initState() {
startTimeout();
super.initState();
}
@override
Widget build(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(Icons.timer),
SizedBox(
width: 5,
),
Text(timerText)
],
);
}
}
Simplest solution would be to disable whatever code you are executing in your buttons onTapGesture during the countdown and then execute it only when countdown stops.
Editx2: As you have added your timer code the concept will still be the same;
bool countDownComplete = false;
startTimeout([int milliseconds]) {
var duration = interval;
Timer.periodic(duration, (timer) {
setState(() {
print(timer.tick);
currentSeconds = timer.tick;
if (timer.tick >= timerMaxSeconds) {
setState(() {
countDownComplete = true;
});
timer.cancel();
}
});
});
}
And then in your onPressed/onTap handler check for value of countDownComplete and execute your code)
RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
side: BorderSide(color: Colors.red)),
onPressed: () {
if(countDownComplete){
//execute code
} //else do nothing
},
color: Colors.red,
textColor: Colors.white,
child: Text("Buy now".toUpperCase(),
style: TextStyle(fontSize: 14)),
),
Edit:
Added code as requested:
bool countDownComplete = false; //Global boolean variable
void countdownFunc(){
//this is sample countdown function as you haven't added yours
for(int a= 0; a<a++;a<10){
if(a=9){
setState(() {
countDownComplete = true;
//when a=9, countdown will complete,
// so then set boolean to true
});
}
}
}
RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
side: BorderSide(color: Colors.red)),
onPressed: () {
if(countDownComplete){
//execute code
} //else do nothing
},
color: Colors.red,
textColor: Colors.white,
child: Text("Buy now".toUpperCase(),
style: TextStyle(fontSize: 14)),
),