Flutter倒计时计时器
Flutter倒计时计时器
如何将传递给构造函数的值用于创建一个四舍五入到小数点后一位的定时器,并显示在我的RaisedButton的子文本上?我尝试过了,但没有成功。我成功地使用简单的定时器使回调函数工作,但无法实现定期更新文本中的值...
import 'package:flutter/material.dart';
import 'dart:ui';
import 'dart:async';
class TimerButton extends StatefulWidget {
final Duration timerTastoPremuto;
TimerButton(this.timerTastoPremuto);
@override
_TimerButtonState createState() => _TimerButtonState();
}
class _TimerButtonState extends State
int _start = 0;
Timer _timer;
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(5.0),
height: 135.0,
width: 135.0,
child: RaisedButton(
elevation: 100.0,
color: Colors.white.withOpacity(.8),
highlightElevation: 0.0,
onPressed: () {
_start = widget.timerTastoPremuto.inMilliseconds;
const oneDecimal = Duration(milliseconds: 100);
_timer = Timer.periodic(
oneDecimal,
(Timer timer) {
setState(() {
if (_start < 100) {
_timer.cancel();
} else {
_start = _start - 100;
}
});
},
);
},
splashColor: Colors.red,
highlightColor: Colors.red,
shape: BeveledRectangleBorder(
side: BorderSide(color: Colors.black, width: 2.5),
borderRadius: BorderRadius.circular(15.0),
),
child: Text(
"$_start",
style: TextStyle(fontFamily: "Minim", fontSize: 50.0),
),
),
);
}
}
Flutter Countdown Timer问题的出现原因是想要实现一个倒计时功能,从10开始每秒减一,直到0。两种解决方法是使用Timer.periodic函数或者使用quiver.async库中的CountdownTimer类。第一种方法使用Timer.periodic函数创建一个重复定时器,每秒触发一次回调函数,通过改变_start的值来实现倒计时。第二种方法使用CountdownTimer类,通过监听器实现倒计时,并在完成时取消计时器。解决方法中还包括了如何处理按钮点击行为的问题,可以禁用按钮、添加非空条件、取消计时器和重置倒计时等不同的解决方案。最后还提到了使用async包中的RestartableTimer类来实现重启计时器的方法。同时还回答了关于Timer和Timer.periodic的区别,如何显示小数,如何解决开始计时有延迟的问题,如何使计时器在程序被杀死后继续运行,如何处理计时器在后台运行的问题,以及如何解决在计时过程中文本输入的问题。
Flutter Countdown Timer问题的原因是在使用计时器时遇到困难,需要添加运行时启动和停止计时器的功能,以及实现暂停功能和计时器的计时方式。 解决方法是在CountDownTimer小部件中添加相应的代码来实现所需的功能。
CountDownTimer小部件是一个通用的计时器小部件,可用于显示任何类型的计时器,并且非常灵活。 它接受以下属性:
1. secondsRemaining:计时器需要运行的持续时间(以秒为单位)
2. whenTimeExpires:计时器完成后要执行的操作
3. countDownStyle:要为计时器设置的任何样式
4. countDownFormatter:用户想要显示倒计时计时器的方式,例如“hh mm ss”字符串,如“01小时:20分钟:45秒”
如果不想从每个地方提供格式化程序,可以提供默认的格式化程序(formatHHMMSS)。 实现方法如下:
String formatHHMMSS(int seconds) {
int hours = (seconds / 3600).truncate();
seconds = (seconds % 3600).truncate();
int minutes = (seconds / 60).truncate();
String hoursStr = (hours).toString().padLeft(2, '0');
String minutesStr = (minutes).toString().padLeft(2, '0');
String secondsStr = (seconds % 60).toString().padLeft(2, '0');
if (hours == 0) {
return "$minutesStr:$secondsStr";
}
return "$hoursStr:$minutesStr:$secondsStr";
}
CountDownTimer小部件还包括了启动和停止计时器的逻辑,以及在计时器完成时执行操作的逻辑。 它使用AnimationController来控制计时器的动画。
在使用CountDownTimer小部件时,可以通过设置secondsRemaining属性来指定计时器的持续时间。 当计时器完成时,将通过whenTimeExpires回调执行相应的操作。 可以通过设置countDownTimerStyle属性来自定义计时器的样式。
如果想要实现暂停功能,可以使用setState方法来更新CountDownTimer小部件的状态,并在状态发生变化时暂停计时器的动画。
如果想要实现计时器的计时方式为计时向上而不是向下,可以修改formatHHMMSS方法中的计算逻辑。
如果想要在用户按下按钮并从屏幕导航离开时打印经过的计时时间,可以添加一个监听器来监听动画的值,并在适当的时机获取计时时间。
以上就是解决Flutter Countdown Timer问题的方法和实现。
Flutter Countdown Timer问题的出现原因是没有提供计时器重新启动的功能。解决方法是定义一个动画控制器,并在时间结束后使用该控制器重新启动计时器。此外,可以使用DateTime.now来获取当前时间,并将其与计时器一起显示。可以使用TweenAnimationBuilder小部件来实现平滑动画效果。
下面是解决问题的详细步骤及代码示例:
首先,使用TweenAnimationBuilder小部件创建计时器动画。在构造函数中,设置动画的持续时间、动画范围和结束时的回调函数。在构建器函数中,使用动画值来计算分钟和秒,并将其显示在Text小部件中。
TweenAnimationBuilder
duration: Duration(minutes: 3),
tween: Tween(begin: Duration(minutes: 3), end: Duration.zero),
onEnd: () {
print('Timer ended');
},
builder: (BuildContext context, Duration value, Widget? child) {
final minutes = value.inMinutes;
final seconds = value.inSeconds % 60;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5),
child: Text('$minutes:$seconds',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 30)));
}),
接下来,如果需要重新启动计时器,需要定义一个AnimationController,并在计时器结束后使用该控制器重新启动计时器。可以在onEnd回调函数中添加重新启动计时器的逻辑。例如:
final controller = AnimationController(
duration: Duration(minutes: 3),
vsync: this,
);
void restartTimer() {
controller.reset();
controller.forward();
}
onEnd: () {
print('Timer ended');
restartTimer();
},
最后,如果需要将当前时间与计时器一起显示,可以使用DateTime.now来获取当前时间,并将其与计时器一起显示。例如,可以使用以下代码来获取当前时间的小时和分钟:
final now = DateTime.now();
final currentHour = now.hour;
final currentMinute = now.minute;
将获取到的小时和分钟与计时器一起显示,即可实现显示当前时间的效果。
通过以上步骤和代码示例,可以解决Flutter Countdown Timer问题,并实现计时器重新启动和显示当前时间的功能。