Flutter 异步/等待未按预期工作。如何在颤振中开始播放声音4秒后启动计时器?
当我的应用程序的游戏屏幕出现时,一个音频文件开始播放,上面写着“准备好了吗?3…2…1…开始”,然后播放音乐 我希望游戏计时器在显示“开始”的同时启动,这正好是音频中的4秒 我在initState()中启动音频文件,然后使用“Future.delayed(const Duration(seconds:4),()=>startTimer());”,但问题是用户第一次播放时,音频加载需要一点时间,因此计时器在音频显示“GO”之前启动 我试图通过创建一个使用async和await的startMesequence()函数来解决这个问题,但它不起作用。我做错了什么 以下是到目前为止我得到的信息:Flutter 异步/等待未按预期工作。如何在颤振中开始播放声音4秒后启动计时器?,flutter,async-await,Flutter,Async Await,当我的应用程序的游戏屏幕出现时,一个音频文件开始播放,上面写着“准备好了吗?3…2…1…开始”,然后播放音乐 我希望游戏计时器在显示“开始”的同时启动,这正好是音频中的4秒 我在initState()中启动音频文件,然后使用“Future.delayed(const Duration(seconds:4),()=>startTimer());”,但问题是用户第一次播放时,音频加载需要一点时间,因此计时器在音频显示“GO”之前启动 我试图通过创建一个使用async和await的startMeseq
import 'package:audioplayers/audio_cache.dart';
import 'dart:async';
class GameScreen extends StatefulWidget {
@override
_GameScreenState createState() => _GameScreenState();
}
class _GameScreenState extends State<GameScreen> {
void loadAudio() {
final player = AudioCache();
player.load('audio/ready-321-go-music.mp3');
}
void playAudio() {
final player = AudioCache();
player.play('audio/ready-321-go-music.mp3');
}
void startGameSequence() async {
await loadAudio();
playAudio();
// After audio finishes loading / starts playing, THEN I'd like the 4-second delayed timer to start. (Currently, it seems that the time starts too early because the audio takes a bit to load.)
Future.delayed(
const Duration(seconds: 4),
() => startTimer(),
);
}
Timer _timer;
double _timeRemaining = 7.00;
void startTimer() {
const tick = const Duration(milliseconds: 10);
_timer = new Timer.periodic(
tick,
(Timer timer) => setState(
() {
if (_timeRemaining < 0.01) {
timer.cancel();
} else {
_timeRemaining = _timeRemaining - 0.01;
}
},
),
);
}
@override
initState() {
super.initState();
startGameSequence();
}
import'包:audioplayers/audio_cache.dart';
导入“dart:async”;
类GameScreen扩展StatefulWidget{
@凌驾
_GameScreeenState()=>\u GameScreeenState();
}
类_GameScreenState扩展状态{
void loadAudio(){
最终播放器=AudioCache();
player.load('audio/ready-321-go-music.mp3');
}
void playAudio(){
最终播放器=AudioCache();
player.play('audio/ready-321-go-music.mp3');
}
void startGameSequence()异步{
等待加载音频();
播放音频();
//在音频完成加载/开始播放后,我希望4秒延迟计时器启动。(目前,由于音频加载需要一点时间,时间似乎开始得太早。)
推迟(
常数持续时间(秒:4),
()=>startTimer(),
);
}
定时器(u定时器),;
双倍时间剩余=7.00;
void startTimer(){
常量刻度=常量持续时间(毫秒:10);
_定时器=新定时器。周期性(
打上钩
(计时器)=>设置状态(
() {
如果(_剩余时间<0.01){
timer.cancel();
}否则{
_剩余时间=_剩余时间-0.01;
}
},
),
);
}
@凌驾
initState(){
super.initState();
startGameSequence();
}
提前感谢您的帮助!InitState不是异步的,因此无法正常工作 一种解决方案是,在initState()中加载音频文件,并在
didUpdateWidget()
函数中执行startGameSequence()
,而不使用Future.delayed()
此函数仅在第一个布局出现在屏幕上时执行。InitState不是异步的,因此无法正常工作 一种解决方案是,在initState()中加载音频文件,并在
didUpdateWidget()
函数中执行startGameSequence()
,而不使用Future.delayed()
此函数在屏幕上出现第一个布局时执行。谢谢您的帮助,Eduardo!我在代码中添加了“@override void didUpdateWidget(GameScreen oldWidget){startGameSequence();super.didUpdateWidget(oldWidget);}”,并删除了“startGameSequence()”从InitState开始,但现在在加载屏幕时什么也没有发生。我尝试将“didUpdateWidget();”添加到InitState,但它显示“预期1个必需参数,但找到0。”我正在努力学习,但还是一个初学者。你能帮我理解这里发生了什么吗?当小部件第一次呈现并出现在屏幕上时,这个函数被调用。这个函数像InitState一样工作,但就在@build方法被调用之后。
SomeWidget
是小部件的名称,如果你想调用这个函数。Worked?在关于widgets方法的有用文本中,我仍然没有设法使它工作。我得到的一个错误是initState中的“wait”,它说“wait表达式只能在异步函数中使用。”我将阅读您发送的链接,看看是否可以了解更多。谢谢!谢谢您的帮助,Eduardo!我已经添加了“@override void didUpdateWidget(GameScreen oldWidget){startGateMesequence();super.didUpdateWidget(oldWidget);}”进入我的代码,并从InitState中删除了“startGateMesequence()”,但现在在屏幕加载时什么也没有发生。我试图将“didUpdateWidget();”添加到InitState,但它显示“需要1个必需参数,但找到0”。"我正在努力学习,但还是一个初学者。你能帮我理解这里发生了什么吗?当小部件第一次呈现并出现在屏幕上时,这个函数被调用。这个函数像InitState一样工作,但就在@build方法被调用之后。SomeWidget
是小部件的名称,如果你想调用这个函数。Worked?在关于widgets方法的有用文本中,我仍然没有设法使它工作。我得到的一个错误是initState中的“wait”,它说“wait表达式只能在异步函数中使用。”我将阅读您发送的链接,看看是否可以了解更多。谢谢!其余的代码在哪里?小部件的build
方法在哪里?小部件的build
方法在哪里?
@override
initState() {
super.initState();
await loadAudio();
}
@override
void didUpdateWidget(GameScreen oldWidget) {
startGameSequence()
super.didUpdateWidget(oldWidget);
}
void startGameSequence() {
playAudio();
}