Flutter点击上一首按钮若slider值超3秒则重置为0的回弹问题如何解决
问题原因
你只修改了自己维护的UI层变量currentValue,没有同步调用Just Audio播放器的seek方法跳转播放进度。常规实现中你肯定监听了播放器的实时进度流,回调会将播放器真实的播放进度赋值给currentValue,导致你手动修改的currentValue立刻被真实值覆盖,所以Slider会回弹。
修复方案
第一步:修改上一首按钮逻辑
在重启歌曲的分支中,新增播放器跳转到起始位置的调用,代码调整如下:
IconButton( onPressed: () { if (currentValue > 3000.0) { // 新增该行,同步让播放器跳转到0进度 audioPlayer.seek(Duration.zero); setState(() { currentValue = minValue; }); } else { widget.changeTrack(false); } }, // 原有图标配置保留即可 )
第二步(可选优化):统一进度同步逻辑
建议直接监听Just Audio官方提供的positionStream来更新currentValue,无需手动维护进度映射,保证UI和播放器状态永远同步:
late StreamSubscription<Duration> _positionSub; @override void initState() { super.initState(); // 监听播放器实时进度 _positionSub = audioPlayer.positionStream.listen((currentPos) { setState(() { currentValue = currentPos.inMilliseconds.toDouble(); }); // 你原有的自动切下一曲逻辑也可以挪到这里,避免写在build方法中被重复触发 if (currentValue >= maxValue) { widget.changeTrack(true); } }); } @override void dispose() { // 页面销毁时取消监听避免内存泄漏 _positionSub.cancel(); super.dispose(); }
加了这个监听之后,你点击按钮时甚至不需要手动给currentValue赋值,只要调用audioPlayer.seek(Duration.zero),监听回调会自动更新进度,Slider自然会跳到开头。
内容的提问来源于stack exchange,提问作者IBlackVikingl
相关产品推荐
相关产品推荐

