# 单标签导航与顶部滚动 日期:2026-10-06。工具链:Flutter 3.47.6 / Dart 3.13.5。 2026-10-25:按用户后续要求恢复单标签,Android 默认单标签,其他平台默认双标签。设置提供单/双/多标签,保留所有已保存的有效选择;此前已保存为 `dualTabs` 的值继续按双标签读取,尚存的 `singlePage` 直接恢复,不再强制迁移。平台默认仅补缺失/非法值,数据库与设置快照版本不变。以下“恢复单标签”说明当前行为,后续旧章节保留历史记录。 ## 恢复单标签(2026-10-25) - [工作区](../../lib/app/workspace_tabs.dart)按实际访问顺序返回,不跳过播放页:视频 A → UP 空间 → 视频 B → 返回空间 → 返回 A。视频、影视、直播、离线播放共用规则。普通页面遮挡播放沿用既有策略;进入另一播放页先暂停旧会话,返回沿用源和进度,用户手动暂停/倍速保持。 - 重复访问同一空间或播放页时保留更早的访问记录;返回只释放不再被历史引用的离开页,其请求、页面作用域和播放会话随之清理。频道、设置分类、分 P/选集和后台连续播放只更新原页面,不产生重复访问;迟到回调不能重建已出栈页面。 - 固定根导航保持同层,切换一级入口不把它变成临时页;消息仍优先退出所选会话,再返回消息入口,根页仍采用 Android 退出确认。弹窗、全屏和页内详情优先于工作区返回,预测手势读取同一返回目标,取消不消耗历史。 - 单标签隐藏标签栏,禁用新建/循环标签;既有关闭快捷键逐页返回。桌面沿用共享返回按钮和窗口标题栏,Android 播放页继续使用系统返回。横竖屏/窗口缩放不改变模式。 - 切换模式保留未关闭页面及其会话;双标签切到单标签时仍可消耗已有媒体历史。缓存最多 16 页、访问最多 64 条,满额时淘汰最旧的非根、非当前、非最近播放页面,避免空间跳转堵住导航并保护返回原视频的入口。 验证覆盖头像真实点击、空间内另开视频、同一页/会话/分 P 恢复、手动暂停/倍速/源 generation、重复访问、缓存上限、模式切换、弹窗优先和预测式返回。 ### 本轮验证 - 单标签、模式持久化及 Android 默认值专项 61 项通过,日志 `build/single-page-acceptance.log`。覆盖真实 router/ProviderScope 的头像点击、空间中新开视频、弹窗优先、取消预测返回、原页面/会话/分 P 保留、消息入口、根分支、横竖布局及新建/循环/关闭快捷键。 - `flutter test --no-pub test/features/playback/playback_session_test.dart` 共 197 项通过,日志 `build/single-page-session-final.log`。新增单标签和双切单的媒体检查点覆盖源恢复、暂停、倍速、owner 更换和账号 epoch 隔离;原有播放状态机回归继续通过。 - 根检查脚本按 `-Stage Lint`、`-Stage RootTests`、`-Stage PackageTests` 执行。格式、静态分析及打包边界通过;四个包共 632 项通过(API 456、播放器 81、弹幕 93、mux 2),10 项 mux 原生测试因未设置 `BILI_MUX_LIBRARY` 跳过,不计原生集成通过。日志为 `build/single-page-delivery-lint.log`、`build/single-page-packages.log`。 - 最终根测试 2679 项通过、8 项失败,日志 `build/single-page-delivery-root.log`;失败为同期新增的 `predictive_back_page_reuse_test.dart` 页面复用用例 1 项,以及 `app_update_test.dart` 正式版/预发布筛选用例 7 项。全量未通过,不用专项通过替代全量结论。较早运行曾遇到账号恢复/epoch 和双标签保留失败,最新相关 20 项账号回归及 1 项 Android 双标签会话回归已复测通过(`build/single-page-existing-regressions.log`、`build/single-page-dual-regression.log`)。保留同期路由、预测返回、页面预览及更新检查改动。 - 提交前按用户要求将重叠的导航与预测返回实现一并提交,最新预测返回及真实页面复用 30 项通过(`build/single-page-submit-predictive.log`)。上条全量结果保留为实现阶段的共享工作区记录;本次补充复测不宣称重新通过全量检查。 - `tool/build-download-mux.ps1 -Target android-arm64` 和 Android arm64 Profile 构建通过,日志 `build/single-page-android-mux.log`、`build/single-page-android-profile-final.log`。产物为 `build/app/outputs/flutter-apk/app-profile.apk`,交付副本保存在 `artifacts/android-single-page-20261025/app-profile.apk`;Profile 使用调试签名。 - 324 条本地文档链接及 `git diff --check` 通过。未发现连接的 Android 设备或可热重载的调试进程;Android 真实音视频、手势手感、安装升级和 macOS/Windows 原生运行未在本轮验收。本次未做性能测量。 ## 行为(历史实施记录) 设置 → 外观 → 页面导航模式仅提供“单标签页、多标签页”。Windows 和 macOS 默认多标签页,Android 默认单标签页;用户手动选择优先,保存后跨启动保留。平台决定默认模式,调整窗口宽度或横竖屏不会改变模式。两种模式共用现有页面身份、ProviderScope 与 PageStorage,切换模式或调整窗口宽度不会重新挂载搜索、首页或播放页面。 - 顶部工作区横条按平台显示:Android/iOS 不显示标题横条、标签横条或返回/首页图标,也不保留对应高度;此规则适用于单/多标签两种导航模式。Windows/macOS 保留横条,单标签页显示返回、当前标题及首页入口,多标签页显示标签栏。窗口缩放不改变此规则,移动端使用系统返回,不增加浮动导航按钮。 - 单标签页新打开的页面进入访问历史,桌面返回按钮、系统返回和既有关闭标签快捷键(默认 Ctrl+W)逐页回退;没有历史时交还系统返回处理。Ctrl+T 与 Ctrl+Tab 在单页模式中不创建或切换隐藏标签。 - 多标签页继续支持新建、选择、循环、关闭标签;新增返回按钮与系统返回按访问顺序切回先前页面,保留标签。 - 频道、设置分类、分 P、选集等带当前 tab ID 的同页更新保留页面身份,不新增返回记录;深链打开的首个内容页可返回固定首页。弹窗打开时系统返回先关闭弹窗。 - 单页出栈释放已经不在更早历史中的非首页页面,取消该页请求、订阅并清理播放 owner。首页和仍可返回的页面保留已加载内容、滚动位置、输入草稿和播放状态。普通页面遮挡的播放行为沿用既有工作区规则;关闭/出栈当前播放页停止该 owner,只有一个 native engine 和一个可见 VideoSurface。 - 缓存最多 16 个页面,返回历史最多 64 次访问。单页模式在缓存满时释放最早创建的非首页、非当前页面并删除对应历史,继续新导航;多标签继续提示手动关闭。历史和页面缓存仅在本次运行中保存。 首页顶部频道、下一级子标签、设置分类及工作区标签都使用现有 [SmoothScrollBehavior](../../lib/shared/ui/smooth_scroll_behavior.dart) 的 `horizontalMouseWheel` 选项。桌面普通纵向滚轮在横向 delta 为 0 时映射为左右滚动,横向输入、Shift 轴切换、减少动画、边界仲裁和触摸拖动沿用共享实现。内容不足一屏时不会凭空滚动;溢出时可滚到末尾并点击最后一个子标签。没有新增依赖或修改滚轮过渡算法。 ## 实现与持久化 2026-10-07 首页内容区增加触摸左右切换:向左进入顶部顺序中的下一个频道,向右返回前一个频道,覆盖推荐、热门、动态及其余首页频道,首尾不循环。后续按反馈改用 Flutter 原生 `TabBarView`:拖动时当前页和相邻页随手指一起移动,松手后按原生分页物理吸附,短滑回弹;点击频道也有 300ms 过渡,非相邻点击仅呈现原页与目标页,不依次穿过中间频道。系统减少动画时跳过点击过渡。 分页由 [HomeChannelSwipe](../../lib/features/feed/presentation/home_channel_swipe.dart) 承载触摸和手写笔输入。滑动吸附完成后才提交当前工作区 tab ID 的路由,顶部选中项同步并滚动到可见位置,不新增页面或返回历史。每个已访问频道保留真实页面、列表缓存、下一级子标签选择和滚动位置;未访问的相邻页先显示加载态,确认切换后才创建内容并读取数据。未选中页面停止自动分页、预览与焦点响应,账号清理仍沿用原有页面作用域。 2026-10-08 修复已访问频道滑入时封面先空白、吸附后才恢复的问题:共享图片组件保留非活动页面已经加载的帧,暂停图像流监听而不替换成占位;缓存开启/关闭均复用本组件已解析的流,隐藏切换不会额外下载。仍只在确认切换后激活目标页面的业务行为,未加载图片保持延迟请求。帧释放与账号隔离见 [图片缓存验证](feed-scroll-image-cache.md#首页滑动切换保留已加载封面)。 上下滚动、下拉刷新及下一级横向子标签保留 Flutter 手势竞争规则;鼠标拖动/滚轮不触发内容区分页,内层列表保留应用原有滚轮、拖动及滚动条行为。短滑回到原页,指针取消、拖动期间外部切换频道和隐藏工作区会恢复/转到路由指定页面,不能提交旧手势。应用组合根注入频道切换回调,Feature 不依赖 app 导航实现;动画帧仅由原生分页控件处理,不逐帧刷新 FeedController。 2026-10-07 顶部工具与频道顺序统一调整为:头像、搜索框、观看历史、下载、设置,然后是当前页面的频道/分类子标签。首页、搜索页与设置页共用同一布局规则:可用宽度小于 760 时工具在第一行、子标签在第二行;宽度足够时按相同顺序排成一行。搜索框占工具行剩余宽度,子标签保留横向滚动;不按操作系统分别实现布局,桌面窄窗口同样拆行。此布局规则不改变单/多标签导航模式。 2026-10-07 按后续要求,顶部横条由导航模式判断改为平台判断。Android/iOS 不创建该横条,移除前一次添加的工具区/浮动返回和首页入口;Windows/macOS 恢复原有 42px 横条。Windows 的自定义窗口按钮和拖动区域仍在横条内,工具区恢复头像、搜索、历史、下载、设置的顺序。平台显示策略集中在 `workspaceHeaderVisibleForPlatform`,不改变已保存的导航模式、页面缓存与访问历史,也不新增 iOS 工程或宣称 iOS 平台已验收。 [WorkspaceTabs](../../lib/app/workspace_tabs.dart) 持有有界的页面访问 ID 栈;路由提交和回退不会重复添加访问。关闭/淘汰清除旧 ID,固定首页始终保留。[BiliAppShell](../../lib/app/shell.dart) 负责模式布局、PopScope、搜索草稿和页面生命周期。[路由组合根](../../lib/app/router.dart) 注入设置;其 feature 路由仅渲染空占位,工作区将 ShellRoute 内部 Navigator 以 Offstage 挂载,供 go_router 分发系统返回与弹窗关闭,不挂第二份内容页面或播放器。 平台默认值集中在 [app 适配函数](../../lib/app/platform_defaults.dart),通过组合根注入设置 Repository。设置加载期间的路由外壳及无显式参数的外壳也使用同一规则,避免 Android 首次显示多标签页。领域模型和 Repository 不直接读取 Flutter 或平台 API。 设置沿用 SQLite `preferences.v1` 快照,初次添加 `navigationMode` 时 JSON schemaVersion 从 10 升为 11;移除自动选项后升为 12。缺失、旧版 `automatic` 或非法值按当前平台默认值补缺,已有 `singlePage`/`multipleTabs` 保留,其他设置保留。SQLite 数据库 schemaVersion 仍为 2,不修改表结构、不清理用户数据。 ## 验证 - 2026-10-07 首页分页动画:52 项定向回归通过,日志 `build/home-channel-animation-targeted.log`。新增拖动中两页的实际位置、松手吸附/短滑回弹的中间帧、非相邻点击仅显示原页和目标页、连续点击与减少动画、内层桌面滚动条/鼠标拖动保留,以及取消预览不读取相邻频道;原有路由、频道与下一级子标签状态、滚动位置、隐藏/取消和分页隔离回归继续通过。`tool/check.ps1 -SkipPub` 全部通过:根应用 1299、API 319、播放器 32、弹幕 52 项,共 1702 项;格式与静态分析通过,日志 `build/home-channel-animation-check.log`。本轮按用户要求未构建,移动设备实机体验由用户后续验证。 - 2026-10-07 首页触摸切换:47 项定向回归通过,日志 `build/home-channel-swipe-targeted.log`。覆盖按顺序切换及首尾边界、短拖动/快速滑动/指针取消、鼠标输入隔离、隐藏工作区/外部频道更新、内层横向滚动、竖向滚动/下拉刷新、频道缓存/滚动位置恢复,以及 Android 单/多标签模式的路由、顶部选中项可见性与页面作用域保留。`tool/check.ps1 -SkipPub` 全部通过:根应用 1293、API 319、播放器 32、弹幕 52 项,共 1696 项;四处格式和静态分析通过,日志 `build/home-channel-swipe-check.log`。本次文档本地链接与 `git diff --check` 通过;未做移动设备实际触摸验收。 - 单/多标签初次接入的 77 项定向测试通过,日志 `artifacts/single-page-targeted.log`。覆盖回退顺序、重复访问、关闭后清除旧历史、缓存与历史上限、单页深链、系统返回/弹窗优先、页面状态/搜索请求保留、出栈取消、模式即时保存/切换、窗口尺寸切换和设置快照兼容;平台默认修正的验证见下文。 - 窄屏 420px 和宽屏 1000px 的首页频道滚轮测试验证到达末尾、点击“我的收藏”和反向滚动。400px 的收藏子标签测试验证普通滚轮到达末尾并点击“我的追剧”,加载对应内容,再以原生横向输入返回开头。 - `tool/check.ps1 -SkipPub` 通过:根应用 684、bili_api 225、bili_player 16、bili_danmaku 21,共 946 项测试;四处格式和静态分析均通过,日志 `artifacts/single-page-check.log`。变更文档的 115 条本地链接检查通过,`git diff --check` 通过。 - `tool/test-windows-media.ps1` 通过,日志 `artifacts/single-page-windows-media.log`。主播放测试显示 6 项通过,其中游客公网分支未开启;实际执行 5 项本地验证,另一个独立进程执行 1 项原生错误诊断。工作区新增单页原生断言:A 在 1700ms 暂停并设为 1.5x,B 播放并 seek 到 4000ms,顶部返回后 A 恢复约 1700ms、暂停和 1.5x;B 页面已释放,全程只有一个 VideoSurface;系统返回首页后没有 PlaybackPanel,播放器 idle。保留原有多标签播放/关闭、DASH 两轨、全屏、安全存储、云端 fake 进度和脱敏诊断验证。 - `flutter build windows --release --no-pub` 成功,输出 `build/windows/x64/runner/Release/bilisail.exe`,日志 `artifacts/single-page-windows-build.log`;`flutter build apk --debug --target-platform android-arm64 --no-pub` 成功,输出 `build/app/outputs/flutter-apk/app-debug.apk`,日志 `artifacts/single-page-android-build.log`。 - Windows 物理鼠标/触控板滚动手感、Android/macOS 实机返回手势与原生播放未在本轮验证;macOS 构建未在 Windows 主机执行。不从 Widget 测试或 APK 构建推导为三端实机验收。 ## 平台默认修正验证 - 验证 Windows/macOS 默认多标签、Android 默认单标签,窗口 420px/1280px 往返时模式和页面状态不变;设置加载期间也按平台显示,加载后遵循保存的手动选择。 - 验证新用户/旧版缺字段/automatic/未知或类型错误值使用注入默认值;两种手动模式均能重载,不被平台默认覆盖,其他偏好保留。外观页只显示两种导航模式。 - 65 项定向测试通过,日志 `artifacts/platform-navigation-targeted.log`。`tool/check.ps1 -SkipPub` 通过:根应用 693、bili_api 227、bili_player 16、bili_danmaku 21,共 957 项测试,四处格式和静态分析均通过,日志 `artifacts/platform-navigation-check.log`。 - Windows release 与 Android arm64 debug 构建通过,输出分别为 `build/windows/x64/runner/Release/bilisail.exe`、`build/app/outputs/flutter-apk/app-debug.apk`,日志 `artifacts/platform-navigation-windows-build.log`、`artifacts/platform-navigation-android-build.log`。 - 变更文档的 116 条本地链接检查通过,`git diff --check` 通过。Android/macOS 平台默认值使用测试平台覆盖验证,不代表实机验证。 ## 顶部顺序调整验证(2026-10-07) `tool/check.ps1 -SkipPub` 通过:根应用 966、bili_api 282、bili_player 22、bili_danmaku 32,共 1302 项测试;四处格式与静态分析通过。现有搜索布局测试已改为检查分类位于搜索工具下方,继续覆盖 320px 双倍字体与宽屏布局。账号测试覆盖 320–1200px 往返调整、登录/账号菜单及单/多标签模式;400px 和 1200px 的离线渲染核对了工具顺序与双行/单行布局。本文 5 条本地链接和 `git diff --check` 通过。本轮未运行平台构建或 Android/macOS 实机交互验证。 ## 单标签页横条移除验证(2026-10-07) 以下保留前一次按导航模式隐藏横条的验证记录,其布局规则已由后续平台规则替代。 - 77 项工作区/路由/布局/账号定向测试通过,日志 `artifacts/single-page-header-targeted.log`。覆盖单页无标题横条、多页标签栏保留、返回与系统返回、模式切换、页面状态保留、320px 双倍字体,以及 420px/1280px 首页、搜索、设置、历史、视频与用户页的窗口按钮位置和拖动事件。窄历史页的“页面导航”菜单可返回首页。 - `tool/check.ps1 -SkipPub` 通过:根应用 1158、bili_api 307、bili_player 22、bili_danmaku 52,共 1539 项测试;四处格式与静态分析通过,日志 `artifacts/single-page-header-check.log`。最终浮动按钮位置调整后重新运行上述 77 项定向测试通过。 - 400px/1200px 的离线 Widget 渲染确认单页从现有工具区开始、多页保留 42px 工作区横条,单页没有遗留空白高度。渲染使用空内容区,不代表真实页面数据或设备验收。README、架构决策与本文共 88 条本地链接、`git diff --check` 通过。 - 本轮未运行平台构建、Windows 原生窗口操作或 Android/macOS 实机交互;原生播放集成测试仅同步横条显隐断言,未执行。 ## 按平台显示横条验证(2026-10-07) - 87 项工作区/路由/布局/账号/平台定向测试通过,日志 `artifacts/platform-workspace-header-targeted.log`。Android/iOS 与 Windows/macOS 分别覆盖单/多标签两种模式、420px/1280px 调整、首页/搜索/设置/历史/视频/用户页;移动端无横条、返回或首页图标,桌面保留对应横条。系统返回仍能从用户页回到视频页,导航状态和保存的模式继续保留。 - 52 项播放面板测试及 4 项平台离线渲染通过,日志 `artifacts/platform-workspace-header-playback-render.log`。检查可见标签栏的桌面快捷键测试明确使用 Windows;渲染使用模拟视频内容区,移动端不增加覆盖按钮或占位,桌面单页保留 42px 标题栏,不代表原生视频或设备验收。 - `tool/check.ps1 -SkipPub` 通过:根应用 1167、bili_api 307、bili_player 22、bili_danmaku 52,共 1548 项测试;四处格式与静态分析通过,日志 `artifacts/platform-workspace-header-check.log`。README、架构决策与本文共 88 条本地链接、`git diff --check` 通过。 - 本轮未运行平台构建、Windows 原生窗口操作或 Android/iOS/macOS 实机交互。iOS 仅通过测试平台覆盖验证显示规则,未新增 iOS 工程或进行原生验收。 ## 子标签栏连续过渡(2026-10-09) 首页频道、用户主页与设置分类共用 `PagingTabStrip`:以分页的实际动画进度连续移动同一条下划线,并插值文字/图标颜色,短滑、回弹、非相邻点击和快速改选均沿用同一进度。修复原先仅在已选中值变化时突然交换下划线的视觉跳变;首页原有的选中标签瞬间居中也改为只在标签被遮住时平滑露出。标签栏保持挂载,按实际文字宽度和字体缩放计算位置,支持 RTL 与系统减少动画设置。 `RetainedTabView` 将进度发布到展示层的 `TabPagingProgress`,逐帧只更新标签栏,不更新应用 Provider 或路由。首页/设置由工作区持有独立进度并在关闭标签时释放,用户主页持有自己的进度。数据选择仍在触摸分页落定后提交;隐藏页面、取消手势、账号重置和外部选择保留原有代次保护。用户资料与按钮仍在分页之外,标签栏的横向露出只改变自身位置,不把已滚走的资料区重新拉回视口。 新增 16 项回归包含绘制像素逐帧扫描(短滑/回弹时指示线持续存在并移动、LTR/RTL、两种下划线宽度、非相邻及快速点击、减少动画)、窄屏放大字号的平滑露出、首页和用户主页在路由/数据选择前的颜色过渡、资料区纵向位置,以及设置页分页/状态保留与路由联动。封面在缓存开启/关闭时不闪空的回归继续通过。 将提交基线 `c59b198` 与本次改动通过临时 Git index 导出到 `build/tab-strip-staged/`,排除其他任务进行中的修改;用户主页文件仅导出本次进度接入,没有包含另一项动态列表改动。`tool/check.ps1 -SkipPub` 完整通过:根应用 1447、API 336、播放器 32、弹幕 65,共 1880 项测试,四处格式与静态分析均通过;日志为 `build/tab-strip-staged-check-cached.log`。首次检查已安装锁定依赖;SQLite 下载中断后复用本机同版本缓存,SHA-256 与依赖包登记值一致,未修改依赖来源。滑动与绘制专项共 30 项回归通过,另在完整检查中验证真实工作区/设置路由;15 条本地文档链接与提交差异空白检查通过。 本轮只运行自动测试与分析,不构建应用安装包,不执行真实账号操作;按用户安排由用户后续构建并进行实机交互验收。 ## 溢出子标签栏跟随分页(2026-10-09) 首页频道、用户主页与设置分类的共享 `PagingTabStrip` 修复了连续翻页时新标签贴在可见区域边缘的问题。标签总宽度超出自身横向视口时,横条使用分页的同一动画进度,在相邻标签的居中位置之间连续插值;滑动、吸附、短滑回弹、取消及点击改选均跟随该进度,首尾按实际滚动范围限制位置。窗口尺寸和字号变化后重新计算位置。整个标签栏能够完整显示时不滚动,标签位置保持不变,只有选中颜色与下划线过渡。 此行为替代上节“只在被遮住时平滑露出”的策略。横条直接使用已有分页动画,不额外启动滞后于手指的滚动动画;只操作自己的横向 `ScrollPosition`,保留用户主页外层纵向位置。标签栏本身仍可独立拖动,业务选择、请求与路由仍只在原有选择时机更新。 新增 12 项共享组件回归,覆盖双向逐帧居中、LTR/RTL、两种下划线、连续翻页与首尾、短滑/取消、独立拖动、减少动画、未连接分页进度时的点击改选、窗口变宽,以及完整可见时的位置稳定。共享组件及首页、用户主页、设置页和封面保留定向回归共 53 项通过,日志 `build/tab-strip-follow-targeted.log`。 `tool/check.ps1 -SkipPub` 全量通过:根应用 1486、API 336、播放器 32、弹幕 65、封装包 2,共 1921 项自动测试通过;根应用与四个包的格式、静态分析通过。封装包另有 7 项需要原生库的测试按现有配置跳过,本次未改动原生媒体。日志为 `build/tab-strip-follow-check.log`,本文本地链接与提交差异空白检查通过。提交仅包含共享标签栏、对应回归及本文,排除并行播放器任务的修改。 本轮按用户要求不构建应用,真实设备交互留待用户后续手动构建验收。 ## 子标签分页提速(2026-10-09) 首页频道、用户主页和设置分类统一使用 [TabPagingMotion](../../lib/shared/ui/tab_paging_motion.dart)。点击切换与标签栏独立改选的动画从 300ms 缩短到 200ms;松手吸附和短滑回弹采用同一 200ms 感知时长、零振荡的分页弹簧。弹簧的实际落定时间仍取决于拖动距离、释放速度和像素容差。手指拖动继续直接带动页面,顶部下划线、颜色及溢出横条始终跟随页面的实际进度。 新增 10 项行为回归,以实际页面偏移和指示线绘制像素检查速度及同步:点击过渡在 200ms 后的下一帧完成,未连接分页的独立标签栏在 200ms 完成;375 逻辑像素宽、1/3 倍像素密度、LTR/RTL 的翻页和短滑回弹在松手后 320ms 内落定,逐帧验证下划线与颜色同步。共享组件 29 项检查通过;原有首页、用户主页、设置分类、工作区与缓存开关下的封面保留回归继续通过。定向日志为 `build/tab-paging-speed-targeted.log` 和 `build/tab-paging-speed-shared.log`。 `tool/check.ps1 -EnforceLockfile` 全量通过:根应用 1514、API 336、播放器 32、弹幕 65、封装包 2,共 1949 项自动测试;根应用与四个包的格式、静态分析通过,五份锁文件未变。封装包另有 7 项需要原生库的测试按现有配置跳过。日志为 `build/tab-paging-speed-check.log`;本文 8 条本地链接与差异空白检查通过。 版本构建号递增为 `0.5.1+6`,用于本次远端 Release 构建。自动测试不替代 Android/macOS 实机手势验收;本轮不修改原生播放实现。 ## 子标签连续滑动(2026-10-09) 首页频道、用户主页和设置分类共用的 `RetainedTabView` 修复了吸附动画未结束时再次滑动会提前切换数据/路由、干扰后续拖动的问题。Flutter 在新指针按住未完成的吸附动画时也会发出 `ScrollEndNotification`;组件现在同时检查实际分页位置,只在到达页面边界后提交选择。下一次拖动使尚未执行的旧选择回调失效,页面从当前偏移继续跟随手指,无需等待上一段动画结束。 新增 9 项回归覆盖同向继续翻页、反向滑回、按住后松开/取消、新拖动取代排队的旧选择、LTR/RTL 指示线和颜色同步,以及用户主页只加载最终列表、设置分类只提交最终选择。已访问页、列表滚动位置、封面保留和业务活动状态继续沿用现有组件;拖动期间不逐帧更新数据或路由。本轮按用户要求不构建,Android/macOS/Windows 实机手势体验由用户后续验收。 `tool/check.ps1 -SkipPub` 全量通过:根应用 1523、API 336、播放器 32、弹幕 65、封装包 2,共 1958 项自动测试;根应用与四个包的格式、静态分析通过,锁文件未变。封装包另有 7 项需要原生库的测试按现有配置跳过。日志为 `build/continuous-tab-swipe-check.log`;本文 8 条本地链接及差异空白检查通过。