Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 48 additions & 12 deletions specs/components/027-Input-Slider/acceptance.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,59 @@
# Slider 验证范围与结论

## 本次范围
## 已提交生产候选与环境

2026-10-20 原记录整理;未重跑组件、Golden、设备或远端CI。以下结论仅限原候选与范围。
以下历史候选与 Golden 收敛记录不自动覆盖本次兼容修复;当前候选结果见文末。

## 已有验证结论
已提交生产候选为 `a65182d898f534e5181841c17e1298962336fc30`;其修复基于 PR #1212 原 head `f2472da21bfa6f9cc3044594b1e9daa93a797f61` 上的端点、交互和约束修复。2026-10-27 完成的本地验收绑定源码、测试、资源清单指纹 `fa8eac29a79fd5521d5eb2d394e36c0edd13372bf0edef6161f06557f28961ee`;完整清单、环境和命令见 [本地验证记录](./evidence/local-validation-20261027.json)。

| 原记录范围 | 原文可追溯标识与环境 | 有界结论 |
| --- | --- | --- |
| 既有记录 | `d2ff7a0aa5317c0f5412848610f2a1ae05b6dfa7`、`fe14543572bc7233226b2f08db6fc1424cd81ed2`;Flutter 3.32.0 | 组件与布局:有明确通过记录(限原范围);Demo 与消费:有明确通过记录(限原范围);静态检查:有明确通过记录(限原范围);Golden:有明确通过记录(限原范围);设备:仅按下文的实际操作与未覆盖范围解释 |
Flutter 3.32.0 使用 Linux x86_64,3.47.8 使用 macOS arm64;自动 Golden 仅在前者执行。Specs 编辑不改变该组件清单指纹,也不刷新此前测试结果。

## 功能与接口

- 两版各 86 个组件、17 个 Demo、179 个工具测试通过;组件和 Example 的 `flutter analyze --fatal-infos` 均零诊断。Slider 生产源码覆盖率均为 675/692(97.54%)。
- 回归覆盖正常尺寸、0/100 端点、连续/离散、单/双游标、非零取值范围、禁用、RTL、主题厚度、非法主题、固有尺寸、持续拖动、拖动中缩放、零尺寸生命周期及父级滚动。包含 1920 组长度/厚度/间距/横轴约束组合和 32 组持续缩放配置。
- 原候选的间距限制与格式化输入已被本轮兼容修复替换;当前候选的验证结果另行记录,不沿用上述候选的通过结论。
- 构造参数、默认值、字段、方法签名、枚举、typedef 和包导出与原 PR、上述 develop 参考均保持一致;内部几何库未导出,没有新增公开 API 或 SDK 版本分支。57 份生成 API 文档、370 个示例片段及片段静态分析通过。

## 视觉与对齐

- 小程序对齐参考为 `Tencent/tdesign-miniprogram@a2aeed69163b6da423c99b66ff780c10043a4553`,在微信开发者工具 WebView 实测。普通 thumb 中心位于可见端点;胶囊沿行程两端各留 3px,默认横截面两侧各留 2px;垂直示例可见长度为 200px,数值和刻度复用同一行程。
- 默认主题真实操作覆盖 15 个可交互示例,单游标到 0/100、双游标到 0..100,并保存明暗运行截图。实际 thumb 主体最小控件边界余量为 0.5px;垂直数值和刻度两端相对实际绘制中心误差为 0px。阴影、按压光晕不作为 thumb 主体边界。
- 与 develop `ca555ca40a8a317bb0e3eb521a844d54b4832eee` 在同 Linux、Flutter、依赖锁和字体环境对照。垂直可见长度 168→200px、胶囊端点及刻度位置属于本次有意修复;不以与 develop 像素完全相同判定无回归。
- Linux 34 个 Demo Golden 和 1 个组件 Golden 使用默认精确比较器通过,没有放宽容差。端点和几何修复阶段有意更新基线;最终恢复 8px 行为后未更新基线,四张默认水平/垂直 0/100 明暗完整页相对已确认样式均为 0 像素变化。
- 基线位于 [Demo Golden](../../../tdesign-component/example/test/slider/goldens) 和 [组件 Golden](../../../tdesign-component/test/components/slider/goldens),由现有集中式视觉入口登记执行;不重复提交本地拼图、actual/diff 或运行日志。

## 取舍与验证边界

各标识可能对应不同阶段,不能合成一次完整验证;候选或日志缺失时仍需复核。
曾考虑全局取消连续双游标最小像素间距;因会扩大连续回调的输出范围、影响依赖正跨度的业务,最终撤回。早期 2px 行程留白、普通离散内缩和 168px 垂直长度也不再作为当前契约;最终设计以 [spec.md](./spec.md) 为准。

上述结论为本地验收,不代表远端 CI 或设备验证。Skyline、微信真机及平台构建未执行;长 formatter 文本的全局展示策略不属于本次扩展范围。最终推送 SHA 的远端检查独立确认,待办见 [tasks.md](./tasks.md)。早于本次指纹的历史候选不作为当前通过证明。

## 按独立缺陷收敛Golden(当前本地结论)

本轮基于已提交生产候选,仅调整测试组织和Spec。生产组件、公开Demo、生成产物、字体和组件测试均未改。前一轮本地候选把Demo基线32→16张,本轮进一步按独立可见风险收敛为6张,组件Golden仍为1张;新的指纹、覆盖对应关系及执行结果见 [独立缺陷验证记录](./evidence/golden-defects-20261027.json)。此前34次及16次比较保留各自验收身份,不作为当前6次比较的证明。

| 职责 | 当前基线 | 保护的风险 |
| --- | --- | --- |
| 默认完整页 | page_light/dark | 分组、顺序、默认中间值、禁用状态、明暗配色 |
| 端点矩阵 | endpoints_light/dark | 普通/胶囊、水平/垂直、连续/离散的0/100与完整范围;thumb、数值、刻度及分段对齐 |
| 视觉边界矩阵 | boundaries_light/dark | 粗轨道近端点、RTL、窄尺寸、横轴缩小及大厚度约束 |
| 功能回归 | 不另建Golden | 回调、8px规则、持续拖动/缩放、零尺寸、滚动、键盘、吸附及广泛参数组合 |

## 验证范围与未覆盖项
- Demo基线与比较次数均16→6;含组件总基线17→7。两张默认页逐字节不变,四张新矩阵原尺寸内容与此前对应区域独立对照,52个代表区域像素变化均为0。
- 两版各17个Demo和179个工具测试通过,组件与Example严格分析零诊断;86个组件回归用例及其生产代码保持原样,复用已提交生产候选的有界结果,未在本轮重复执行覆盖率门禁。
- Linux四张新矩阵先检查实际图和旧区域,再建立一次基线;随后同命令不带更新参数复验,6个Demo和1个组件Golden精确通过,未放宽容差。
- 在隔离临时副本故意重现端点内距偏差1px、取消厚度上限,端点矩阵与边界矩阵分别出现预期像素失败。正常交付源码和公开Demo未因此修改,反例结果独立于正常通过记录。
- 参数笛卡尔积的额外图片、重复中间拖动图和吸附/最小厚度等等效视觉状态已移除;对应计算和交互仍由现有功能回归覆盖。本轮未提交、未推送,远端CI和设备不属于当前结论。

原验收未进一步列出未覆盖项;本次未补做新候选验证,不能从历史通过记录外推全部状态、平台或设备。
## 回调和正常尺寸兼容修复(当前候选)

## 必要证据与追溯
- 单值与双值非刻度输入保留原始受控值用于自定义 formatter 和默认数值标签;控件位置仍吸附刻度。正常尺寸的连续双游标,即使受控区间窄于8px,只要两端有足够空间仍采用8px;不足时由同一几何模型限制,防止产生越界值。
- Flutter 3.32.0 Linux 与 3.47.8 macOS 分别执行88项 Slider 组件功能回归、17项 Demo 功能回归及组件严格静态分析,均通过。真实拖动覆盖普通和胶囊窄区间,验证间距及回调取值;既有用例覆盖约束、缩放、两端、RTL 与生命周期。
- Linux Flutter 3.32.0 按 `TDESIGN_DEMO_TEST_MODULES=false` 执行6项 Demo Golden 和1项组件 Golden,使用默认精确比较器,均通过;本轮没有更新基线。未针对当前候选重跑全项目工具测试、覆盖率及生成产物检查,历史结果不作为当前候选通过证明。
- 本轮 Slider 构造参数、字段、方法、枚举、formatter typedef 与包导出经 AST 对照 develop 均未变化;仅恢复 formatter 输入和可容纳情况下原有最小间距。靠近取值边界时的间距约束是为避免非法回调而保留的修复,不能宣称所有边界行为与旧版逐项相同。相关本地测试和文件哈希见 [本轮验证记录](./evidence/compatibility-20261027.json)。

未绑定唯一候选的结果不作为当前通过证明;旧命令与流水由Git历史追溯。
## 跨组件 Golden 同步

当前待办见 [tasks.md](./tasks.md);实际执行入口见[贡献规范](../../../CONTRIBUTING.md#组件测试与-ci-回归门禁)。清理不关闭未完成项。
- PR head `804fac7da54be20e7d1a921d8606c408e643bfdf` 的 CI 暴露出 Swiper、Loading 示例和 Theme 组合场景中引用的 Slider 仍使用旧基线。与 develop 隔离复现并只替换 Slider 源码的对照确认差异由 Slider 修复引起;共享字体保持 PR 版本时换回旧 Slider 即通过。
- 逐张检查并更新 Swiper 6 张、Loading 4 张及 Theme 1 张基线。图片尺寸不变,像素差异均在 Slider 区域;新图与该 CI 的实际渲染逐像素一致。Linux Flutter 3.32.0 使用默认精确比较器复验,不放宽容差;最终远端 CI 仍需按推送后的 head 单独核对。
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"base_commit": "a65182d898f534e5181841c17e1298962336fc30",
"scope": "local working tree, no push",
"files_sha256": {
"tdesign-component/lib/src/components/slider/t_slider.dart": "adade463d81164d81850f9b93ec008ba8dc5a88b4a571fa8e68e38547ec3f3e2",
"tdesign-component/lib/src/components/slider/t_slider_geometry.dart": "ebecf3084920b97d89853752a38ec873dccba2ea457a66f3c4a65429a5e73676",
"tdesign-component/test/components/slider/t_slider_geometry_test.dart": "e60f9ec187404a93d014345cd469089328039187c53b9a37de064dd96c032f6e",
"tdesign-component/test/components/slider/t_slider_constraints_test.dart": "e520c23f13a446f51416e9eeec19f79133178730cd39ac269085621b10fd09a7",
"tdesign-component/test/components/slider/t_slider_test.dart": "0cd2168d6470b8c752e57ae45af8265255a6773721aa6e94aa993d2a10191953",
"tdesign-component/test/components/slider/t_slider_golden_test.dart": "0d3cd81e28110aa477fe0aaaa0ab7b37887acc3d30ba6dd4c9d92c0fb9a21347",
"tdesign-component/example/test/slider/slider_demo_test.dart": "267851f8048e872b77db5afdec3b6a3580d6309bbda167debfc1f4d6717842d0",
"tdesign-component/example/test/slider/slider_demo_golden_test.dart": "c08a002c6dd90854906adde41e754565b5727ead976e968fd36cd7d057bb47ff",
"tdesign-component/example/test/slider/slider_endpoint_golden_test.dart": "04c1ba6b5e826e96748b29be52785b15b16206a379f7a480233406d8509e1ee3",
"tdesign-component/example/test/slider/slider_boundary_golden_test.dart": "c83d6a0d1e6450185ebaf9ec15261f8a38771675a31e61ecf98561f19a2ab933",
"tdesign-component/example/test/slider/slider_boundary_sources.dart": "aaf37eae9ba4e5c55d2b7e321ea37388c45235545215c102e9218f63c9e6729d",
"tdesign-component/example/test/slider/slider_golden_matrix.dart": "64740f4b129fa918b9117d40439390572c5a367267e8d6a1d364034f58434dab",
"tdesign-component/example/test/slider/goldens/slider_boundaries_dark.png": "7f7f7bd4d3f7fa0052e47d8dd304ff1192a28387bbcb01bd71407db1ba6bfe1f",
"tdesign-component/example/test/slider/goldens/slider_boundaries_light.png": "69b047a4948f404d1f7dd50ae9ea759ad5ffbe53c42486519dfaa67c50c0d7a2",
"tdesign-component/example/test/slider/goldens/slider_endpoints_dark.png": "b63bbc3bc397fbe0dc2ea7f19094b54be2a4e6f48754170e6639f01fe9115d8c",
"tdesign-component/example/test/slider/goldens/slider_endpoints_light.png": "453fd9cc6b27abba00401be05b191f3b210eb1c269010aef8b84c8b83b744405",
"tdesign-component/example/test/slider/goldens/slider_page_dark.png": "c8b9b468af693072e65424f88fb904a55148e4aa52d893020ce2a26534433b73",
"tdesign-component/example/test/slider/goldens/slider_page_light.png": "0c0dc340aa5c695469154679202084bff29d8576ccb4baac15024de1e0a8d133",
"tdesign-component/test/components/slider/goldens/t_slider_material.png": "95c967976172cf8872f34aa623837c5161e244b65e460ab0bddc77b9bf215729"
},
"validation": {
"flutter_3.32.0_linux": {
"component_tests": 88,
"demo_tests": 17,
"component_analysis": "pass",
"demo_golden": 6,
"component_golden": 1
},
"flutter_3.47.8_macos": {
"component_tests": 88,
"demo_tests": 17,
"component_analysis": "pass"
},
"golden_comparator": "exact, no updates",
"public_api": "compared selected Slider declarations and barrel to origin/develop; unchanged"
},
"limits": [
"whole-project tooling, coverage and generated outputs not repeated for this candidate",
"remote CI and devices not validated"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
{
"base_commit": "a65182d898f534e5181841c17e1298962336fc30",
"local_only": true,
"candidate_fingerprint": "ed217c6ace1c1de01600a6b54c7268fd50e9eea92eb24fe301afa692e70e8a3f",
"candidate_files": {
"tdesign-component/example/test/slider/slider_demo_golden_test.dart": "c08a002c6dd90854906adde41e754565b5727ead976e968fd36cd7d057bb47ff",
"tdesign-component/example/test/slider/slider_endpoint_golden_test.dart": "04c1ba6b5e826e96748b29be52785b15b16206a379f7a480233406d8509e1ee3",
"tdesign-component/example/test/slider/slider_boundary_golden_test.dart": "c83d6a0d1e6450185ebaf9ec15261f8a38771675a31e61ecf98561f19a2ab933",
"tdesign-component/example/test/slider/slider_boundary_sources.dart": "aaf37eae9ba4e5c55d2b7e321ea37388c45235545215c102e9218f63c9e6729d",
"tdesign-component/example/test/slider/slider_golden_matrix.dart": "64740f4b129fa918b9117d40439390572c5a367267e8d6a1d364034f58434dab",
"tdesign-component/tool/component_test_manifest.dart": "840a0ff4be23c76b95bdb3578f120d6243a7327ac2d8b3b4a32dc626c745e643",
"tdesign-component/example/test/slider/goldens/slider_boundaries_dark.png": "7f7f7bd4d3f7fa0052e47d8dd304ff1192a28387bbcb01bd71407db1ba6bfe1f",
"tdesign-component/example/test/slider/goldens/slider_boundaries_light.png": "69b047a4948f404d1f7dd50ae9ea759ad5ffbe53c42486519dfaa67c50c0d7a2",
"tdesign-component/example/test/slider/goldens/slider_endpoints_dark.png": "b63bbc3bc397fbe0dc2ea7f19094b54be2a4e6f48754170e6639f01fe9115d8c",
"tdesign-component/example/test/slider/goldens/slider_endpoints_light.png": "453fd9cc6b27abba00401be05b191f3b210eb1c269010aef8b84c8b83b744405",
"tdesign-component/example/test/slider/goldens/slider_page_dark.png": "c8b9b468af693072e65424f88fb904a55148e4aa52d893020ce2a26534433b73",
"tdesign-component/example/test/slider/goldens/slider_page_light.png": "0c0dc340aa5c695469154679202084bff29d8576ccb4baac15024de1e0a8d133"
},
"unchanged_scopes": [
"tdesign-component/lib",
"tdesign-component/example/lib",
"tdesign-component/example/assets",
"tdesign-component/test/components",
"tdesign-component/example/test/fonts"
],
"before": {
"demo_images": 16,
"demo_comparisons": 16,
"component_images": 1,
"component_comparisons": 1,
"demo_png_bytes": 1934223
},
"after": {
"demo_images": 6,
"demo_comparisons": 6,
"component_images": 1,
"component_comparisons": 1,
"demo_png_bytes": 501110
},
"coverage_roles": [
{
"role": "default page",
"baselines": [
"slider_page_light.png",
"slider_page_dark.png"
],
"risk": "public grouping, initial values, colors, typography and disabled styles",
"cases": "18 public instances including 3 disabled controls",
"support": "slider_demo_test.dart: scenario order and parameters"
},
{
"role": "endpoints",
"baselines": [
"slider_endpoints_light.png",
"slider_endpoints_dark.png"
],
"risk": "thumb/value/tick endpoint clipping, capsule inset and discrete gap alignment",
"cases": "18 regions per theme: ordinary/capsule, horizontal/vertical, single0/100 and full ranges, continuous/discrete",
"support": "slider_demo_test.dart endpoint alignment; component endpoint pixel and nonzero-range drag tests"
},
{
"role": "visual boundaries",
"baselines": [
"slider_boundaries_light.png",
"slider_boundaries_dark.png"
],
"risk": "thick track near end, RTL, narrow discrete rendering, longitudinal/cross-axis thumb scaling, large thickness constraints",
"cases": "8 regions per theme",
"support": "component geometry/constraints suites and Demo constraint fixture"
},
{
"role": "functional-only boundaries",
"baselines": [],
"risk": "callback values/lifecycle, 8px range rule, sustained resize, zero size, parent scroll, keyboard, off-grid snapping, capsule minimum thickness, broad parameter combinations",
"cases": "existing86 component and17Demo tests retained without editing",
"support": "t_slider_constraints_test.dart, t_slider_geometry_test.dart, t_slider_test.dart, slider_demo_test.dart"
}
],
"boundary_scene_ids": [
"near-edge",
"narrow-discrete",
"rtl-scale",
"rtl-capsule-scale",
"narrow-continuous",
"thin-cross-axis",
"large-normal",
"large-capsule"
],
"selection_policy": "one visible failure mode per representative; broad combinations remain functional tests instead of complete visual products",
"visual_validation": {
"renderer": "Linux Flutter3.32.0",
"demo": 6,
"component": 1,
"updates": 1,
"new_baselines": 4,
"unchanged_default_baselines": 2,
"comparator": "default exact, tolerance unchanged",
"retained_regions_compared_to_prior_images": 52,
"changed_content_pixels": 0,
"matrix_render_scale": 1
},
"functional_validation": {
"each_sdk": [
"3.32.0 Linux x86_64",
"3.47.8 macOS arm64"
],
"demo_each": 17,
"tooling_each": 179,
"strict_analysis": "component and example: zero diagnostics"
},
"component_regression": "86 test cases, coverage97.54% and production code unchanged from accepted base; not rerun this test-only batch",
"defect_reintroduction_checks": [
{
"mutation": "endpoint-inset",
"expected_failure": true,
"test": "slider endpoints matrix light",
"changed_pixels": 8584,
"diff_percent": 0.65,
"scope": "isolated temporary copy; delivery source unchanged"
},
{
"mutation": "cross-overflow",
"expected_failure": true,
"test": "slider boundaries matrix light",
"changed_pixels": 9234,
"diff_percent": 1.67,
"scope": "isolated temporary copy; delivery source unchanged"
}
],
"committed": false,
"pushed": false,
"unverified": [
"remote CI for local delta",
"physical device",
"Skyline",
"platform builds"
]
}
Loading
Loading