docs(plans): 留痕 K79 进度拖动防闪
This commit is contained in:
1 parent
64ddfe8cae
commit
f1c11df5d5
2 files changed
+75
-25
No files matched your search
+46
-25
@@ -1,44 +1,65 @@
|
||||
# INBOX
|
||||
|
||||
## [已处理] K78-A 底部导航图标与文字放大
|
||||
## [已处理] K79-A 拖动进度条闪一下(加载态闪烁)修复
|
||||
|
||||
### 需求
|
||||
### 现象
|
||||
|
||||
底部导航(首页/剧场/创作/我的,浅色与首页 feed 深色共用 `AppBottomNav`)的图标和文字偏小,
|
||||
整体放大一档。
|
||||
拖动 / 点按进度条 seek 之后,进度条会闪一下:整条正常进度条被加载轨道替换一瞬,再切回来。
|
||||
|
||||
### 现状
|
||||
### 根因
|
||||
|
||||
`lib/core/theme/app_dimens.dart`:
|
||||
K77-A 引入的加载态判定是「`isBuffering` 为 true 就切成 `LoadingProgressTrack`」:
|
||||
|
||||
- `navIcon = 20`
|
||||
- `navLabel = 10`
|
||||
- `navHeight = 64`
|
||||
- `lib/pages/player/widgets/seek_progress_bar.dart`:`loading = !isInitialized || isBuffering`
|
||||
- `lib/pages/player/widgets/home_feed_overlay_parts.dart`:`if (!value.isInitialized || value.isBuffering) return _loadingTrack();`
|
||||
|
||||
`AppBottomNav` 里图标与文字间距 `SizedBox(height: 2)`。
|
||||
seek 本身会触发播放器短暂的 buffering(几百毫秒),于是拖动过程中/松手瞬间
|
||||
进度条被替换成加载轨道,表现为「闪一下」;拖动时也没有排除加载态。
|
||||
|
||||
### 改动
|
||||
### 修复方案
|
||||
|
||||
1. `lib/core/theme/app_dimens.dart`
|
||||
- `navIcon`:`20` → `24`
|
||||
- `navLabel`:`10` → `12`
|
||||
- `navHeight`:`64` → `68`
|
||||
2. `lib/core/widgets/app_bottom_nav.dart`
|
||||
- 图标与文字间距 `2` → `3`,其余布局不变(四等分、选中态主题色、深色/浅色两种底不变)
|
||||
3. `test/theme/app_dimens_test.dart`
|
||||
- 断言同步为 `navLabel = 12`、`navHeight = 68`(如断言了 `navIcon` 一并更新)
|
||||
1. **拖动期间永不显示加载态**:只要处于拖动预览(`_previewFraction != null` / `_preview != null`),
|
||||
一律渲染正常进度条与滑块。
|
||||
2. **缓冲态加去抖**:buffering 需要持续 **350ms** 以上才切到加载轨道;
|
||||
恢复播放 / 缓冲结束立即取消定时器并切回正常进度条。
|
||||
`!isInitialized`(首帧没出来)仍然立即显示加载轨道,不去抖。
|
||||
|
||||
### 实现
|
||||
|
||||
1. `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);`
|
||||
2. `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`
|
||||
- 首页 feed 进度条如有相关用例,同样按去抖(>350ms)与拖动中不切加载态调整
|
||||
|
||||
### 验收
|
||||
|
||||
- 空间检查:`navHeight 68` 下 24 图标 + 3 间距 + 12 文字垂直居中不溢出
|
||||
- 门禁:`dart analyze lib test` 零告警、`flutter test` 全过、`flutter build apk --debug` 成功
|
||||
- 门禁:`dart analyze lib test` 零告警、`flutter test` 全过、`flutter build apk --debug` 成功。
|
||||
- 真机自查:连续拖动进度条,进度条与滑块不再闪成加载态;真正卡顿(>350ms)仍会显示加载轨道。
|
||||
|
||||
### Git
|
||||
|
||||
- 从 `develop` 拉 `feat/bottom-nav-larger`。
|
||||
- 提交:`feat(nav): 底部导航图标与文字放大`,作者 `Zhou Weidong <502333560@qq.com>`。
|
||||
- `--no-ff` 合回 `develop` 并 push;`FruitServer/docs/plans/PROGRESS.md` 追加 K78-A 留痕。
|
||||
- 从 `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`;只动导航尺寸与相关断言;完成后停住等待验收。
|
||||
- 全程中文;禁止 `git add -A`;不改其它播放逻辑;完成后停住等待验收。
|
||||
Reference in new issue
Block a user