pure_live 平台显示、偏好与第三方认证入口布局审计全解:从 6 项缺陷复现到边界保护闭环

发布时间:2026/10/15 6:39:35
pure_live 平台显示、偏好与第三方认证入口布局审计全解:从 6 项缺陷复现到边界保护闭环 音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载本篇技术指南围绕 pure_live 开源直播聚合客户端Flutter 实现在 2026-09-11 完成的「平台显示、平台偏好与第三方认证入口」专项审计展开。该审计对应验收组 A2-01 的增量聚焦平台设置页的确定性布局、选择/排序边界保护与抖音认证路由规范化。读完本文你将掌握 pure_live 平台偏好选择器的实现原理、窄屏大字号下控件纵向堆叠的布局策略、至少保留一个平台的控制器级约束、异常排序回调的防御逻辑以及规范路由 兼容别名的深链迁移方案并了解对应的自动化测试覆盖与质量门禁记录。审计范围与基线本次审计以提交5ffddea52af4bcb92e289d5e9865f3cfd83c0a9a为基线对应验收组 A2-01 的「平台显示、平台偏好和第三方认证设置」增量。测试采用固定布局矩阵320×480分辨率、英文语言、3.0 倍文字缩放同时保留普通420×800布局、平台目录迁移和导航排序回归以覆盖窄屏大字号与常规布局两条路径。审计过程先做修改前复现与代码审查失败记录保存在local-artifacts/build-records/20260911T090347891Z-quality-focused.json仓库审计快照为local-artifacts/repository-audits/20260911T090319332Z-focused.json。两个新增测试文件首轮结果为0 PASS / 6 FAIL稳定复现了六类问题为后续修订提供了可量化的起点。修改前稳定复现的六类问题固定夹具下复现的问题覆盖了信息说明缺失、布局几何失效、排序边界失控、首选值失效、路由误命名与停用项误导六个维度平台偏好项说明缺失偏好行只显示当前站名如 bilibili没有解释该选项对热门/分区首屏的实际影响标签管理项同样遗漏了已有说明文案用户无法理解入口含义。窄屏大字号下控件错位平台显示行在窄屏大字号下仍把开关和拖动控件固定在标题右侧。实测控件顶部位于 455.7而标题底部已延伸到 615.7二者在纵向空间上完全错位没有形成可操作的纵向控制行。拖动入口与排序边界失控隐藏项和唯一可见平台仍显示拖动入口排序回调对异常索引负数、越界没有边界保护可能引发越界访问。可见性约束缺失页面允许隐藏最后一个可见平台隐藏当前首选平台后preferPlatform仍指向不可见平台导致进入热门/分区时首选值失效。路由误命名路由表把抖音 Cookie 页面注册在历史误命名的/douyu_cookie抖音账号行也继续跳转该路径规范路径/douyin_cookie反而没有注册。停用项视觉误导与弹窗溢出已停用的斗鱼账号行仍显示设置 Cookie和右箭头视觉上像可进入页面平台退出确认弹窗在固定矩阵320×480、3.0 倍字号下向底部溢出 32 像素操作按钮不可完整触达。一个重要的边界约定现有导入语义会保留用户明确导入的空平台列表本批不重写备份/迁移数据至少保留一个平台只约束页面上的新操作避免把 UI 修复扩大成配置兼容性变更。这一点在 favorite_room_controller.dart 的hotAreasList读取/导入逻辑中保持一致——导入时不做强制补全。平台偏好选择器说明文案与可滚动弹窗设置页入口与文案补齐平台设置页位于 platform_settings_page.dart由设置页settings_page.dart通过Get.to(() const PlatformSettingsPage())进入。页面包含四个入口平台显示platform_display跳转/hot_areas管理首页直播平台排序首选直播平台prefer_platform选择进入热门/分区时的首屏平台三方认证third_party_auth跳转/settings_account管理平台授权标签管理tag_management跳转/settingTags管理直播间过滤标签。本次修订为平台偏好行补齐了说明与当前本地化站名Obx( () context.buildTile( icon: Remix.heart_3_line, title: i18n(prefer_platform), subtitle: i18n(prefer_platform_subtitle), isLong: true, stackTrailingOnNarrow: true, trailing: Wrap( children: [ Text( _platformLabel(FavoriteRoomController.to.preferPlatform.value), ... ), Icon(Icons.chevron_right_rounded, ...), ], ), onTap: () showPreferPlatformSelectorDialog(context), ), ),其中_platformLabel通过i18nOr(site_$normalized, normalized)将平台 ID 映射为本地化站名——即偏好行现在显示的是当前选中平台的本地化名称如哔哩哔哩而不仅仅是内部 ID。对应中英文文案在 assets/translations/zh.json 与 assets/translations/en.json 中可查。可滚动 AlertDialog 与末项可达性平台偏好选择器改为整体可滚动的AlertDialogscrollable: true内部包含顶部过滤输入框prefer-platform-filter支持按平台 ID 或名称搜索已显示平台无匹配时显示没有匹配的平台空态RadioGroupRadioListTile列出所有可见平台选中后调用FavoriteRoomController.to.changePreferPlatform(value)并关闭弹窗。关键改进点是末项可达在 320×480、3.0 倍字号下22 个适配器的最后一项网络IPTV也能滚动到并点击整个选项行均可作为点击区域不再依赖屏幕恰好放下全部选项。平台显示行按宽度与文字缩放切换布局平台显示页热门平台设置位于 hot_areas_page.dart基于ReorderableListView.builder实现每个平台项包含开关Switch、拖动手柄ReorderableDragStartListener与 Logo。纵向堆叠条件布局决策在LayoutBuilder中完成final stackControls constraints.maxWidth 360 || MediaQuery.textScalerOf(context).scale(1) 1.5; return ListTile( title: stackControls ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [title, const SizedBox(height: 6), controls], ) : title, trailing: stackControls ? null : controls, );即当行宽小于 360 或文字缩放系数大于 1.5时开关与拖动入口从trailing移入title下方的纵向Column形成可操作的纵向控制行。这正是修复 320×480 3.0 倍字号下控件顶部 455.7 vs 标题底部 615.7错位的机制不再把控件硬塞到标题右侧而是自然堆叠。拖动入口的可见性规则拖动入口的渲染条件收紧了if (isShow visibleCount 1) ...[ ReorderableDragStartListener(...), ],隐藏项不展示拖动入口——隐藏平台不在可排序范围内唯一可见平台不展示拖动入口——单项没有可排序对象。同时页面顶部提示横幅_buildTipBanner用双语明确提示drag_to_sort_tip长按右侧图标并上下拖动即可自定义主页直播平台的展示顺序与at_least_one_platform_required请至少保留一个可见直播平台。控制器边界保护至少保留一个平台与首选自动修复开关切换的约束逻辑开关事件由 hot_areas_controller.dart 的onChanged处理核心约束} else { if (!currentList.contains(id)) return; if (currentList.length 1) { ToastUtil.show(i18n(at_least_one_platform_required)); return; } currentList.remove(id); }隐藏操作在列表仅剩一项时被拒绝并弹出提示从控制器层面杜绝了隐藏最后一个可见平台。随后执行首选平台自动修复final currentPreference FavoriteRoomController.to.preferPlatform.v; if (currentList.isNotEmpty !currentList.contains(currentPreference)) { FavoriteRoomController.to.preferPlatform.v currentList.first; }隐藏当前首选平台时preferPlatform自动指向剩余列表的第一项保证首选值永远指向可见平台。排序回调的防御逻辑onReorder对异常索引做了完整边界保护if (oldIndex 0 || oldIndex sites.length) return; final currentSavedIds ListString.from(FavoriteRoomController.to.hotAreasList.v); if (currentSavedIds.length 1 || !currentSavedIds.contains(sites[oldIndex].id)) return; if (newIndex 0) return; if (newIndex oldIndex) { newIndex - 1; } final item sites.removeAt(oldIndex); sites.insert(newIndex.clamp(0, sites.length), item);负数与越界回调直接返回保持现状单平台或源项不在可见列表时直接返回目标索引clamp到合法区间排序后重新拼接为「可见平台在前、隐藏平台在后」且持久化顺序只包含可见平台hotAreasList.v newOrderSavedIds隐藏平台不进入持久化序列。偏好值的底层校验链preferPlatform定义于 favorite_room_controller.dart默认值为Sites.bilibiliSite。changePreferPlatform只接受hotAreasList中的规范化 IDvoid changePreferPlatform(String name) { final normalized name.trim().toLowerCase(); if (hotAreasList.contains(normalized)) { preferPlatform.v normalized; } }启动时还有两层自愈_normalizeSiteCatalogIds确保偏好值属于受支持平台否则回落 bilibili_normalizePreferredPlatform确保偏好值在可见列表中否则取列表首项。这些归一化在onInit与配置导入fromJson时都会执行。偏好值如何影响首屏preferPlatform的实际消费点有两处areas_controller.dart分区页首次初始化 TabController 时用preferPlatform定位初始 Tab 索引未命中则回退到 0popular_controller.dart热门页同样用偏好值决定初始 Tab。因此首选直播平台的说明文案prefer_platform_subtitle当进入热门/分区首选的直播平台与实现严格对应——它决定的是热门/分区页打开时的初始 Tab。同时hotAreasList通过ever监听驱动两个页面在平台列表变化时重建 Tab见 areas_controller.dart隐藏/排序修改即时生效。路由修正规范路径与旧深链兼容别名双路径注册方案本次修订新增规范路由/douyin_cookie并保留/douyu_cookie作为旧深链兼容别名。两条路径各注册一次都指向同一个DouyinCookiePage与DouyinCookieBindingGetPage( name: RoutePath.kDouyinCookie, // /douyin_cookie规范 page: _smoothPage(() const DouyinCookiePage()), bindings: [DouyinCookieBinding()], ), // Preserve the historical misnamed deep link while all in-app navigation // uses the canonical Douyin path above. GetPage( name: RoutePath.kDouyuCookie, // /douyu_cookie旧深链别名 page: _smoothPage(() const DouyinCookiePage()), bindings: [DouyinCookieBinding()], ),路由常量定义在 route_path.dartkDouyinCookie /douyin_cookiekDouyuCookie /douyu_cookie注释明确标注其为历史别名旧版本曾用它打开抖音 Cookie 页。全表注册见 app_pages.dart。应用内入口统一走规范路径账号页account_page.dart的抖音账号行在未登录时通过Get.toNamed(RoutePath.kDouyinCookie)跳转应用内导航一律使用规范路径。/douyu_cookie仅服务于历史深链如旧版本生成的分享链接、书签或外部唤起避免旧链接失效。抖音 Cookie 页本身是基于AccountCookieEditorPage的薄封装douyin_cookie_page.dart提供hintText/tipText/onSave三要素。停用账号行的视觉收敛与退出确认弹窗停用项不再伪装可点斗鱼账号行在 account_page.dart 中基于DouyuUtils.sessionState(cookie.douyuCookie.v)判断会话状态本次修订后会话为none无 Cookie时副标题显示未开启/Disabled移除右箭头trailing为null与点击处理onTap: null视觉上明确不可进入ListTile.enabled: isEnabled配合theme.disabledColor标题/副标题整体置灰会话过期但可续期expiredRefreshable时仍视为已登录因播放时 Cookie 会自动续期不误导用户。_buildAccountTile同时支持窄屏大字号下副标题两行显示maxLines: expandedText ? 2 : 1与平台显示行的纵向堆叠策略保持一致。退出确认弹窗的有界滚动退出/清空确认统一走_confirmDangerDialog采用有界可滚动弹窗AlertDialog( scrollable: true, insetPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), content: ConstrainedBox(constraints: const BoxConstraints(maxWidth: 420), child: Text(message)), actionsOverflowDirection: VerticalDirection.down, actionsOverflowButtonSpacing: 8, ... )scrollable: true让内容区在固定矩阵320×480、3.0 倍字号下可滚动而不溢出insetPadding在垂直方向保留 20px 边距actionsOverflowDirection: VerticalDirection.down让操作按钮在放不下时纵向排布且可完整触达修复了原先向底部溢出 32 像素的问题。按钮同时设置了minimumSize: Size(48, 48)满足最小触达尺寸。验证与质量门禁修订后的验证以最终统一质量记录local-artifacts/build-records/20260911T091303512Z-quality-focused.json与仓库审计local-artifacts/repository-audits/20260911T091151425Z-focused.json为准新增平台设置与账号导航测试 8/8 PASS覆盖偏好说明/末项可达、本地化当前值、控制行几何纵向堆叠、唯一项保护、首选自动修复、有效/异常/隐藏项排序、规范与兼容路由、停用账号视觉以及退出确认操作可达联合底部导航、站点注册及 AcFun、花椒、映客、克拉克拉、猫耳、niconico、OPENREC、Picarto、TTingLive、TwitCasting、微博和小红书目录迁移测试16 个文件最终49/49 PASS全库flutter analyze执行一次No issues found修改的 Dart 文件格式检查无差异仓库完整性审计错误为0已知告警 2质量任务结束时重型进程为0实际 ADB 命令为0本批未操作手机、未修改 LSP/Root/ADB、未构建候选包、未发布 3.2.0——这是一次纯代码层的确定性布局与边界修复闭环。当前边界与后续闭环本批完成后A2-01 验收组保持RUN状态。已闭环的是确定性页面布局、选择/排序边界与抖音认证入口仍按完整验收矩阵推进的事项包括真实 Android / Windows 设备上的平台设置逐项操作、Cookie 登录实际结果、覆盖升级后的持久化验证以及最终候选包验证。宏观验收状态保持20 PASS / 33 RUN / 9 NR共 42 组未闭环说明该审计是整体验收流程中的一环而非终点。对本主题的后续深入可继续查阅平台偏好与目录迁移的状态逻辑 favorite_room_controller.dart、平台显示页的响应式实现 hot_areas_page.dart、排序边界控制器 hot_areas_controller.dart、账号页停用项与退出弹窗 account_page.dart以及路由别名方案 app_pages.dart。赞分享音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载相关推荐pure_live 底部导航设置页重构审计显示、排序与窄屏布局的越界修复实战pure_live 底部导航设置页重构审计显示、排序与窄屏布局的越界修复实战 导读 本文围绕 pure_live纯粹直播的导航设置二级页面完整拆解 20音视频直播移动开发Cherry Studio v2新装默认经典 Owner 布局——显示模式偏好与默认值实现解析Cherry Studio v2新装默认经典 Owner 布局——显示模式偏好与默认值实现解析 本篇围绕 Cherry Studio v2 重构中的一条兼容性AI 应用大模型桌面应用本地部署RAG如何用DST-Admin-Go搭建终极饥荒服务器新手友好的可视化管理指南如何用DST Admin Go搭建终极饥荒服务器新手友好的可视化管理指南 你是否厌倦了复杂的命令行操作想要一个简单直观的方式来管理饥荒联机版服务器DST后端运维上一篇GitBucket安全工具选型解决方案指南方法论与工具选型下一篇TypeScript项目配置优化sway-farm编译性能与类型检查创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询