Repository navigation
v8.0.0
v8.0.0(2026-10-12 · 正式版)
主题:下载 / DNS 治本 · 设置页重做 · 悬浮元素让路 · 动画泄漏治理与分级预加载。
修复 · Fixed
下载
- 分片不可用时回退单连接:并发 > 1 且文件 ≤ 1 MiB(分片数不足)时,引擎抛
DownloadUnsupported,调用方此前把它当普通失败 → 所有小文件"下载失败"。
现按契约回退到单连接(同一 taskId,页面无感);服务端忽略 Range 返回 200 时同样回退。 - 分片响应校验
Content-Range:此前只验 206。CDN / 中间设备回错位区间时每片长度
各自正确,却能拼出"长度正确的坏文件"。现逐片比对区间。 - 分片成品读不回来:分片路径从不
enqueue,而后端的completedSize/fileSha256/
deleteFile全靠库任务表解析文件 → 恒为null→ 有摘要的 Release 资产被判"校验不匹配",
且"删坏文件"是空操作(好文件留在磁盘,重试只重复失败)。现后端方法接受显式path。 - 暂停 / 重试后进度未归零:进度条先显示上一轮的假进度;重试后还会挂着上次的失败原因。
- dispose 后异步回调仍改状态:通知收敛到
_safeNotify(),dispose先立标志再取消令牌。
DNS
- 「DoH 优先」开关此前是死代码:
preferDoh只出现在toString/ 摘要里,没有任何解析
路径读它;DoH 整条链从未被实例化 → 无论怎么设都走明文 UDP 53(正是被污染的那条)。
现按「合法 https 端点 + 有 HTTP 能力」真正选择解析器,并保留「同一家 DoH 失败 → 明文」回退。 - 换 DNS 服务商后缓存不作废:旧答案最长 5 分钟仍被返回。现真实变更时清缓存并留痕。
- 非法 DNS 地址(空串 / 带协议前缀 / 带端口 / 非 IP)此前原样交给 socket 层抛
ArgumentError,被归类成"网络失败"。现在入口规格化并给出明确原因。 - AAAA 记录未补零(
abc≠0abc,拼出的不是那个地址);缓存淘汰语义与注释相反
(注释说"淘汰最接近过期者",代码淘汰最早插入者 → 把最耐用的先丢)。均已对齐。 - 自检看不出"已回退系统解析":现留痕
via/fallback,摘要写明。
设置
kOgLSettingsRowPadding声明类型写成EdgeInsets却赋值EdgeInsetsDirectional
—— 两者是兄弟(都 extendsEdgeInsetsGeometry),9 条编译错误、整包构建失败。
已修正类型。
动画
OgLReveal整个类没有dispose():入场错峰用Future.delayed(不可取消),闭包一直
捕获this(State + 整棵 Element 子树)。档位 3 时单项最长挂 576ms,而它大量出现在列表项
构建器里 → 快速滚动 / 翻页时同屏可积压成百上千个"已卸载但被闭包拖着"的 State。
现改为可取消的Timer+dispose,_start幂等。- 每个路由每帧泄漏 2 个
CurvedAnimation:buildTransitions会被每帧调用,里面
new的CurvedAnimation从不dispose,而它构造时会给 AnimationController 注册
statusListener、只有 dispose 才摘除 → 一次翻页 ≈ 18 帧 ≈ 36 个永不摘除的死监听者。
改为被动求值的CurveTween(...).animate(...)(不注册任何监听),观感零变化。 OgLMotion.pageTransitions加有界记忆化(只缓存档位 0–3,不随时间累积)。
新增 · Added
分级动画预加载
按动效档位(level 0–3)分级预加载,策略表集中在一处:
| level | 名称 | 策略 |
|---|---|---|
| 0 | 最低级 | 不预加载 |
| 1 | 第二级 | 仅预加载当前页面 |
| 2 | 倒数第二级 | 预加载最多,以全屏动画为主 |
| 3 | 最高级 | 当前层级 + 下一子层级的主要动画 |
- 有数量上限与内存额度(登记时预扣,超限直接拒收而非排队堆积)——"不要过了"
- 空闲时调度(每空闲窗口只推进 1–2 项),不与首帧争资源
- 可取消(切走 tab / 退出路由整组取消并归还额度),模块内不持有
BuildContext - 已接到 4 个页面:首页(账号头像 + 前 3 个仓库 owner 头像 + 子路由首图)、
搜索(前 2 条结果头像 + 子路由)、通知中心(级别图标字形预热)、仓库页(owner 头像 + README 头两张图)
悬浮元素滚动感知
用户要求:"下滑时靠边只露 1/4,点击弹出;往上再自动弹出来,免得滑动到页面底部挡视野;
滑动到最底部半屏时收起"。新组件 ScrollAwareAction 统一实现:
- 向下滚动 → 收边(只留约 1/4,贴屏幕边缘);点击收边态 → 立即完全展开
- 向上滚动 → 自动弹回;距底部约半屏以内 → 强制收起
- 滚动判定用累积位移 + 阈值(不是单帧 delta,避免惯性/回弹/微抖导致"抽搐")
- 收边态仍可点(命中区 ≥ 48dp),拖拽滚动不被拦截
- 覆盖 7 处:首页 FAB、仓库页 4 个标签页 FAB、发布页 2 个主操作按钮
(发布页两处按"主操作不能被藏起来"的取舍传bottomReserve: 0,只保留方向规则)
变更 · Changed
设置页重新设计
用户原话:"设置页面布局混乱,你重新设计"。新结构:
- 根级:保存失败横幅 → 账户卡 → 5 个可折叠分组(界面 / 代码与文件 / 存储与网络 /
关于与帮助 / 日志)→ 危险区 - 行型统一为 5 种:分组卡片 / 选择行 / 开关行 / 滑杆行 / 危险卡片
- 色板与分段按钮收进选择弹窗(此前平铺把一屏挤成两屏)
- 每个分组收起时显示当前值摘要(明暗 · 主题色 · 缩放 / 高亮主题 · 字号 / 解析方式 /
项目名 · 版本 / 已落盘 · N 行) - 危险项与普通项在颜色 + 间距上拉开
- 折叠状态可记忆(同会话)
- 功能一项未少:改造前 137 个 i18n 键逐项对照,仅 4 个旧分组标题被新标题取代
性能 · Performance
- 主包体积与冷启动:见「Web」小节
- 动画泄漏修复后,反复翻页不再累积死监听者与已卸载 State(这正是"切回正常频率也不恢复"的机制)
- 预加载按档位分级,低档位不增加任何开销
说明 · Notes
- CI 与开发环境:本机无 Flutter SDK,验证以「真 Flutter 源码静态分析 + 解析级校验 +
仓库自带四道门禁(i18n / 分层 / 动效分级 / 性能反模式)」为主;lib/surface中依赖第三方
插件的少数文件(编辑器 / 通知 / 桌面窗口)仍需在真 SDK 上跑一次flutter analyze。 - 悬空 i18n 键:设置页重做后有 9 个旧键(
densityMin/Standard/Enhanced/Current、
maintenance、guideAndReset、appearance、currentAccount、loggedOut/logout*)
已无代码引用;为不混淆本次改动未删除(其中appearance在shell分片仍被引导页使用,
清理时须按分片区分)。