flutter - 如何在颤动中实现超时按钮
解决方案
您可以使用小部件轻松实现它CustomPainter
。检查下面的源代码并根据您的需要进行调整。
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;
}
推荐阅读
- javascript - JavaScript“文档”不能用作关键字
- google-cloud-platform - Hive 直线转换到 Google Dataproc
- react-native - 如何在本机反应中编写自定义闪存消息
- googlemock - Gmock ReturnRef 不返回正确的值
- java - intellij中的maven编译器
- antlr4 - 正则表达式评论
- java - 在休眠中创建多个子实体时,如何仅创建一次父实体?
- amazon-web-services - 关于海王星数据的导出
- python - 如何在oddo 12中创建新公司时自动创建销售点会话?
- linux - Shell脚本循环文件,应用命令并将每个输出保存到新文件