如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?
Posted
技术标签:
【中文标题】如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?【英文标题】:How to create an alarm that goes during a countdown timer created with an AnimationController? 【发布时间】:2020-08-23 15:14:21 【问题描述】:我使用动画控制器创建了一个倒数计时器,方法如下(发布在下面)。我知道在计时器完成时执行代码,但我想知道是否有办法在倒数计时器仍在运行时在一定时间后执行函数。在这种情况下,我想在计时器完成前 10 秒发出警报声,让用户知道他们的时间快到了。任何帮助将不胜感激。
class Timer extends StatefulWidget
@override
State<StatefulWidget> createState()
return _TimerState();
class _TimerState extends State<Timer> with SingleTickerProviderStateMixin
AnimationController _controller;
int _timerDuration = 2;
@override
void initState()
super.initState();
_controller = AnimationController(
vsync: this, duration: Duration(minutes: _timerDuration));
@override
Widget build(BuildContext context)
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Countdown(
animation: StepTween(
begin: _timerDuration * 60,
end: 0,
).animate(_controller),
),
),
),
);
@override
void dispose()
_controller.dispose();
super.dispose();
class Countdown extends AnimatedWidget
Countdown(Key key, this.animation) : super(key: key, listenable: animation);
Animation<int> animation;
@override
build(BuildContext context)
Duration clockTimer = Duration(seconds: animation.value);
String timerText =
'$clockTimer.inMinutes.remainder(60).toString():$(clockTimer.inSeconds.remainder(60) % 60).toString().padLeft(2, '0')';
return Text(
"$timerText",
);
【问题讨论】:
【参考方案1】:你需要设置一个定时器并设置回调来播放声音:
Timer(Duration(<Your duration minus 10 sec>), ()
// play the sound here
);
要播放声音,请查看此帖子:https://fluttercentral.com/Articles/Post/1234/How_to_play_an_audio_file_in_flutter
【讨论】:
我试了你贴的方法,在动画倒计时所反映的指定时间,定时器和回调没有播放。在这种情况下,它应该在时钟出现 10 秒时播放,但计时器本身直到 8 秒标记才工作。 你的问题似乎是同步。问题是 AnimatedWidget 与时间和帧速率不完全同步。您将需要一种方法来跟踪帧速率内的时间(在构建方法内)。我建议您跟踪初始时间戳 (DateTime.now()) 并在 build 方法中调用一个函数,该函数将计算经过的时间并在时间超过所需持续时间时开始播放声音。我可以在下班时发布一个示例。 不要忘记之前加载声音,如果在声音应该开始播放的那一刻加载,可能会导致延迟。 谢谢,我们将不胜感激。期待这个例子。以上是关于如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?的主要内容,如果未能解决你的问题,请参考以下文章