Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to implement button with timeout in flutter

User can tap button until the end of timer. I don't know how to start the layout. Does flutter sdk have any built in (or similar to be implemented) widgets for this case.

enter image description here

like image 601
Akbar Pulatov Avatar asked Jun 14 '26 03:06

Akbar Pulatov


1 Answers

You can easily achieve it with a CustomPainter widget. Check the source code below and tweak it to your needs.

enter image description here


import 'dart:async';

import 'package:flutter/material.dart';

class MyProgressButton extends StatefulWidget {
  @override
  _MyProgressButtonState createState() => _MyProgressButtonState();
}

class _MyProgressButtonState extends State<MyProgressButton> {
  Timer _timer;
  int _progress = 0;
  int _totalActionTimeInSeconds = 3;

  void _initCounter() {
    _timer?.cancel();
    _progress = 0;
    _timer = Timer.periodic(const Duration(milliseconds: 50), (_) {
      setState(() => _progress += 50);

      if (Duration(milliseconds: _progress).inSeconds >= _totalActionTimeInSeconds) {
        _timer.cancel();
        // Do something
      }
    });
  }

  void _stopCounter() {
    _timer?.cancel();
    setState(() => _progress = 0);
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTapDown: (_) => _initCounter(),
      onTapUp: (_) => _stopCounter(),
      child: CustomPaint(
        painter: _MyCustomButtonPainter((_progress / 1000) / _totalActionTimeInSeconds),
        child: Container(
          alignment: Alignment.center,
          width: 500.0,
          height: 200.0,
          child: Text('Press me'),
        ),
      ),
    );
  }
}

class _MyCustomButtonPainter extends CustomPainter {
  const _MyCustomButtonPainter(this.progress);

  final double progress;

  @override
  void paint(Canvas canvas, Size size) {
    final Paint paint = Paint()..color = Colors.grey;
    final double buttonWidth = size.width;
    final double buttonHeight = size.height;

    canvas.drawRRect(
      RRect.fromRectAndRadius(
        Rect.fromLTRB(0.0, 0.0, buttonWidth, buttonHeight),
        Radius.circular(5.0),
      ),
      paint,
    );

    paint.color = Colors.green;

    canvas.drawRRect(
      RRect.fromRectAndRadius(
        Rect.fromLTRB(0.0, 0.0, progress * buttonWidth, buttonHeight),
        Radius.circular(5.0),
      ),
      paint,
    );
  }

  @override
  bool shouldRepaint(_MyCustomButtonPainter oldDelegate) => this.progress != oldDelegate.progress;
}
like image 116
Miguel Ruivo Avatar answered Jun 15 '26 21:06

Miguel Ruivo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!