当前位置: 首页 > 知识库问答 >
问题:

AudioPlayer暂停方法不工作-Flutter

谭铭
2023-03-14

我正在使用AudioPlayer包来开发音频/媒体播放器。要从资产文件夹加载音乐,我使用AudioCache类,并使用其他方法(暂停、停止和持续时间),我使用AudioPlayer。

当我单击按钮播放音乐时,它可以完美地工作,但是当我再次单击该按钮以暂停音乐时,它根本不起作用(音乐继续播放),并且单击时两个图标都没有更改

我做错了什么?

这是代码

class Music extends StatefulWidget {

  @override
  _MusicState createState() => _MusicState();
}

class _MusicState extends State<Music> {

  Duration duration = new Duration();
  Duration position = new Duration();
  AudioCache player = AudioCache();  // AudioCache 
  AudioPlayer audioPlayer = AudioPlayer(); // AudioPlayer
  bool playing = false;


  void getAudio() async{

    if(playing){

      var result = await audioPlayer.pause();

      if(result == 1) {
        setState(() {
          playing = false;
        });
      }

    }else{

      var result = await player.play('audio/music.mp3'); // to play the music from asset folder or local file

      if(result == 1) {
        setState(() {
          playing = true;
        });
      }
    }

    audioPlayer.onDurationChanged.listen((Duration dd){
      setState(() {
        duration = dd;
      });
    });

    audioPlayer.onAudioPositionChanged.listen((Duration dd){
      setState(() {
        position = dd;
      });
    });

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('App Name', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontFamily: 'oswald'),),
        centerTitle: true,
        flexibleSpace: Image(
          image: AssetImage('images/bg.jpg'),
          fit: BoxFit.cover,
        ),
      ),
      backgroundColor: Colors.grey[200],
      body: SafeArea(
          child: Container(
            padding: EdgeInsets.all(25.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Slider(
                  value: position.inSeconds.toDouble(),
                  min: 0,
                  max: duration.inSeconds.toDouble(),
                  activeColor: Colors.deepOrange,
                  onChanged: (double value){
                    setState(() {
                      audioPlayer.seek(new Duration(seconds: value.toInt()));
                    });
                  },
                ),
                SizedBox(height: 10.0,),
                Ink(
                  decoration: const ShapeDecoration(
                    color: Colors.deepOrange,
                    shape: CircleBorder(),
                  ),
                  child: IconButton(
                    icon: Icon(playing == false ? Icons.play_arrow : Icons.pause_circle),
                    iconSize: 50.0,
                    color: Colors.white,
                    onPressed: () {
                        getAudio(); // call function
                    },
                  ),
                ),
              ],
            ),
          ),
      ),
    );
  }
}

共有1个答案

郦良才
2023-03-14

您需要将< code >结果设置为< code>audioplayer属性:

if (result.state == PlayerState.PLAYING) {
    setState(() {
      playing = true;
    });
  }
  audioPlayer = result;
 类似资料:
  • 当播放时,方法可以很好地工作。如果被暂停,当我找到一个位置并调用时,它就会在它暂停的地方开始播放。 我的代码如下所示,在logcat中,我可以看到它正在寻找。

  • 在模拟网络连接失败几秒钟的情况下,尝试暂停HikariCP池时会引发异常。为什么泳池可以不可以暂停?有没有其他简单的方法来模拟丢失的网络连接(到本地主机上的MySQL服务器)? 配置: 属性: JUnit: 例外

  • 问题内容: 在Spring Framework手册中,它们声明对于PROPAGATION_REQUIRES_NEW,当前事务将被挂起。 那“暂停交易”是什么?超时计时器停止指望当前事务吗?这种暂停的实际含义是什么? 谢谢, 问题答案: 这并不意味着什么特别的事情,挂起的事务只是暂时不用于插入,更新,提交或回滚的事务,因为由于指定的传播属性应创建一个新事务,并且只能激活一个事务同时。 基本上有两种事

  • 暂停脚本的当前线程。 #p::Pause ; 按一次 Win+P 会暂停脚本. 再按一次则取消暂停. Pause [, On|Off|Toggle, OperateOnUnderlyingThread?] 参数 On|Off|Toggle 如果为空或省略, 则它默认为 Toggle. 否则, 请指定下列单词的其中一个: Toggle:如果在当前线程下的潜在线程处于运行状态,则暂停当前线程,否则让潜

  • 问题内容: 我一直在使用该功能来暂停脚本: 有正式的方法吗? 问题答案: 对我来说似乎很好(或在Python 2.X中)。或者,如果您想暂停一定的秒数,则可以使用。

  • 问题内容: 我知道此问题是由主线程上的sleep或wait调用引起的,有关如何解决此问题的答案是将方法放入单独的线程中,然后使该线程进入休眠状态。但是代码是一团糟,真的没有时间将其整理出来并分成单独的线程,并且想知道是否还有其他方法可以做到这一点?即使这不是使用GUI的最干净或最常见的做法。我只需要从方法中暂停一秒钟。 问题答案: 不创建单独的线程就无法做到这一点。用Java创建线程很容易。唯一要