我正在使用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
},
),
),
],
),
),
),
);
}
}
您需要将< 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创建线程很容易。唯一要