Files
xianyan/docs/specs/2026-05-29-widescreen-adaptation-archive.md
Developer ca68fe29c7 chore: 批量整理优化项目代码与配置
- 新增模型目录占位文件与翻译类型拆分
- 调整路由配置与桌面端窗口初始化
- 移除多处冗余图表配置项
- 重构右侧面板注册表与三栏布局组件
- 添加智能AppBar、拖拽书签等新功能组件
- 优化安卓编译配置与多平台插件注册
- 新增翻译覆盖率测试与共享组件
- 格式化代码与修复静态分析警告
2026-05-29 10:08:02 +08:00

17 KiB
Raw Blame History

/// 创建时间: 2026-05-29 /// 更新时间: 2026-05-29 /// 名称: 宽屏适配归档文档 /// 作用: 记录宽屏适配功能的所有视图组件、逻辑事件、动画细节 /// 上次更新内容: 22项增强任务全部完成追加新增组件和功能

宽屏适配归档文档


第一部分:视图组件清单(精确到每个按钮)

1. AppShell 层

  • AdaptiveSplitView 容器组件(左右分屏布局)
  • AdaptiveNavBar 垂直导航栏组件3个Tab💬闲言/🧭发现/👤我的)
  • SplitDivider 可拖拽分割线组件
  • SplitDivider 拖拽手柄视觉指示器
  • NavBar停靠位置切换左/右/上/下)
  • 宽屏/窄屏断点检测逻辑
  • 窄屏时底部 GlassBottomBar 保持
  • 宽屏时底部 GlassBottomBar 隐藏
  • 鸿蒙端 GlassBottomNavBar 降级适配
  • CelebrationOverlay 在分屏模式下的位置

2. 首页(闲言)

  • 左侧面板HomePage 完整内容(句子流列表)
  • 左侧面板HomeOfflineBanner 离线横幅
  • 左侧面板AppBarCharacterSprite 角色精灵(56x56)
  • 左侧面板CharacterTipBubble 提示气泡
  • 左侧面板:标题"闲言" + AppBarDateDisplay
  • 左侧面板:搜索按钮(CupertinoIcons.search)
  • 左侧面板DailyCard 每日推荐卡片
  • 左侧面板HomeActionButtons 创作卡片+编辑此句按钮
  • 左侧面板SquareHeaderContent 频道标签吸顶区
  • 左侧面板TypeChip 频道标签芯片
  • 左侧面板HomeSentenceListSection 句子列表
  • 左侧面板HomeSentenceCard 句子卡片(含所有按钮)
    • AccentBar 3px主题色竖条
    • FeedHeader: feedIcon(12px) + feedName + 👁浏览量
    • SentenceText 句子文本 + PinyinAnnotationText
    • StatsRow: 👍点赞 + 收藏 + 💬评论
    • ActionRow: 作者名 + 拼音按钮 + 翻译按钮 + TTS按钮 + 收藏动画 + 点赞动画
    • AppSlidable: 左滑分享 / 右滑收藏+稍后读
  • 右侧面板SentenceDetailPanel 句子详情面板从Sheet重构
    • 来源行:渐变图标(32x32) + feedName + source + 👁浏览量pill
    • 统计chips👍点赞 / 收藏 / 💬评论
    • 句子卡片:大引号(48px) + SelectableText
    • 作者行:渐变圆形头像(28x28) + 作者名
    • 摘要框:💡 + summary
    • HTML内容框📝原文内容 + 左侧accent边框(3px)
    • 快捷操作:👍点赞 / 收藏 / 📖稍后读 / ↗️分享
    • 次要操作:🔖书签 / 🏷️标签 / 🔍外部搜索 / 🔊朗读 / 📡NFC
    • 主操作:✏️编辑此句
    • 危险操作:🚫屏蔽 / 🙈不感兴趣
    • TtsPlayerBar 语音播放条
  • 右侧面板:概览仪表盘(空状态)
    • 今日推荐区
    • 快捷操作区
    • 最近浏览区
    • 数据统计区

3. 发现页

  • 左侧面板DiscoverPage 完整内容(会话流列表)
  • 左侧面板Header 标题 + 工具按钮(CupertinoIcons.wrench_fill)
  • 左侧面板SessionSearchBar 搜索栏
  • 左侧面板SessionRow 会话行
    • 头像区域(52x52)emoji头像 + 未读Badge(20x20) + 免打扰图标(14x14)
    • 名称行:显示名 + tag标签(pill) + 置顶图标
    • 描述行lastMessage
    • 时间行displayTime
    • 箭头CupertinoIcons.chevron_right
    • Slidable置顶/隐藏
    • 长按菜单:置顶/备注/已读/免打扰/隐藏/删除
  • 右侧面板ChatFlowPanel 会话流详情面板
    • 导航栏AdaptiveBackButton + 标题 + 搜索/新建/设置按钮
    • ChatFlowSearchBar 搜索栏
    • ChatFlowCategoryBar 分类栏(7个标签)
    • ChatFlowMessageList 消息列表
    • ChatBubble 气泡组件(用户+AI
      • 用户气泡SpriteAvatar + Tilt倾斜 + 毛玻璃 + 渐变背景 + 双层阴影
      • AI气泡渐变头像(34x34) + 分类渐变背景 + 操作按钮(❤️🎨↗️)
      • ChatImageBubble 图片气泡(240px宽)
      • ChatAudioBubble 音频气泡(播放按钮+波形图)
      • ChatLinkBubble 链接气泡(OG元数据+打开/复制按钮)
      • ChatSentenceCardBubble 句子卡片气泡
    • ChatFlowInputBar 输入栏
      • 附件按钮(36x36, CupertinoIcons.plus)
      • 文本输入框
      • 富文本按钮(36x36)
      • 发送按钮(38x38, CupertinoIcons.arrow_up)
      • 回复预览栏
      • 快捷分类栏(4个标签)
      • 8宫格附件面板
  • 右侧面板:概览仪表盘(空状态)

4. 我的页面

  • 左侧面板ProfilePage 完整内容(设置列表)
  • 左侧面板:标题栏 + 快捷操作按钮
  • 左侧面板_ProfileHeader 头像(64x64) + 用户名 + LV标签
  • 左侧面板_UserStatsBar 积分/签到/笔记统计
  • 左侧面板设置组1 - 收藏(heart)/历史(clock)/深色模式(moon)
  • 左侧面板设置组2 - 账户(person)/数据(folder)/离线(offline_bolt)/缓存(trash)
  • 左侧面板设置组3 - 语言(globe)/主题(paintbrush)/通用(gear)/桌面组件(widget)/句子来源(text_quote)
  • 左侧面板设置组4 - 关于(info)/评价(star)/调试(bug)
  • 右侧面板:各设置项对应面板
    • 收藏面板(FavoritePage内容)
    • 历史面板(HistoryPage内容)
    • 账户设置面板(AccountSettingsPage内容)
    • 数据管理面板(DataManagementPage内容)
    • 通用设置面板(GeneralSettingsPage内容)
    • 主题设置面板(ThemeSettingsPage内容)
    • 语言设置面板(LanguageSettingsPage内容)
    • 关于面板(AboutPage内容)
    • 其他设置面板(按需)
  • 右侧面板:概览仪表盘(空状态)

5. 通用设置 - 导航栏位置设置

  • 导航栏位置选择器4选1左/右/上/下)
  • 分屏默认比例滑块30%-60%
  • 分屏功能开关

6. 引导页宽屏适配

  • ResponsiveMaxWidth 包裹引导页内容
  • 宽屏下内容自动居中maxWidth: 700
  • 窄屏下保持原有全宽布局

第二部分:逻辑事件清单(精确到每个状态)

1. SplitView 核心状态

  • splitRatioProvider: double当前分割比例默认0.4)→ 合并到 SplitViewState
  • rightPanelContentProvider: String?(右侧面板内容标识)→ 合并到 SplitViewState
  • isSplitViewActiveProvider: bool是否处于分屏模式→ 合并到 SplitViewState
  • navBarPositionProvider: NavBarPosition导航栏停靠位置→ 合并到 SplitViewState
  • splitViewEnabledProvider: bool分屏功能开关→ 合并到 SplitViewState
  • 断点检测width >= 900 → 分屏模式
  • 断点检测width < 900 → 单屏模式
  • 分割线拖拽onHorizontalDragUpdate → 更新splitRatio
  • 分割线拖拽左侧最小宽度320px保护
  • 分割线拖拽右侧最小宽度400px保护
  • 分割线拖拽HapticFeedback.selectionClick触觉反馈
  • 窄屏→宽屏过渡:右侧面板滑入动画
  • 宽屏→窄屏过渡:右侧面板滑出动画
  • 右侧面板内容切换FadeTransition过渡

2. 首页分屏逻辑

  • 点击句子卡片 → 宽屏右侧显示SentenceDetailPanel
  • 点击句子卡片 → 窄屏底部Sheet弹出现有行为
  • 句子详情面板数据加载FeedService.fetchDetail()
  • 句子详情面板交互:点赞 toggleLike300ms防抖
  • 句子详情面板交互:收藏 toggleFavorite300ms防抖
  • 句子详情面板交互:稍后读 toggleReadLater
  • 句子详情面板交互:分享 ShareSheet
  • 句子详情面板交互:书签/标签/外部搜索/朗读/NFC
  • 句子详情面板交互:编辑此句 → 跳转编辑器
  • 句子详情面板交互:屏蔽/不感兴趣
  • 句子详情面板TTS播放控制
  • 左侧列表滚动不影响右侧面板
  • 右侧面板滚动不影响左侧列表
  • 左右面板手势隔离NotificationListener
  • 空状态:右侧显示概览仪表盘

3. 发现页分屏逻辑

  • 点击会话行 → 宽屏右侧显示ChatFlowPanel
  • 点击会话行 → 窄屏:全屏导航(现有行为)
  • ChatFlowPanel数据加载chatMessagesProvider(conversationId)
  • ChatFlowPanel消息发送_sendAll文本+附件)
  • ChatFlowPanel搜索切换_toggleSearch
  • ChatFlowPanel回复消息_setReplyTo
  • ChatFlowPanel分类筛选selectCategory
  • ChatFlowPanel附件选择AttachmentGridSheet
  • ChatFlowPanel气泡交互点赞/收藏/制作/分享
  • ChatFlowPanel气泡长按回复/编辑/已阅/删除
  • ChatFlowPanel输入栏键盘管理(KeyboardManager)
  • 左侧会话列表滚动不影响右侧
  • 右侧聊天面板滚动不影响左侧
  • 左右面板手势隔离
  • 空状态:右侧显示概览仪表盘

4. 我的页面分屏逻辑

  • 点击设置项 → 宽屏:右侧显示对应设置面板
  • 点击设置项 → 窄屏:全屏导航(现有行为)
  • 设置面板数据加载各Provider
  • 设置面板交互CupertinoSwitch切换
  • 设置面板交互CupertinoPicker选择
  • 设置面板交互:路由跳转子页面
  • 左侧设置列表滚动不影响右侧
  • 右侧设置面板滚动不影响左侧
  • 左右面板手势隔离
  • 空状态:右侧显示概览仪表盘

5. 导航栏逻辑

  • NavBarPosition.left垂直导航栏在左侧
  • NavBarPosition.right垂直导航栏在右侧
  • NavBarPosition.top水平导航栏在顶部
  • NavBarPosition.bottom底部导航栏现有GlassBottomBar
  • 导航栏位置切换动画AnimatedSwitcher 400ms
  • Tab切换goBranch(index)
  • 未读消息红点chatProvider.unreadCount
  • 角色精灵TabIconSprite动画
  • 导航栏设置持久化KvStorage

第三部分:动画清单(细微变化)

1. SplitView 动画

  • 右侧面板滑入SlideTransition, 350ms, easeInOutCubic, 从右侧滑入
  • 右侧面板滑出SlideTransition, 300ms, easeInOutCubic, 向右侧滑出
  • 右侧面板内容切换FadeTransition, 200ms, easeIn
  • 分割线拖拽实时响应0ms延迟
  • 分割线hover高亮AnimatedContainer, 150ms, 宽度2px→4px
  • 窄屏→宽屏布局重排400ms, easeInOut
  • 宽屏→窄屏布局重排400ms, easeInOut
  • 导航栏位置切换AnimatedSwitcher, 400ms, easeInOut

2. AdaptiveNavBar 动画

  • TabIconSprite弹跳4段TweenSequence, 500ms, 果冻弹跳效果
  • TabIconSprite光晕脉冲2000ms, repeat reverse, 径向渐变4色
  • TabIconSprite表情过渡300ms, 角色表情切换
  • TabIconSprite相邻注视250ms, 眼球跟随
  • TabIconSprite标签显隐200ms, 文字淡入淡出
  • TabIconSprite浮动粒子角度+半径+透明度动画
  • 选中指示器液态玻璃refractiveIndex 1.45, chromaticAberration 0.3
  • 导航栏毛玻璃BackdropFilter, GlassTokens.elevatedBlur
  • 导航栏渐变背景top→bottom渐变
  • 导航栏双阴影accent色光晕

3. 首页分屏动画

  • 句子详情面板入场fadeIn 300ms + slideX 0.05→0
  • 句子详情面板内容加载shimmer1200ms, accent 3% / white 8%
  • 快捷操作按钮按压scale 1.0→0.92, 150ms + 释放200ms
  • 快捷操作图标切换AnimatedSwitcher, 200ms
  • 快捷操作文字样式AnimatedDefaultTextStyle, 250ms
  • 点赞动画LikeAnimation, scale 1.0→1.3→1.0, 300ms/200ms
  • 收藏动画FavoriteBounceAnimation, scale 1.0→1.5→0.9→1.0, 400ms/250ms
  • 稍后读动画ReadLaterAnimation, scale 1.0→1.25→1.0, 300ms/200ms
  • 左侧卡片点击反馈PressableCard, scale 1.0→0.97, 100ms
  • 左侧列表入场fadeIn 400ms + slideY 0.08→0, stagger 30ms*index
  • 左侧骨架屏shimmer1500ms, accent 12%, angle -15°
  • 左侧骨架→内容过渡600ms
  • 概览仪表盘入场fadeIn 300ms + slideY 0.05→0, stagger 50ms

4. 发现页分屏动画

  • 会话流面板入场fadeIn 300ms + slideX 0.05→0
  • 消息气泡入场fadeIn + slideY, 350ms
  • AI气泡shimmer1200ms, accent 3% / white 8%
  • 句子卡片shimmer1200ms, white 8%
  • 发送按钮渐变AnimatedContainer, 300ms, 背景/阴影/尺寸
  • 发送Toast滑入slideY -0.5→0 + fadeIn, 350ms, easeOut
  • 发送Toast滑出350ms反向
  • 发送星星Lottiestar.json, 120x120, 1500ms
  • 庆祝粒子ConfettiController, 3s, 30粒子, explosive
  • 空状态emoji脉冲scale 1.0↔1.1, 1500ms, repeat reverse
  • 用户气泡Tilt倾斜angle 3, 3D效果
  • 音频波形CustomPaint20条3px宽圆角矩形
  • 工具图标按压scale 1.0→0.92, 100ms
  • 概览仪表盘入场:同首页

5. 我的页面分屏动画

  • 设置面板入场fadeIn 300ms + slideX 0.05→0
  • 设置项切换FadeTransition, 200ms
  • CupertinoSwitch切换动画系统默认
  • 概览仪表盘入场:同首页

6. 过渡动画

  • 窄屏→宽屏:右侧面板从右边缘滑入,左侧面板宽度收缩
  • 宽屏→窄屏:右侧面板向右滑出,左侧面板宽度扩展
  • 导航栏位置切换AnimatedSwitcher淡入淡出
  • 分屏开关切换:布局重排动画
  • Tab切换时右侧面板内容切换fadeOut + fadeIn

开发进度追踪

阶段 状态 完成日期
架构设计 完成 2026-05-29
HTML预览页面 完成 2026-05-29
Spec文档编写 完成 2026-05-29
AdaptiveSplitView组件 完成 2026-05-29
AdaptiveNavBar组件 完成 2026-05-29
首页分屏适配 完成 2026-05-29
发现页分屏适配 完成 2026-05-29
我的页面分屏适配 完成 2026-05-29
概览仪表盘 完成 2026-05-29
导航栏位置设置 完成 2026-05-29
动画与过渡 完成 2026-05-29
手势隔离 完成 2026-05-29
引导页宽屏适配 完成 2026-05-29
测试与验收 完成 2026-05-29
状态管理去重 完成 2026-05-29
面板缓存(KeepAlive) 完成 2026-05-29
键盘适配 完成 2026-05-29
分割线双击重置+触控区域 完成 2026-05-29
横屏居中效果 完成 2026-05-29
概览仪表盘真实数据 完成 2026-05-29
Hero动画 完成 2026-05-29
flutter_animate替换 完成 2026-05-29
交错动画 完成 2026-05-29
photo_view集成 完成 2026-05-29
dartx集合扩展 完成 2026-05-29
freezed不可变数据类 完成 2026-05-29
文件拖放(desktop_drop) 完成 2026-05-29
自定义标题栏(bitsdojo_window) 完成 2026-05-29
面板书签功能 完成 2026-05-29
跨面板拖拽(LongPressDraggable) 完成 2026-05-29
三栏布局(超宽屏) 完成 2026-05-29
Rive交互式动画 完成 2026-05-29
跨平台兼容处理 完成 2026-05-29
智能AppBar 完成 2026-05-29
22项增强验收 完成 2026-05-29

第四部分22项增强任务新增组件

新增视图组件

  • KeepAlivePanelWrapper — 面板缓存组件(AutomaticKeepAliveClientMixin)
  • TripleColumnView — 三栏布局组件(超宽屏>=1400px)
  • RiveTabIcon — Rive交互式Tab动画组件
  • SmartAppBar — 智能AppBar(窄屏居中/宽屏靠左)
  • PanelBookmark — 面板书签数据模型
  • DragTarget高亮边框 — 跨面板拖拽视觉反馈
  • DropTarget拖放区域 — 桌面端文件拖放
  • WindowControlBtn — 窗口控制按钮(最小化/最大化/关闭)
  • PhotoView全屏查看器 — 图片缩放/平移
  • LongPressDraggable句子卡片 — 跨面板拖拽源

新增逻辑事件

  • splitViewProvider唯一数据源 — display_settings_provider不再存储分屏字段
  • SplitDivider双击重置 — 双击恢复默认40:60比例
  • SplitDivider触控区域增大 — 17px→24px
  • 横屏居中检测 — width>600 && width<900 && height<width
  • 键盘高度适配 — MediaQuery.viewInsets.bottom
  • 面板缓存 — AutomaticKeepAliveClientMixin保持状态
  • 文件拖放 — DropTarget.onDragDone获取文件路径
  • 面板书签 — addBookmark/removeBookmark/applyBookmark
  • 跨面板拖拽 — LongPressDraggable + DragTarget
  • 三栏布局 — kTripleColumnBreakpoint=1400.0
  • Ctrl+1/2/3切换Tab — 桌面端键盘快捷键
  • Ctrl+W关闭面板 — 桌面端键盘快捷键
  • 桌面端跳过HapticFeedback — platform_utils.isDesktop
  • 自定义标题栏 — bitsdojo_window窗口管理

新增动画

  • flutter_animate声明式面板动画 — .slideX().fadeIn()替代AnimationController
  • 交错列表动画 — AnimationLimiter+SlideAnimation+FadeInAnimation
  • Heroine面板过渡 — sentence_detail Hero tag
  • Rive StateMachine动画 — isSelected输入控制
  • DropTarget拖放高亮 — 蓝色边框+半透明背景
  • DragTarget悬停高亮 — 蓝色边框