修改just_audio:LoopMode.one下seekToNext跳转至下一曲
解决just_audio中LoopMode.one下手动切歌失效的问题
我需要修改just_audio的行为:当LoopMode设为LoopMode.one时,手动点击下一曲按钮(调用seekToNext)要跳转到播放列表的下一首,但曲目自然播放结束时仍保持单曲循环(和Spotify等主流应用逻辑一致)。尝试通过点击按钮时临时关闭LoopMode.one的方式实现,但按钮失效了,附上我的代码:
StreamBuilder<SequenceState?>( stream: player.sequenceStateStream, builder: (context, snapshot) => IconButton( icon: Icon(Icons.skip_previous), iconSize: 50.0, onPressed: // default code // player.hasNext ? player.seekToNext : null, // modified code below not working () { if (player.loopMode == LoopMode.off || player.loopMode == LoopMode.all) { player.hasNext ? player.seekToNext : null; } else if (player.loopMode == LoopMode.one) { player.setLoopMode(LoopMode.off); player.hasNext ? player.seekToNext : null; player.setLoopMode(LoopMode.one); } }), ),
问题原因
- 方法调用错误:
player.seekToNext只是方法引用,没有加括号执行,所以实际没触发切歌操作,应该写成player.seekToNext()。 - 异步顺序冲突:连续同步调用
setLoopMode和seekToNext会导致逻辑混乱,just_audio的操作是异步的,切歌还没完成就恢复LoopMode.one,可能打断切歌流程。
修复方案
修复方法调用,并通过async/await确保操作顺序,代码如下:
StreamBuilder<SequenceState?>( stream: player.sequenceStateStream, builder: (context, snapshot) => IconButton( icon: const Icon(Icons.skip_previous), iconSize: 50.0, onPressed: () async { if (!player.hasNext) return; // 无下一曲时直接返回 if (player.loopMode == LoopMode.one) { // 临时关闭单曲循环 await player.setLoopMode(LoopMode.off); // 执行切歌操作 await player.seekToNext(); // 恢复单曲循环模式 await player.setLoopMode(LoopMode.one); } else { // 其他循环模式直接切歌 await player.seekToNext(); } }, ), ),
说明
- 先判断
player.hasNext,避免无效操作。 - 用
async/await保证每一步异步操作完成后再执行下一步,解决顺序冲突问题。 - 修改后,手动点击切歌会跳转到下一首;曲目自然播放结束时,因LoopMode.one仍生效,会自动重复当前曲目,完全符合需求。
内容的提问来源于stack exchange,提问作者Jar Jar Claus
相关产品推荐
相关产品推荐

