3.2 KiB
3.2 KiB
INBOX
[已处理] K79-A 拖动进度条闪一下(加载态闪烁)修复
现象
拖动 / 点按进度条 seek 之后,进度条会闪一下:整条正常进度条被加载轨道替换一瞬,再切回来。
根因
K77-A 引入的加载态判定是「isBuffering 为 true 就切成 LoadingProgressTrack」:
lib/pages/player/widgets/seek_progress_bar.dart:loading = !isInitialized || isBufferinglib/pages/player/widgets/home_feed_overlay_parts.dart:if (!value.isInitialized || value.isBuffering) return _loadingTrack();
seek 本身会触发播放器短暂的 buffering(几百毫秒),于是拖动过程中/松手瞬间 进度条被替换成加载轨道,表现为「闪一下」;拖动时也没有排除加载态。
修复方案
- 拖动期间永不显示加载态:只要处于拖动预览(
_previewFraction != null/_preview != null), 一律渲染正常进度条与滑块。 - 缓冲态加去抖:buffering 需要持续 350ms 以上才切到加载轨道;
恢复播放 / 缓冲结束立即取消定时器并切回正常进度条。
!isInitialized(首帧没出来)仍然立即显示加载轨道,不去抖。
实现
lib/pages/player/widgets/seek_progress_bar.dart_SeekProgressBarState增加:Timer? _bufferTimer; bool _buffering = false;- 监听
widget.valueListenable(initState/didUpdateWidget处理控制器切换 /dispose移除) - 监听回调里:未初始化 → 直接置 buffering;buffering 持续 350ms 才
setState(_buffering = true); 否则取消定时器并复位
_buildTrack:final scrubbing = _previewFraction.value != null;final loading = !scrubbing && (!video.isInitialized || _buffering);
lib/pages/player/widgets/home_feed_overlay_parts.dart_FeedProgressBarState- 同样的
Timer + _buffering去抖;监听widget.controller build里:final scrubbing = _preview != null;if (source == null || (!scrubbing && _buffering)) return _loadingTrack();source == null(控制器都没有)仍立即显示加载轨道- 加载态期间不响应拖动(
GestureDetector的 onHorizontalDrag* 传 null)
- 同样的
测试
test/playback/seek_progress_bar_test.dart:- 原「buffering 立即出现
progress-loading」用例改为pump(400ms)后出现 - 新增:
pump(200ms)时仍是Slider(去抖生效) - 新增:拖动中(
onChangeStart后)即使 buffering 也不出现progress-loading
- 原「buffering 立即出现
- 首页 feed 进度条如有相关用例,同样按去抖(>350ms)与拖动中不切加载态调整
验收
- 门禁:
dart analyze lib test零告警、flutter test全过、flutter build apk --debug成功。 - 真机自查:连续拖动进度条,进度条与滑块不再闪成加载态;真正卡顿(>350ms)仍会显示加载轨道。
Git
- 从
develop拉fix/progress-scrub-flicker。 - 提交:
fix(player): 修复拖动进度条时加载态闪烁,作者Zhou Weidong <502333560@qq.com>。 --no-ff合回develop并 push;FruitServer/docs/plans/PROGRESS.md追加 K79-A 留痕。
约束
- 全程中文;禁止
git add -A;不改其它播放逻辑;完成后停住等待验收。