Flutter 按钮图标不随音频播放器改变

Flutter Button Icon not changing with audio player

我正在尝试制作一个广播应用程序,使用 assets_audio_player 库,它确实从 link 获取广播流,一切正常,但是当我尝试制作Play/Pause按钮相应地改变图标,它只是不起作用,我尝试了两种方法:

1- 使用库构建器:

assetsAudioPlayer.builderCurrent(
              builder: (context, isPlaying){
                return PlayerBuilder.isPlaying(
                    player: assetsAudioPlayer,
                    builder: (context, isPlaying) {
                      return RawMaterialButton(
                          constraints: BoxConstraints.expand(width: 70, height: 70),
                          fillColor: Constants.WHITE,
                          shape: CircleBorder(),
                          child: RadiantGradientMask(
                            child: Icon(isPlaying ? Icons.pause : Icons.play_arrow ,
                              size: 42,
                              color: Constants.WHITE,
                            ),
                            gradient: gradient,
                          ),
                          onPressed: (){
                            assetsAudioPlayer.playOrPause();
                          }
                          );
                    });
              }
          ),

2- 使用普通按钮、布尔值和 setState:

RawMaterialButton(
            constraints: BoxConstraints.expand(width: 70, height: 70),
            fillColor: Constants.WHITE,
            shape: CircleBorder(),
            child: RadiantGradientMask(
              child: Icon(isPlaying ? Icons.pause : Icons.play_arrow ,
                size: 42,
                color: Constants.WHITE,
              ),
              gradient: gradient,
            ),
            onPressed: (){
              assetsAudioPlayer.playOrPause();
              setState(() {
                isPlaying = assetsAudioPlayer.isPlaying.value;
              });
            },

第一种方法,库开始推流,但是图标完全没有变化(pause/play),第二种方法,它确实变了,但是按了几次按钮后,它出现故障,'play' 变为 'pause','pause' 变为 'play'(反转)。

知道如何让它正常工作吗?

方法调用assetsAudioPlayer.playOrPause();是异步的,setState({});是同步的。 您正在检查状态是否同步更改,但更改它是异步的,您需要等待 playOrPause() 方法。