Skip to content

v8.0.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 01:33
· 59 commits to main since this release

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
    —— 两者是兄弟(都 extends EdgeInsetsGeometry),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 分片仍被引导页使用,
    清理时须按分片区分)。