Flutter:当倒数计时器达到 0 时执行操作
Flutter: Perform an action when a countdown timer reaches 0
我在 Flutter 中创建了一个显示倒数计时器的屏幕。我可以播放、暂停和重启计时器,但我想弄清楚当计时器达到 0 时如何执行操作(例如,自行重启)。
由于 dart 文件相当长,我只是将我认为是相关部分的内容复制到下面。但如果需要,我可以添加更多。
首先我为倒数计时器创建了一个widget/class:
class Countdown extends AnimatedWidget {
Countdown({ Key key, this.animation }) : super(key: key, listenable: animation);
Animation<int> animation;
@override
build(BuildContext context){
return Text(
animation.value.toString(),
style: TextStyle(
fontSize: 120,
color: Colors.deepOrange
),
);
}
}
然后我有一个有状态的小部件,它创建控制器并导入一些数据(gameData.countdownClock
是倒数计时器的开始时间,它来自用户在较早屏幕上的输入):
class _GameScreenState extends State<GameScreen> with TickerProviderStateMixin {
AnimationController _controller;
_GameScreenState(this.gameData);
GameData gameData;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(seconds: gameData.countdownClock),
);
}
然后是显示时钟的容器:
Container(
child: Countdown(
animation: StepTween(
begin: gameData.countdownClock,
end: 0,
).animate(_controller),
),
),
我必须在最后一个容器中添加侦听器吗?或者别的地方? (或者完全是其他东西!)
感谢任何帮助。谢谢
动画控制器的可能值在0到1之间。
所以我认为你必须在 gamedata.countDownClock
上添加监听器
请检查下面的代码,您可能会从中得到一些想法。
import 'dart:async';
import 'package:flutter/material.dart';
class GameScreen extends StatefulWidget {
@override
_GameScreenState createState() => _GameScreenState();
}
class _GameScreenState extends State<GameScreen> with SingleTickerProviderStateMixin {
int countdownClock = 10;
@override
void initState() {
super.initState();
// Your Game Data Counter Change every one Second
const oneSec = const Duration(seconds:1);
new Timer.periodic(oneSec, (Timer t) {
// Restart The Counter Logic
if (countdownClock == 0)
countdownClock = 11;
setState(() { countdownClock = countdownClock - 1; });
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("")),
body: Center(
child: Text('$countdownClock')
),
);
}
}
我在这个页面找到了答案:
我需要将 .addStatusListener
添加到 initState()
中的动画控制器。
所以新的 initState()
代码如下所示:
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(seconds: gameData.countdownClock),
);
_controller.addStatusListener((status){
if(status == AnimationStatus.completed){
_controller.reset();
}
}
);
}
我在 Flutter 中创建了一个显示倒数计时器的屏幕。我可以播放、暂停和重启计时器,但我想弄清楚当计时器达到 0 时如何执行操作(例如,自行重启)。
由于 dart 文件相当长,我只是将我认为是相关部分的内容复制到下面。但如果需要,我可以添加更多。
首先我为倒数计时器创建了一个widget/class:
class Countdown extends AnimatedWidget {
Countdown({ Key key, this.animation }) : super(key: key, listenable: animation);
Animation<int> animation;
@override
build(BuildContext context){
return Text(
animation.value.toString(),
style: TextStyle(
fontSize: 120,
color: Colors.deepOrange
),
);
}
}
然后我有一个有状态的小部件,它创建控制器并导入一些数据(gameData.countdownClock
是倒数计时器的开始时间,它来自用户在较早屏幕上的输入):
class _GameScreenState extends State<GameScreen> with TickerProviderStateMixin {
AnimationController _controller;
_GameScreenState(this.gameData);
GameData gameData;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(seconds: gameData.countdownClock),
);
}
然后是显示时钟的容器:
Container(
child: Countdown(
animation: StepTween(
begin: gameData.countdownClock,
end: 0,
).animate(_controller),
),
),
我必须在最后一个容器中添加侦听器吗?或者别的地方? (或者完全是其他东西!)
感谢任何帮助。谢谢
动画控制器的可能值在0到1之间。
所以我认为你必须在 gamedata.countDownClock
上添加监听器
请检查下面的代码,您可能会从中得到一些想法。
import 'dart:async';
import 'package:flutter/material.dart';
class GameScreen extends StatefulWidget {
@override
_GameScreenState createState() => _GameScreenState();
}
class _GameScreenState extends State<GameScreen> with SingleTickerProviderStateMixin {
int countdownClock = 10;
@override
void initState() {
super.initState();
// Your Game Data Counter Change every one Second
const oneSec = const Duration(seconds:1);
new Timer.periodic(oneSec, (Timer t) {
// Restart The Counter Logic
if (countdownClock == 0)
countdownClock = 11;
setState(() { countdownClock = countdownClock - 1; });
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("")),
body: Center(
child: Text('$countdownClock')
),
);
}
}
我在这个页面找到了答案:
我需要将 .addStatusListener
添加到 initState()
中的动画控制器。
所以新的 initState()
代码如下所示:
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(seconds: gameData.countdownClock),
);
_controller.addStatusListener((status){
if(status == AnimationStatus.completed){
_controller.reset();
}
}
);
}