下面是我的计时器函数及其输出(都在同一页中(,我希望能帮我弄清楚如何将输出更改为分钟和秒。就目前的情况来看,只有几秒钟的时间。
class _TimerPageState extends State<TimerPage> {
int _counter = 0;
Timer _timer;
bool _vibrationActive = false;
void _startTimer() {
_counter = Duration(minutes: 25).inMinutes;
if (_timer != null) {
_timer.cancel();
}
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
setState(() {
if (_counter > 0) {
_counter--;
} else {
_timer.cancel();
vibrate();
print(
"I'm picking up good vibrations"); //test print to chceck if method gets past vibartion
} //meaning that vibration function is called and working
});
});
}
这是的输出位置
Widget _buildVerticalLayout(_counter, _startTimer, _pauseTimer) {
return Scaffold(
body: Padding(
padding: EdgeInsets.symmetric(horizontal: 40.0, vertical: 60.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
'Pomo Timer',
style: TextStyle(
color: Colors.black,
fontSize: 40.0,
fontWeight: FontWeight.bold),
),
SizedBox(height: 140.0),
Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
(_counter > 0) ? Text("") : Text("5 minute break!",
style: TextStyle(
color: Colors.green,
fontWeight: FontWeight.bold,
fontSize: 48,
),
),
Text(
'$_counter',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 48,
),
),
ElevatedButton(
onPressed: () => _startTimer(),
child: Text("Pomo Start"),
),
ElevatedButton(
onPressed: () {
_pauseTimer();
},
child: Text("Pomo Pasue"),
),
],
),
],
),
),
);
}
到目前为止,我读到的所有内容都让我不知所措,我想我只是太仔细了。我真的希望这不是一个重复的问题,我会浪费时间的。为任何回应的人干杯!
正如@mkobuolys所指出的,您将25分钟的持续时间转换为25的整数,然后每秒从中减去。所以我假设你想把它转换成秒(你可以只做分钟*60(。
为了提供一种替代方案,一种自己处理这个问题的简单方法是使用内置的dart:math
函数和一点简单的数学:
'${(seconds/60).floor()}:'+'${seconds%60}'.padLeft(2, '0')
或者,如果你想在分钟部分显示尾随零:
'${(seconds/60).floor()}'.padLeft(2, '0')+':'+'${seconds%60}'.padLeft(2, '0')
通过将秒除以60(seconds/60
(得到分钟,然后使用floor
去除余数。然后,通过使用模运算符(seconds%60
(获取先前丢弃的余数来获得秒数。最后,如果数字是个位数,则使用padLeft
提供尾随零。
我建议您将_counter
值保留为Duration
对象:
void _startTimer() {
_counter = Duration(minutes: 25);
...
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
setState(() {
if (_counter > 0) {
_counter -= Duration(seconds: 1);
} else {
...
}
});
});
}
然后,在您的UI中,您可以使用Duration
类方法来实现您的目标:
Widget _buildVerticalLayout(_counter, _startTimer, _pauseTimer) {
final minutes = _counter.inMinutes;
final seconds = _counter.inSeconds - minutes * Duration.secondsPerMinute;
...
Text(
'$minutes:$seconds',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 48,
),
),
...
}