Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 异步/等待未按预期工作。如何在颤振中开始播放声音4秒后启动计时器?_Flutter_Async Await - Fatal编程技术网

Flutter 异步/等待未按预期工作。如何在颤振中开始播放声音4秒后启动计时器?

Flutter 异步/等待未按预期工作。如何在颤振中开始播放声音4秒后启动计时器?,flutter,async-await,Flutter,Async Await,当我的应用程序的游戏屏幕出现时,一个音频文件开始播放,上面写着“准备好了吗?3…2…1…开始”,然后播放音乐 我希望游戏计时器在显示“开始”的同时启动,这正好是音频中的4秒 我在initState()中启动音频文件,然后使用“Future.delayed(const Duration(seconds:4),()=>startTimer());”,但问题是用户第一次播放时,音频加载需要一点时间,因此计时器在音频显示“GO”之前启动 我试图通过创建一个使用async和await的startMeseq

当我的应用程序的游戏屏幕出现时,一个音频文件开始播放,上面写着“准备好了吗?3…2…1…开始”,然后播放音乐

我希望游戏计时器在显示“开始”的同时启动,这正好是音频中的4秒

我在initState()中启动音频文件,然后使用“Future.delayed(const Duration(seconds:4),()=>startTimer());”,但问题是用户第一次播放时,音频加载需要一点时间,因此计时器在音频显示“GO”之前启动

我试图通过创建一个使用async和await的startMesequence()函数来解决这个问题,但它不起作用。我做错了什么

以下是到目前为止我得到的信息:

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();
}