35 KiB
35 KiB
Changelog
所有重要变更均记录于此文件。格式基于 Keep a Changelog。
保留最近 10 个版本(v6.89.1 ~ v6.96.0)。更早版本(v6.87.0 ~ v6.89.0)的特性已合并进软件特性功能文档,详见各版本条目。
[v6.96.0] - 2026-06-22
✨ 新增(Windows 桌面端)
窗口大小预设菜单(3×2 网格)
- 功能: 点击窗口标题栏"口"按钮(最小化与关闭之间),在按钮下方弹出 3 列 × 2 行的窗口大小预设网格菜单
- 预设尺寸: 小窗 800×600 / 标准 1024×768 / 宽屏 1280×720 / 大屏 1440×900 / 全高清 1920×1080 / 最大化·还原
- 交互:
- 弹出位置自动右对齐按钮,带边界自适应(防止溢出屏幕)
- 入场动画:缩放 + 淡入(从右上角展开,180ms easeOutCubic)
- 退出动画:缩放 + 淡出(120ms)
- 点击外部区域自动关闭
- 每个单元格悬停时高亮(accent 色 14% 背景 + 45% 边框)
- 设计: iOS 26 Liquid Glass 风格 — Alert 层级毛玻璃(blur 40px)、圆角 16px、GlassTokens 边框 + 阴影
- 技术方案:
- 提取共享组件
shared/widgets/window_size_popup.dart,供DesktopWindowTitleBar和AdaptiveNavBar复用 - 使用
OverlayEntry+Positioned实现精确定位弹出 _WindowsControlButton.onPressed/_WindowControlBtn.onPressed签名改为void Function(BuildContext)以传递按钮自身 context 用于定位
- 提取共享组件
- 文件:
- lib/shared/widgets/window_size_popup.dart(新增)
- lib/features/desktop/desktop_window_title_bar.dart("口"按钮改为弹出菜单)
- lib/app/layout/adaptive_nav_bar.dart(引用共享组件,删除本地重复定义)
[v6.95.0] - 2026-06-21
🐛 修复(鸿蒙端专项)
鸿蒙端横屏翻转失效
- Issue: 鸿蒙端横屏时软件没有翻转,安卓/iOS 正常
- 根因:
EntryAbility.ets注册了flutter/platform通道拦截器,其default分支调用result.notImplemented(),导致SystemChrome.setPreferredOrientations等平台方法全部失效 - 修复:移除
flutter/platform通道拦截器,由 Flutter 鸿蒙引擎原生PlatformChannel.ets处理所有平台方法 - 文件:ohos/entry/src/main/ets/entryability/EntryAbility.ets
鸿蒙端复制粘贴不生效
- Issue: 点击复制按钮显示成功但实际未复制;输入框长按粘贴无反应
- 根因1(复制):同上,
flutter/platform拦截器覆盖了引擎原生Clipboard.setData实现 - 根因2(粘贴):
READ_PASTEBOARD为system_basic级系统权限,普通应用无法通过requestPermissionsFromUser申请;引擎原生getClipboardData因权限缺失返回null - 修复:
- 复制:移除拦截器后由引擎原生
PlatformChannel.ets处理Clipboard.setData(无需权限) - 粘贴:创建
CustomPlatformPlugin.ets中间件,继承PlatformPlugin和PlatformPluginCallback,覆盖getClipboardData方法,使用系统安全控件PasteButton获取临时剪贴板读取授权(点击后授权持续到灭屏/切后台/退出) - 覆盖
clipboardHasStrings返回true,确保输入框工具栏粘贴按钮显示 - 在
EntryAbility.ets覆盖providePlatformPlugin返回CustomPlatformPlugin
- 复制:移除拦截器后由引擎原生
- 架构亮点:不修改 SDK 源码,通过继承实现中间件过渡层,SDK 升级不受影响
- 文件:ohos/entry/src/main/ets/entryability/CustomPlatformPlugin.ets(新增)、ohos/entry/src/main/ets/entryability/EntryAbility.ets
鸿蒙端设备信息显示"未知设备"
- Issue: 我的设备页面鸿蒙端显示"未知设备",安卓/iOS 正常
- 根因:
DeviceMethodHandler.ets返回鸿蒙原生字段名(manufacture、marketName、productModel等),与AndroidDeviceInfo.fromMap期望的 Android 字段名(manufacturer、name、model等)不匹配 - 修复:
- 在
DeviceMethodHandler.ets增加 Android 兼容字段映射,保留原生鸿蒙字段的同时补充board/bootloader/brand/device/display/fingerprint/hardware/host/id/manufacturer/model/product/name/tags/type/isPhysicalDevice等字段 - 在
AndroidDeviceInfo.fromMap增加防御性默认值(?? ''、?? 0、?? true),防止type 'Null' is not a subtype of type 'String'崩溃
- 在
- 文件:packages/device_info_plus/ohos/.../DeviceMethodHandler.ets、packages/device_info_plus/lib/src/model/android_device_info.dart
鸿蒙端搜索页 flutter_keyboard_visibility 崩溃
- Issue: 搜索页面报
MissingPluginException(No implementation found for method listen on channel flutter_keyboard_visibility) - 根因:
flutter_keyboard_visibility插件无鸿蒙原生实现,EventChannel.listen抛出MissingPluginException - 修复:
KeyboardManager延迟初始化KeyboardVisibilityController并捕获异常,鸿蒙端降级为MediaQuery.of(context).viewInsets.bottom > 0检测键盘可见性 - 文件:lib/shared/widgets/adaptive/keyboard_safe_sheet.dart
鸿蒙端安装失败(READ_PASTEBOARD 权限)
- Issue: 声明
ohos.permission.READ_PASTEBOARD后安装失败,报grant request permissions failed - 根因:
READ_PASTEBOARD为system_basic级权限,普通应用无法通过module.json5的requestPermissions声明 - 修复:从
module.json5移除READ_PASTEBOARD权限声明,改用PasteButton安全控件获取临时授权 - 文件:ohos/entry/src/main/module.json5
新特性轮播正则表达式崩溃
- Issue:
FormatException: Range out of order in character class ^([\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}]+)\s* - 根因:Dart raw string (
r'...') 中\u{1F300}不会被解析为 Unicode 转义,导致正则引擎看到无效字符范围 - 修复:改用
Runes逐字符检测 code point 范围,避免正则 Unicode 转义兼容性问题 - 文件:lib/features/home/presentation/widgets/new_features_dialog.dart
🔧 架构改进
SDK 零修改原则
- 原则:所有鸿蒙端修复均不修改 Flutter 鸿蒙 SDK 源码(
e:\sdk\flutter-ohos\),通过项目内中间件继承实现 - 中间件:
CustomPlatformPlugin.ets继承PlatformPlugin+PlatformPluginCallback,覆盖剪贴板方法 - 优势:SDK 升级时无需合并冲突,中间件代码完全在项目可控范围内
[v6.94.5] - 2026-06-19
🐛 修复
工作台设置页 Slider 报错(No Material widget found)
- Issue: 工作台设置页打开即崩溃,报 "No Material widget found. Slider widgets require a Material widget ancestor":
WorkbenchSettingsPage使用CupertinoPageScaffold(无 Material 祖先),但_SliderTile使用 Material 组件Slider,导致断言失败。- 修复:将
Slider替换为CupertinoSlider,符合项目规则"优先使用 Cupertino 组件",并使用ext.accent作为激活色保持主题一致 - 文件:lib/features/settings/presentation/workbench/workbench_settings_page.dart
- 修复:将
移动端横屏工作台布局空白问题
- Issue: 移动端横屏工作台模式中栏左右两边有空白,要求缩短空白用来显示中栏页面:
- 根因1:双栏模式中栏宽度被
* 0.75缩放,导致中栏宽度不足,页面内容两侧出现空白 - 根因2:中栏内嵌页面(HomePage/DiscoverPage 等)使用
SafeArea(bottom: false),横屏时left/right默认为true,会添加水平 padding 导致左右空白 - 修复1:移除双栏模式
* 0.75缩放,中栏使用完整宽度(与三栏模式一致) - 修复2:
_buildMiddlePanel使用MediaQuery.removePadding移除水平 SafeArea padding,避免横屏时左右空白 - 文件:lib/core/layout/workbench/workbench_layout.dart
- 根因1:双栏模式中栏宽度被
[v6.94.4] - 2026-06-19
🐛 修复
工作台布局修复(3处)
- Issue1: 拖拽宽度 clamp 逻辑冗余且极端小屏可能抛异常:
_onDragUpdate两次 clamp 冗余(先 clamp 到屏幕允许值,再 clamp 到硬编码_maxMiddleWidth),且极端小屏(screenMax < _minMiddleWidth)时第一次 clamp 上限 < 下限会抛ArgumentError。- 说明:原 Issue 描述"第二次 clamp 反向扩大宽度导致溢出"有误——Dart
clamp不会扩大值,只限制值。真正问题是冗余 + 极端小屏异常。 - 修复:合并为单次 clamp,取
screenMax与_maxMiddleWidth的较小值作为有效上限,并用safeMax保护下限(避免ArgumentError) - 文件:lib/core/layout/workbench/workbench_layout.dart
- 说明:原 Issue 描述"第二次 clamp 反向扩大宽度导致溢出"有误——Dart
- Issue2: 双栏模式注释与实现不符:注释称"隐藏中栏",但实际代码显示中栏(宽度*0.75)。
- 修复:更新注释为"中栏紧凑显示(宽度*0.75)+ 分割条 + 右栏",匹配实际实现
- 文件:lib/core/layout/workbench/workbench_layout.dart
- Issue3: pop 操作未检查 canPop 导致根级页面被意外弹空:
pop仅检查entries.isEmpty,栈深 1 时canPop=false但 pop 仍执行removeLast导致栈变空,与canPop判断不一致。- 修复:
pop改为if (!currentStack.canPop) return,与canPop保持一致 - 联动修复:v6.94.2 的 Issue3(构建失败移除无效条目)原直接调用
pop,在栈深 1 时会因 canPop 检查不执行导致无效条目残留。改为canPop时pop、否则clear(栈深 1 的无效条目即根级,清空回仪表盘) - 文件:lib/core/layout/workbench/right_panel_navigator.dart、lib/core/layout/workbench/workbench_layout.dart
- 修复:
[v6.94.3] - 2026-06-19
🐛 修复
工作台模式白屏问题(搜索取消导致根栈弹空)
- Issue: 仪表盘点搜索→取消后白屏:工作台模式下,搜索页通过
rightPanelStackProvider推入右栏嵌套栈渲染(非 GoRouter Navigator),但页面内取消按钮调用Navigator.pop(context)误弹根 GoRouter 栈,触发currentConfiguration.isNotEmpty断言错误,导致白屏。- 根因:右栏页面直接使用
Navigator.pop(context)操作根 GoRouter Navigator,而非右栏嵌套栈 - 修复:在
AppNavExtension新增工作台感知的appPop()/appCanPop()方法(宽屏工作台模式 pop 右栏栈,否则回退Navigator.pop);同步在WorkbenchNavExtension新增WidgetRef版本 - 文件:lib/core/router/app_nav_extension.dart
- 根因:右栏页面直接使用
- AdaptiveBackButton 工作台感知:统一返回按钮组件接入
appCanPop/appPop,正确感知右栏栈状态- 文件:lib/shared/widgets/adaptive/adaptive_back_button.dart
- SearchPage 取消按钮:改用
context.appPop()替代Navigator.pop(context)- 文件:lib/features/search/presentation/search_page.dart
- 举一反三(12处页面级返回按钮):批量修复 member_page、category_detail_page、article_edit_page、article_detail_page、screen_share_page、crash_log_page、ctc_note_list_page、tool_bottom_bar、qrcode_login_page、qr_code_tab、device_pairing_page、study_plan_page 的页面级返回按钮(仅页面级,对话框/sheet 内的 pop 保持不变)
- 文件:见上述各文件
闲情逸致页面卸载后 ref 报错
- Issue: 闲情逸致页面报错 "Using ref when widget is about to or has been unmounted":
_scrollToToday在Future.delayed回调中使用ref.read()未检查mounted,widget 卸载后 ref 不安全。- 修复:
_scrollToToday和_scrollToDate异步回调前增加mounted检查 - 文件:lib/features/tool_center/leisure/presentation/pages/leisure_timeline_page.dart
- 修复:
[v6.94.2] - 2026-06-19
🐛 修复
右栏返回栈行为修复(3处同源问题)
- Issue1: 返回按钮行为不符合预期:原
_onRightPanelPop误用clear清空整个栈,导致已打开页面全部丢失,与"逐步返回上一页"预期不符。- 根因:
_onRightPanelPop误用clear而非pop,无论栈深多少都一次清空 - 修复:拆分为双按钮交互(左侧按钮组,栈深>1 时显示):
- 返回上一页(
CupertinoIcons.backchevron 图标):调用pop逐页返回,符合 iOSUINavigationController标准语义 - 回仪表盘(
CupertinoIcons.house_fill房子图标):调用clear快捷回根,解决栈深较大时多次点击痛点
- 返回上一页(
- 文件:lib/core/layout/workbench/workbench_layout.dart
- 根因:
- Issue2: 快捷键返回行为错误:
_RightPanelBackAction.invoke(Ctrl/Cmd+←、Esc)同样误用clear,与返回按钮同源问题。- 修复:改为
pop逐页返回,与 UI 返回按钮语义保持一致 - 文件:lib/app/layout/app_shell.dart
- 修复:改为
- Issue3: 页面构建失败保留无效条目:
pageWidget == null时仅返回默认面板,但无效条目残留在栈中,导致后续返回行为异常(脏栈)。- 修复:构建失败时通过
WidgetsBinding.instance.addPostFrameCallback延迟pop无效条目(避免 build-during-build 异常),再返回默认面板 - 文件:lib/core/layout/workbench/workbench_layout.dart
- 修复:构建失败时通过
[v6.94.1] - 2026-06-19
✨ 交互增强与类型安全巡检(6项)
新功能
- 富媒体新功能弹窗:引导页"了解新功能"弹窗重构为图文卡片轮播(PageView),支持 emoji 解析+关键词图标匹配+光晕效果+动态主题色+手势滑动+页码指示器
- 动态主题色图标组件:新增
ThemedIcon组件(shared/widgets/display/themed_icon.dart),支持 15 种颜色映射+圆形背景+光晕效果,随主题动态变化 - 壁纸离线浏览:壁纸画廊新增"💾 已缓存"离线模式,无网络环境下可浏览已加载壁纸,支持空状态提示+动态标题+自动退出离线模式
功能完善
- 稍后读批量管理持久化:
toggleRead/markAllRead/markSelectedRead从仅内存更新升级为持久化到 DB(调用ChatMessageService.markIsRead),采用乐观更新策略+Future.wait并行执行 - Provider 生命周期修复:修复 5 个非 autoDispose provider 重复进入页面不刷新的隐患:
chatMessagesProvider:普通会话进入时主动 reload(原仅稍后读会话 reload)chatAttachmentProvider:进入聊天页时主动loadAttachmentschatSessionProvider:发现页 initState 主动refreshtranslateRecordListProvider/ttsRecordListProvider:插件页 initState 主动refreshreadLaterProvider:稍后读页 initState 主动loadItems(refresh: true)兜底
类型安全巡检(139处修复)
- 根因:PHP/JSON 返回的数字可能被解析为
int或double(num),直接as int/as int?会崩溃(?? 0无法挽救,因为强转在??之前已抛异常) - 修复模式:统一使用
SafeJson.parseInt()(core/utils/safe_json.dart)替代as int/as int? - P0 高风险修复(60处):task_core.dart(10)、daily_task_page.dart(2)、cloud_cache_record.dart(5)、cloud_cache_service.dart(1)、signaling_service.dart(2)、input_action.dart(2)、transfer_task.dart(1)、anonymous_submit_page.dart(2)、interaction_provider.dart(1)、offline_manager.dart(1)、spotlight_search_provider.dart(1)、chat_session_provider.dart(2)、weather_settings_page.dart(1)、poetry_settings_page.dart(1)、theme_sections_preview.dart(3)、image_cache_models.dart(2)、pomodoro_core.dart(1)、image_cache_metadata_service.dart(1)、permission_service.dart(1)、kv_storage.dart(1)、notification_center.dart(6)、solar_term_core.dart(12)
- P1 中风险修复(79处):user_center_models.dart(4)、user_stats_provider.dart(9)、user_center_service.dart(7)、favorite_repository.dart(4)、correction_provider.dart(4)、ctc_api_client.dart(2)、ctc_note_provider.dart(4)、interaction_provider.dart(1)、coin_provider.dart(1)、public_profile_page.dart(1)、learning_progress_page.dart(3)、learning_center_page.dart(7)、statistics_page.dart(14)、leisure_card.dart(2)、wallpaper_health_service.dart(2)、settings_change_logger.dart(1)、cache_config.dart(5)、weather_provider.dart(2)、appbar_date_display.dart(1)、qrcode_scanner_page.dart(1)、user_model.dart(4)
涉及文件
| 模块 | 文件 | 变更类型 |
|---|---|---|
| 新功能弹窗 | new_features_dialog.dart | 重构为图文卡片轮播 |
| 主题色图标 | themed_icon.dart(新) | 新增动态主题色图标组件 |
| 壁纸离线 | wallpaper_gallery_view.dart, wallpaper_source_bar.dart | 离线模式+缓存chip |
| 稍后读持久化 | readlater_provider.dart | 批量已读持久化到DB |
| Provider生命周期 | chat_flow_page.dart, discover_page.dart, translate_plugin_page.dart, tts_plugin_page.dart, readlater_page.dart | initState主动reload |
| 类型安全P0 | 22个文件 | as int → SafeJson.parseInt() |
| 类型安全P1 | 21个文件 | as int? → SafeJson.parseInt() |
[v6.94.0] - 2026-06-19
🔧 批量Bug修复与功能增强(16项)
新功能
- 引导页新功能开关:引导页第三页(个性化设置)新增"了解 V{版本号} 新功能"开关(默认关闭),开启后进入主页弹出当前版本更新日志弹窗,支持动态主题和14种多语言
- 闲情逸致emoji统一替换:将闲情逸致页面(含设置页、聊天气泡、输入面板)约55处emoji替换为CupertinoIcons,保留社交互动(❤️点赞、⭐收藏)和个性化按钮的emoji
Bug修复
- Beta页面问卷按钮:增加右上角可关闭小角标,点击后临时隐藏问卷入口
- Windows分发渠道文案:软件信息页平台兼容卡片点击Windows的toast改为"由Microsoft Store分发"(14种语言同步)
- 稍后读不显示:修复主页卡片详情添加稍后读后,发现-稍后读页面不显示的问题(ChatFlowPage每次进入主动reload + notifyReadlaterRefresh确保执行)
- 情景诗词无响应:修复输入框发送内容页面无变化、收藏与分享按钮无响应(接入诗词刷新+本地DB收藏+ShareSheet分享)
- 日签卡片换一句无响应:添加isRefreshing加载态、错误反馈、空内容检查,接入频道句子切换
- 使用报告数据为空:修复阅读趋势和活跃热力图数据解析(传year参数、多键名兼容、字段名兼容、List包装)
- 阅读目标无变化:重写reading_goal_provider,从本地DB获取今日进度(viewsToday/favoritesToday),添加连续天数更新逻辑
- 灵感朗读音频无关:修复TTS朗读音频与实际内容无关(_mySpokenText文本匹配 + 先stop再speak)
- 壁纸筛选不一致:添加supportsCategory getter区分源是否支持分类筛选,客户端二次过滤确保结果一致
- 取消收藏数据仍在:增强setFavoriteFlagForTarget第三种匹配策略(feedType+ID后缀),mergeWithLocalDb改为追加尾部
- 密保问题设置失败:修复_parseSecQuestion类型安全(int vs num),添加_toSafeInt安全转换,refreshUser错误处理增强
涉及文件
| 模块 | 文件 | 变更类型 |
|---|---|---|
| Beta页面 | experimental_features_page.dart | 添加关闭角标 |
| 引导页 | onboarding_provider.dart, personalization_page.dart, t_onboarding.dart | 新功能开关 |
| 引导页弹窗 | new_features_dialog.dart(新), home_page.dart, kv_storage.dart | 弹窗+触发逻辑 |
| 闲情逸致 | 21个chat相关文件 | emoji→CupertinoIcons |
| 稍后读 | chat_flow_page.dart, home_interaction_mixin.dart | reload+通知修复 |
| 情景诗词 | poetry_page.dart | 发送/收藏/分享实现 |
| 日签卡片 | daily_card_provider.dart, daily_card_page.dart | 加载态+错误反馈 |
| 使用报告 | reading_report_core.dart | 数据解析修复 |
| 阅读目标 | reading_goal_provider.dart | 完全重写 |
| 灵感TTS | inspiration_detail_sheet.dart | 文本匹配修复 |
| 壁纸 | template_models.dart, wallpaper_gallery_view.dart | 分类筛选修复 |
| 收藏 | app_database.dart, favorite_repository.dart | 匹配策略增强 |
| 密保 | user_model.dart, security_question_page.dart | 类型安全修复 |
| 多语言 | 14个语言文件 | Windows文案+knowNewFeatures |
[v6.93.1] - 2026-06-19
🔧 MethodChannel 命名风格统一
将所有自定义 MethodChannel/EventChannel 名称统一为 apps.xy.xianyan/{feature} 风格,与应用包名 apps.xy.xianyan 保持一致。
变更清单
| 旧名称 | 新名称 | 涉及文件 |
|---|---|---|
com.xianyan.macos |
apps.xy.xianyan/macos |
macos_platform_service.dart + MainFlutterWindow.swift |
com.xianyan.macos.app |
apps.xy.xianyan/macos.app |
macos_platform_service.dart + AppDelegate.swift |
com.xianyan.windows |
apps.xy.xianyan/windows |
windows_platform_service.dart + flutter_window.cpp |
com.xianyan.clipboard |
apps.xy.xianyan/clipboard |
clipboard_bridge.dart |
xianyan/usb_transport |
apps.xy.xianyan/usb_transport |
usb_transport_service.dart |
xianyan/usb_events |
apps.xy.xianyan/usb_events |
usb_discovery_service.dart |
com.xianyan.touchbar.* |
apps.xy.xianyan.touchbar.* |
MainFlutterWindow.swift (NSTouchBar 标识符) |
不变项
- Android 通道
apps.xy.xianyan/{feature}— 已是正确风格 - 鸿蒙通道
plugins.flutter.io/{plugin}_ohos— 模拟 Flutter 标准插件,保持不变
影响
- 功能无影响:MethodChannel 名称只需 Dart 端与原生端一致即可
- 可维护性提升:消除 4 种命名风格混用,统一为
apps.xy.xianyan/{feature}
[v6.93.0] - 2026-06-19
🖥️ 桌面端原生功能扩展(第二批)
剪贴板富文本(HTML)支持
lib/core/utils/platform/clipboard_bridge.dart新增setRichText({text, html})/getHtml()/hasHtml()三个方法- 桌面端通过
com.xianyan.clipboardMethodChannel 调用原生 NSPasteboard/CF_HTML - 移动端/Web 降级为纯文本(
_htmlToPlainText工具方法去除标签+反转义实体) - 鸿蒙端仅支持纯文本,HTML 读写返回 null/false
- 保持隐私协议守卫(读操作需同意协议)
侧边栏折叠记忆
SplitViewState新增navBarCollapsed(bool) /navBarWidth(double) /tabSplitRatios(Map<int,double>) 三个字段SplitViewNotifier新增setNavBarCollapsed/toggleNavBarCollapsed/setNavBarWidth/saveCurrentTabSplitRatio/setCurrentTabWithMemory方法adaptive_nav_bar.dart垂直导航栏支持折叠态(48px 仅图标)/ 展开态(72px 图标+文字),底部新增折叠按钮- 折叠状态持久化到 KvStorage(
nav_bar_collapsed/workbench_nav_bar_width)
分屏记忆
- 每个 Tab 独立分屏比例,切换 Tab 时自动保存当前比例并恢复目标 Tab 比例
tabSplitRatios以 JSON 序列化存储到tab_split_ratioskeysetCurrentTabWithMemory(index)方法实现保存+恢复逻辑
可拖拽导航栏宽度
workbench_layout.dart的_navBarWidth()改为从splitViewProvider读取动态宽度- 折叠态 48px / 展开态使用持久化的
navBarWidth(默认 72px,范围 48~240px) _assembleLayout垂直导航栏 SizedBox 改用动态宽度
Windows Mica Alt 特效
windows_acrylic_service.dart新增_isMicaAltSupported()方法,检测 Win11 build >= 22621applyEffect新增 Mica Alt 分支(优先级:Mica Alt → Mica → Acrylic,自动降级)- 使用
WindowEffect.tabbed作为 Mica Alt 等价实现(flutter_acrylic 1.1.4 的最接近选项) effectNamegetter 新增windows_mica_alt标识- buildNumber 检测结果缓存,避免重复读取
Spec 文档
- 新增
docs/desktop_native_expansion_spec.md(14 项功能实施方案,开发完成后删除)
[v6.92.0] - 2026-06-19
🍎 macOS 原生功能扩展(5 项)
Touch Bar 支持(NSTouchBar)
MainFlutterWindow.swift新增setTouchBarItems方法,创建 NSTouchBar + NSButton 项- 按钮点击通过
channel.invokeMethod("touchBarAction", action)回调 Dart - 仅带 Touch Bar 的 MacBook 显示,无 Touch Bar 设备自动忽略
MainFlutterWindow实现NSTouchBarDelegate,按索引创建按钮
NSSharingService 共享面板
MainFlutterWindow.swift新增showShareSheet方法,弹出 NSSharingServicePicker- 支持 text/url/imageBytes 三种内容类型组合
- 图片通过
FlutterStandardTypedData→NSImage转换
NSDockTile 徽章
AppDelegate.swift新增setDockBadge方法,设置 Dock 图标数字徽章- count <= 0 时清除徽章
NSStatusItem 菜单栏金句
AppDelegate.swift新增updateStatusBarSentence方法,菜单栏显示金句- 超过 30 字符截断显示,前缀 💬 emoji
- 点击金句复制完整内容到剪贴板(
currentSentence属性存储完整内容) statusItem强引用持有,防止被释放
CoreSpotlight 索引
AppDelegate.swift新增indexSpotlightItems/clearSpotlightIndex方法- 使用
CSSearchableIndex.default()索引条目(id/title/content/type) - 沙盒内可直接使用,无需额外 entitlements
- 异步操作,不阻塞 UI
应用级通道架构
- 新增
com.xianyan.macos.appMethodChannel(AppDelegate 注册) applicationShouldTerminateAfterLastWindowClosed改为false,支持托盘常驻MacosPlatformService新增_appChannel常量 + 6 个静态方法
[v6.91.2] - 2026-06-19
🔗 深度链接服务完善 — xianyan:// scheme 跳转
lib/core/services/network/deep_link_service.dart新增_preResolve预解析方法,处理需要特殊路由映射的 scheme:xianyan://note/{id}→/notes/edit?id={id}(笔记编辑页用 query param,无法通过配置驱动解析器的子路径匹配处理)xianyan://note→/notes(笔记列表页)xianyan://sentence/{id}→/home(句子详情 Sheet 需 HomeSentence 对象,暂导航到首页)
lib/core/router/route_registry.dart稍后阅读路由新增xianyan://readlater别名macos/Runner/Info.plist新增CFBundleURLTypes注册xianyanURL Scheme(此前 macOS 端未注册)ios/Runner/Info.plist在现有CFBundleURLSchemes数组中追加xianyanscheme(此前仅注册 ShareExtension)- Android 端
AndroidManifest.xml已有xianyanscheme intent-filter,无需修改 DeepLinkService.init()已在main.dart:236调用,无需重复初始化
[v6.91.1] - 2026-06-19
📝 笔记编辑页 — 桌面端拖拽文件接入
- 笔记编辑页(
lib/features/note/presentation/note_edit_page.dart)接入desktop_drop,桌面端(pu.isDesktop)支持拖拽文件到笔记 - 拖拽视觉反馈:半透明遮罩 + 虚线边框(
_DashedBorderPainter)+ "拖放文件到笔记"提示,AnimatedContainer200ms 过渡,Positioned.fill+IgnorePointer不阻挡正常操作 - 文件处理逻辑(
_handleDrop):- 图片(.png/.jpg/.jpeg/.gif/.webp):读取为 base64,插入 Markdown 图片语法
 - 文本(.txt/.md):读取内容追加到笔记末尾
- 其他文件:插入 Markdown 链接
[文件名](file:///路径)
- 图片(.png/.jpg/.jpeg/.gif/.webp):读取为 base64,插入 Markdown 图片语法
- 错误处理:读取失败时
AppToast.showError提示 - 移动端不包裹
DropTarget,不影响现有自动保存/Markdown 预览功能
[v6.91.0] - 2026-06-18
📦 依赖同步修复
pubspec.ohos.yaml补齐tray_manager/macos_window_utils/flutter_acrylic三库声明- 原因:Dart 编译时静态解析 import 链(
app.dart→desktop_service_registry.dart→ 实现文件 → 三库),鸿蒙端虽 no-op 但必须声明,否则报Target of URI doesn't exist iOS_macOS_Developer_Guide.md§5.5 新增特殊案例说明 + §5.6 新增常见问题条目
🖥️ 桌面端原生增强(macOS/Windows)
系统托盘(tray_manager)
- 跨平台系统托盘服务:图标 + Tooltip + 未读角标 + 右键菜单
- 托盘右键菜单 4 组分隔线分组:主操作/快速访问(最近阅读子菜单)/模式切换/系统
- 未读角标:合并稍后阅读 + 每日拾句未读数,macOS setTitle 数字显示
- 每日拾句未读概念:DailySentenceViewedService 本地存储已查看 id 列表
- 托盘事件处理:单击切换窗口可见性、双击聚焦、右键弹出菜单
- 托盘图标:自绘 SVG + Pillow 生成 PNG(浅色/深色两套,16x16/32x32)
- 多语言支持:TrayMenuLabels(zhCN/enUS)
macOS 原生菜单栏(PlatformMenuBar)
- MacosMenuBarWrapper:6 个顶级菜单(闲言/文件/编辑/视图/窗口/帮助)
- 业务功能入口:新建笔记/灵感、打开稍后阅读、偏好设置、每日拾句
- 模式切换:深色模式、工作台模式(带勾选状态)
- 系统标准项:关于/隐藏/退出/全屏/最小化/缩放(PlatformProvidedMenuItem)
自定义窗口标题栏(软件样式)
- DesktopWindowTitleBar:替代系统默认标题栏,支持动态主题+动态样式
- macOS 风格:左侧红黄绿三圆点按钮(hover 显示图标)
- Windows 风格:右侧最小化/最大化/关闭方按钮(hover 背景变化)
- 毛玻璃效果(BackdropFilter)、双击最大化/还原、拖拽移动窗口
- DesktopTitleBarStyle:动态样式配置(高度/透明度/模糊/按钮大小等)
- main.dart:titleBarStyle: TitleBarStyle.hidden 隐藏系统标题栏
- macOS 原生:titlebarAppearsTransparent=true + 隐藏系统红黄绿按钮
Windows 原生侧能力补齐(6 个 MethodChannel 方法)
- setWindowTitle:SetWindowTextW 设置窗口标题
- setFullscreen/isFullscreen:保存/恢复窗口 RECT+样式,全屏切换
- setMinSize:WM_GETMINMAXINFO 处理最小尺寸限制(DPI 缩放)
- performHapticFeedback:MessageBeep 模拟触觉反馈(4 种类型)
- getSystemAppearance:读取注册表 AppsUseLightTheme
窗口特效(毛玻璃/亚克力)
- macOS:MacosWindowEffectService 标题栏融合 + 侧边栏毛玻璃(NSVisualEffectView sidebar 材质)
- Windows 11:WindowsAcrylicService Mica 背景
- Windows 10:Acrylic 效果(深色 0xCC1F1F1F / 浅色 0xCCF3F3F3)
- Win11 版本检测:解析 operatingSystemVersion(build>=22000)
- 主题切换时同步窗口特效(build + didChangePlatformBrightness)
动态主题
- 窗口特效随主题变化:DesktopWindowEffectService.applyEffect(isDark)
- 托盘图标随主题变化:macOS isTemplate 自动反色,Windows 明暗两套图标
- 标题栏随主题变化:深色/浅色/AMOLED 三种背景色
依赖变更
- 新增:tray_manager ^0.5.3 / macos_window_utils ^1.9.1 / flutter_acrylic ^1.1.4
- 移除:nearby_connections ^4.1.1(三处模板同步:pubspec.yaml/pubspec.ohos.yaml/pubspec.macos.yaml)
新增文件
| 文件 | 作用 |
|---|---|
lib/core/services/desktop/desktop_tray_service.dart |
托盘服务抽象 + TrayMenuItem 模型 |
lib/core/services/desktop/desktop_window_effect_service.dart |
窗口特效服务抽象 |
lib/core/services/desktop/desktop_service_registry.dart |
服务注册表(按平台注入实现) |
lib/core/services/desktop/desktop_tray_menu_builder.dart |
托盘菜单构建器(4 组分隔线分组) |
lib/core/services/desktop/daily_sentence_viewed_service.dart |
每日拾句已查看服务 |
lib/core/services/desktop/implementations/tray_manager_tray_service.dart |
tray_manager 托盘服务实现 |
lib/core/services/desktop/implementations/macos_window_effect_service.dart |
macOS 窗口特效实现 |
lib/core/services/desktop/implementations/windows_acrylic_service.dart |
Windows Acrylic/Mica 实现 |
lib/features/desktop/desktop_tray_controller.dart |
托盘控制器(整合服务+菜单+未读数) |
lib/features/desktop/macos_menu_bar_wrapper.dart |
macOS 原生菜单栏包装器 |
lib/features/desktop/desktop_window_title_bar.dart |
自定义窗口标题栏 Widget |
lib/features/home/presentation/providers/readlater/tray_unread_count_provider.dart |
托盘未读数 Provider |
assets/svgs/tray_icon.svg |
托盘图标 SVG 源文件 |
scripts/generate_tray_icons.py |
托盘图标 PNG 生成脚本 |
修改文件
| 文件 | 变更 |
|---|---|
lib/main.dart |
新增 titleBarStyle: TitleBarStyle.hidden |
lib/app/app.dart |
初始化桌面服务、窗口特效、托盘控制器、MacosMenuBarWrapper、主题同步 |
lib/app/layout/app_shell.dart |
集成 DesktopWindowTitleBar |
lib/core/services/device/windows_platform_service.dart |
新增 6 个 MethodChannel 方法 |
macos/Runner/MainFlutterWindow.swift |
titlebarAppearsTransparent=true + 隐藏系统按钮 |
windows/runner/win32_window.h |
新增 6 个方法声明 + 全屏状态成员变量 |
windows/runner/win32_window.cpp |
实现 6 个方法 + WM_GETMINMAXINFO |
windows/runner/flutter_window.cpp |
扩展 MethodChannel 处理 6 个方法 |
pubspec.yaml/pubspec.ohos.yaml/pubspec.macos.yaml |
新增 3 库 + 移除 nearby_connections |
工作台设置页(P0-8)
- 新增独立页面
WorkbenchSettingsPage:整合 4 项迁移设置 + 7 项交互/视觉增强 - 迁移项:工作台模式开关、分屏开关、导航栏位置、分屏比例
- 新增交互增强(持久化):专注阅读模式、右栏分屏、拖拽出窗(占位)、右栏标签页(占位)、中栏拖拽排序
- 新增视觉增强(持久化):工作台毛玻璃背景、空状态动画
SplitViewState扩展 7 个 freezed 字段 + 对应 setter(KvStorage 持久化)- 通用设置"显示"组:移除 4 项迁移项,新增"工作台模式"导航入口
- 路由注册:
AppRoutes.workbenchSettings+route_registry.dart+ deepLinkxianyan://settings/workbench
| 文件 | 变更 |
|---|---|
lib/features/settings/presentation/workbench/workbench_settings_page.dart |
新增工作台设置页(4 组设置 + 私有组件) |
lib/core/router/app_routes.dart |
新增 workbenchSettings 路由常量 |
lib/core/router/route_registry.dart |
注册 workbench-settings 路由 |
lib/core/providers/split_view_provider.dart |
扩展 7 个交互增强字段 + setter |
lib/core/providers/split_view_provider.freezed.dart |
同步 freezed 生成代码 |
lib/features/settings/presentation/general/general_settings_sections.dart |
移除 4 项迁移项 + 新增导航项 |
lib/features/settings/presentation/general/general_settings_page.dart |
_onNavigate 新增 workbench_settings case |
v6.90.1 及更早版本(v6.87.0 ~ v6.90.1)已归档至软件特性功能文档。 主要特性概览:
- v6.90.1: 工作台模式多语言支持 + 中栏宽度 KvStorage 持久化
- v6.90.0: PC工作台布局重构(微信PC式三栏 WorkbenchLayout + RightPanelStackNotifier + 路由拦截)
- v6.89.1: macOS MissingPluginException 修复 + Expanded 布局错误修复
- v6.89.0: 评分弹窗商店名称多语言 + Beta问卷按钮隐藏跨平台修复
- v6.88.0: 闲情逸致价格档位扩展(6档)+ 纠错历史本地缓存(drift)+ 学习计划详情页 + 闲情逸致全模块多语言
- v6.87.0: 多平台应用商店统一服务(AppStoreService)+ 学习计划重构预告 + 闲情逸致"免费"改"平价" + 纠错页全面多语言