You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:24:03