Android 互斥器未获取颤振中的临界截面

Android 互斥器未获取颤振中的临界截面,android,flutter,Android,Flutter,我有一架会唱歌的钢琴。每首歌曲都有一个带有音符的数组代表 有10首歌。在myTone1中,我检查正在播放的歌曲。并获取m互斥体。所以我没有同时播放歌曲。所以我根据颤振文档使用了互斥,但它不起作用。歌曲仍在相互播放 void simonPlay (int index, int c) async { await Future.delayed(Duration(milliseconds: index * 500), () { songs.play(c); }

我有一架会唱歌的钢琴。每首歌曲都有一个带有音符的数组代表

有10首歌。在myTone1中,我检查正在播放的歌曲。并获取m互斥体。所以我没有同时播放歌曲。所以我根据颤振文档使用了互斥,但它不起作用。歌曲仍在相互播放

void simonPlay (int index, int c) async {

      await Future.delayed(Duration(milliseconds: index *  500), () {
        songs.play(c);
      });
  }

  void playSequence(List<int> sequence) async {
    try {
      // critical section with asynchronous code
     for (var i = 0; i < sequence.length ; i++) {

          simonPlay(i,sequence[i]);
      }
  } finally {
    m.release();
    }
    }


  Widget myTone1(Color myColor1,Color myColor2, int myNumber)
  {
    return Expanded(
       child : AbsorbPointer ( absorbing: false,
        child: TextButton(
          style: ButtonStyle(backgroundColor: MaterialStateProperty.all(myColor1)),
          onPressed: () async {
              setState(() async {
                switch (myNumber) {
                  case 1:
                    await m.acquire();
                    playSequence(song1);
                    break;
                  case 2:
                    await m.acquire();
                    playSequence(song2);
                    break;

                  case 3:
                    await m.acquire();
                    playSequence(song3);
                    break;

                  //from 3 to 8

                  case 9:
                    await m.acquire();
                    playSequence(song9);
                    break;

                  case 10:
                    await m.acquire();
                    playSequence(song10);

                }

              },
              );
void-simonPlay(int-index,int-c)异步{
等待未来。延迟(持续时间(毫秒:索引*500),(){
歌曲.播放(c);
});
}
无效播放序列(列表序列)异步{
试一试{
//带异步代码的临界段
对于(变量i=0;i
setState
:提供的回调立即被同步调用。它不能返回未来(回调不能是
async
),因为这样就不清楚实际设置状态的时间。如果从setState中删除async,则不能使用wait m.aquire();您建议我如何编辑它?在调用
switch
函数后,您可以调用
setState
函数。例如
switch(){};setState((){//无需添加任何内容})
;它不起作用,能否请您详细说明完整的答案?