# Changelog 所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。 *** ## [v6.10.0] - 2026-06-02 ### 🏗️ 架构优化 + 灵动岛增强 + Lint规则 + 应用图标 **1. MacosPlatformService 统一 🏗️:** - 🔄 分散在多文件的 MethodChannel 统一为 `MacosPlatformService` - 🔄 通道名 `com.xianyan.theme` → `com.xianyan.macos` - 🔄 `MacosTitleBarService` 标记 @Deprecated,桥接到新服务 - ✅ Swift 端扩展为 10 个方法处理器(主题/窗口/标题栏/全屏/触觉等) **2. 二维码 WebSocket 长连接推送 🌐:** - ✅ 新增 `QrcodeWsService` — WebSocket 推送服务(心跳25秒/指数退避重连) - ✅ `QrcodeLoginProvider` 重构为双通道架构(WS优先 + HTTP轮询降级) - ✅ 新增 `qrcode_ws_relay.dart` — shelf_web_socket 中继服务器 - ✅ PHP 后端 `_notifyWsRelay()` — cURL 通知 WS 中继 **3. RSS 全文阅读增强 📖:** - ✅ `RssService.fetchFullText()` — 简易 Readability 算法 - ✅ `RssReaderPage` 阅读模式 — 全文内容 + 图片画廊 - ✅ `RssFullTextResult` 数据类 **4. 灵动岛增强 — 倒计时聚焦模式 ⏰:** - ✅ `LiveActivityService` — 新增 `startCountdownActivity/updateCountdownActivity/endCountdownActivity` - ✅ `CountdownNotifier` — 集成灵动岛聚焦模式(focusEvent/unfocusEvent) - ✅ `LiveActivityProvider` — 补充 `updateCountdownActivity/endCountdownActivity` - ✅ `CountdownPage` UI — 灵动岛聚焦横幅 + 卡片铃铛按钮 + 操作菜单 - ✅ `_activeType` 跟踪 — 类型切换时自动结束旧活动 **5. 自定义 Lint 规则 📏:** - ✅ 新增 `tools/xianyan_lint/` 自定义 lint 包 - ✅ `double_angle_brackets` — 检测双书名号《《 - ✅ `hardcoded_color` — 检测非主题系统硬编码颜色 - ✅ `hardcoded_chinese` — 检测UI层硬编码中文(默认关闭) - ✅ `analysis_options.yaml` — 新增 custom_lint 规则配置 **6. 应用图标和名称 🎨:** - ✅ iOS/macOS 应用名称改为中文「闲言」 - ✅ iOS `CFBundleDisplayName` → 闲言 - ✅ macOS 新增 `CFBundleDisplayName` → 闲言 - ✅ 全平台图标更新(从 `assets/templates/resized/` 复制) - ✅ iOS 小组件图标补全 - ✅ Web 图标更新 **修改文件** - `lib/core/services/device/macos_platform_service.dart` — 新建统一服务 - `lib/core/services/ui/macos_title_bar_service.dart` — @Deprecated桥接 - `macos/Runner/MainFlutterWindow.swift` — 统一通道+10方法 - `lib/app/app.dart` — 引用新服务 - `lib/features/auth/services/qrcode_ws_service.dart` — 新建WS服务 - `lib/features/auth/providers/qrcode_login_provider.dart` — 双通道重构 - `docs/toolsapi/scripts/qrcode_ws_relay.dart` — 新建WS中继 - `docs/toolsapi/application/api/controller/UserSecurity.php` — WS通知 - `lib/features/discover/services/rss_service.dart` — 全文提取 - `lib/features/discover/presentation/pages/tool/rss_reader_page.dart` — 阅读模式 - `lib/core/services/device/live_activity_service.dart` — 倒计时活动 - `lib/core/services/device/live_activity_provider.dart` — 补充方法 - `lib/features/countdown/providers/countdown_provider.dart` — 灵动岛集成 - `lib/features/countdown/presentation/countdown_page.dart` — 灵动岛UI - `tools/xianyan_lint/` — 新建自定义lint包 - `analysis_options.yaml` — lint规则配置 - `pubspec.yaml` — 新增xianyan_lint依赖 - `ios/Runner/Info.plist` — 中文名称 - `macos/Runner/Info.plist` — 中文名称+CFBundleDisplayName - `ios/Runner/Assets.xcassets/AppIcon.appiconset/` — 图标更新 - `macos/Runner/Assets.xcassets/AppIcon.appiconset/` — 图标更新 - `ios/XianyanWidget/Assets.xcassets/AppIcon.appiconset/` — 小组件图标 - `web/icons/` — Web图标更新 *** ## [v6.9.51] - 2026-06-01 ### 🔧 修复 MacBook Pro 端 iOS/macOS 构建报错 **背景:** MacBook Pro 端 `flutter build macos` 和 `flutter build ios --no-codesign` 均失败,根因是 win32 版本冲突和 Swift 兼容性问题。 **1. 修复 macOS 构建:win32 6.x 版本冲突 🔧:** - 🔧 `pubspec.yaml` — `file_picker: ^11.0.0` 升级为 `file_picker: ^12.0.0-beta.5`(12.x 兼容 win32 6.x) - 🔧 `pub cache` 补丁 — `quill_native_bridge_windows 0.0.2` 的 win32 5.x API 迁移到 6.x: - `OpenClipboard(NULL) == FALSE` → `OpenClipboard(null).error.isError` - `CloseClipboard()` / `EmptyClipboard()` / `IsClipboardFormatAvailable()` → `Win32Result` 检查 - `GetClipboardData()` → `Win32Result`,HANDLE → HGLOBAL 类型转换 - `GlobalAlloc` / `GlobalLock` / `GlobalUnlock` / `GlobalFree` → `Win32Result` 检查 - `SetClipboardData(id, handle.address)` → `SetClipboardData(id, HANDLE(handle))` - `TEXT('ms-photos:')` → `'ms-photos:'.toPcwstr()` - `RegisterClipboardFormat` → `Win32Result` 检查 - `ShellExecute(NULL, ...)` → `ShellExecute(null, ...)`,`nullptr` → `null`(PCWSTR? 类型兼容) **2. 修复 iOS 构建:flutter_vibrate Swift 编译错误 🔧:** - 🔧 `pub cache` 补丁 — `SwiftVibratePlugin.swift` 中 `TARGET_OS_SIMULATOR` 在 Xcode 16+/Swift 6 中不可用 - `private let isDevice = TARGET_OS_SIMULATOR == 0` → `#if targetEnvironment(simulator)` 条件编译 **3. iOS 构建缓存清理 🧹:** - 🧹 `flutter clean` + 重新 `flutter build ios --no-codesign` 解决 `FilePickerPlugin` 模块冲突(缓存残留) **构建验证:** - ✅ `flutter build macos` — 成功 (200.5MB) - ✅ `flutter build ios --no-codesign` — 成功 (102.6MB) **⚠️ pub cache 补丁说明:** - `quill_native_bridge_windows` 和 `flutter_vibrate` 的补丁位于 `~/.pub-cache/` 中 - `flutter clean` 或 `flutter pub cache repair` 后需重新应用补丁 - 补丁脚本和详细说明见 `iOS_macOS_Developer_Guide.md` §2.6 **修改文件** - `pubspec.yaml` — file_picker 升级到 12.x - `iOS_macOS_Developer_Guide.md` — 新增 §2.6 pub cache 补丁说明 **pub cache 补丁文件(不在项目仓库中)** - `~/.pub-cache/hosted/pub.dev/quill_native_bridge_windows-0.0.2/lib/quill_native_bridge_windows.dart` - `~/.pub-cache/hosted/pub.dev/quill_native_bridge_windows-0.0.2/lib/src/clipboard_html_format.dart` - `~/.pub-cache/git/fluttertpc_flutter_vibrate-*/ios/Classes/SwiftVibratePlugin.swift` *** ### 🖥️ MacBook Pro 端 bitsdojo_window → window_manager 迁移 **依赖变更:** - 🔄 `bitsdojo_window ^0.1.6` → `window_manager ^0.5.1` 桌面端窗口管理库替换 - 🔄 `pubspec.yaml` 所有本地包引用(`path: packages/xxx`)替换为远程版本号(MacBook Pro 端适配) - 🔄 `dependency_overrides` 精简为仅保留版本号覆盖(移除所有 `path: packages/xxx` 条目) **代码迁移:** - 🔧 `lib/main.dart` — `doWhenWindowReady` + `appWindow` → `windowManager.ensureInitialized()` + `WindowOptions` + `waitUntilReadyToShow` - 🔧 `lib/core/layout/adaptive_nav_bar.dart` — `WindowTitleBarBox` + `MoveWindow` → `GestureDetector` + `windowManager.startDragging()`;`appWindow.minimize/maximizeOrRestore/close` → `windowManager.minimize/maximize/unmaximize/close` **文档更新:** - 📝 `iOS_macOS_Developer_Guide.md` v5 — 标记 bitsdojo_window 迁移完成 **修改文件** - `pubspec.yaml` - `lib/main.dart` - `lib/core/layout/adaptive_nav_bar.dart` - `iOS_macOS_Developer_Guide.md` *** ## [v6.9.49] - 2026-06-01 ### 🌐 6页面全量多语言支持(14种语言) **新增翻译模块:** - 📁 `t_account_settings.dart` — 账户设置页面翻译(18个key) - 📁 `t_data_management.dart` — 数据管理页面翻译(33个key) - 📁 `t_source.dart` — 句子来源页面翻译(40个key) - 📁 `t_favorites.dart` — 我的收藏页面翻译(68个key) - 📁 `t_offline.dart` — 离线模式页面翻译(67个key) **多语言替换页面:** - 🌐 `account_settings_page.dart` — 账户设置(19处硬编码→t.accountSettings.xxx) - 🌐 `data_management_page.dart` — 数据管理(33处硬编码→t.dataManagement.xxx) - 🌐 `source_page.dart` — 句子来源(36处硬编码→t.source.xxx) - 🌐 `favorite_page.dart` — 我的收藏(55处硬编码→t.favorites.xxx) - 🌐 `offline_page.dart` — 离线模式(46处硬编码→t.offline.xxx) - 🌐 `profile_page.dart` — 个人中心(修复废弃getter类型冲突) **语言文件更新(14种):** - zh_CN / en / zh_TW / ja / ko / fr / de / es / ru / it / pt / ar / bn / hi **基础设施修复:** - 🔧 `t_root.dart` — 删除与新字段冲突的废弃getter(accountSettings/offlineMode) - 🔧 `translation_io_service.dart` — 补全5个新模块的fallback参数 - 🔧 `profile_page.dart` / `general_settings_page.dart` — 修复t.dataManagement类型错误(String→TDataManagement) **修改文件** - `lib/l10n/types/t_account_settings.dart` — 新建 - `lib/l10n/types/t_data_management.dart` — 新建 - `lib/l10n/types/t_source.dart` — 新建 - `lib/l10n/types/t_favorites.dart` — 新建 - `lib/l10n/types/t_offline.dart` — 新建 - `lib/l10n/types/t_root.dart` — 注册5个新模块 - `lib/l10n/types/t.dart` — 导出5个新模块 - `lib/l10n/languages/*.dart` — 14个语言文件更新 - `lib/l10n/translation_io_service.dart` — 补全参数 - `lib/features/mine/settings/presentation/account/account_settings_page.dart` - `lib/features/mine/settings/presentation/data_management_page.dart` - `lib/features/source/presentation/source_page.dart` - `lib/features/home/presentation/favorite_page.dart` - `lib/features/home/presentation/providers/offline_page.dart` - `lib/features/mine/profile/presentation/profile_page.dart` - `lib/features/mine/settings/presentation/general/general_settings_page.dart` *** ## [v6.9.48] - 2026-06-01 ### 🏗️ 句子详情面板深度重构(15项改进实施) **架构重构:** - 🏗️ 新增 `sentence_detail_provider.dart` — Riverpod Notifier 管理详情/TTS/推荐状态,消除 prop drilling - 🏗️ `sentence_detail_content.dart` 改为 ConsumerWidget,通过 `ref.watch(sentenceDetailProvider)` 读取状态 - 🏗️ `sentence_detail_actions.dart` 删除 `showTtsPlayer/onToggleTts/feedId/targetType/onClosePanel` 参数,改用 Provider + FeedIdUtils 计算 - 📁 新增 `sentence_detail_related.dart` — 相关推荐组件(骨架屏加载态 + 推荐卡片列表 + 点击导航) - 🔑 新增 `detailCardKeyProvider` — RepaintBoundary 截图 Key,用于分享图片 **Bug 修复:** - 🐛 修复点赞 Toast 反转 Bug:`sentence.isLiked` 先保存 `wasLiked` 再调用 `toggleLike`,Toast 消息与实际操作一致 - 🐛 收藏 Toast 同步修复:`wasFavorited` 先保存再 `toggleFavorite` **新功能:** - ✨ TTS 播放器增加关闭按钮(Stack + Positioned 圆形 X 按钮,点击停止朗读并隐藏播放器) - ✨ 相关推荐功能:调用 `FeedService.fetchRelatedRecommend` 展示同类型内容,含骨架屏加载态 - ✨ 句子卡片分享图片:RepaintBoundary 截图 → PNG → share_plus 系统分享,失败降级为文本分享 - ✨ 加载失败重试 UI:错误状态显示重试按钮,调用 Provider `retryLoad` 方法 **UI/UX 增强:** - 🎨 AnimatedSwitcher 包裹句子卡片,加载→内容→错误状态平滑过渡 - 🎨 AnimatedSize 包裹 TTS 播放器,展开/收起动画 - 🎨 相关推荐区域 AnimatedOpacity 淡入效果 - 🎨 深色/浅色主题差异化:句子卡片渐变 alpha、作者行渐变色跟随主题 - ♿ Semantics 无障碍:图片 `semanticsLabel`、SelectableText `semanticsLabel` **代码质量:** - 🧹 硬编码间距收敛:`SizedBox(width: 8)` → `AppSpacing.sm`,`SizedBox(height: 4)` → `AppSpacing.xs` 等 - 🧹 删除 `_showTagDialog` 未使用方法 - 🧹 `feed_model.dart` import 清理 **修改文件** - `lib/features/home/presentation/panels/sentence_detail_provider.dart` — 新建 - `lib/features/home/presentation/panels/sentence_detail_related.dart` — 新建 - `lib/features/home/presentation/panels/sentence_detail_panel.dart` — 重构 - `lib/features/home/presentation/panels/sentence_detail_content.dart` — 重构 - `lib/features/home/presentation/panels/sentence_detail_actions.dart` — 重构 *** ## [v6.9.47] - 2026-06-01 ### 🏗️ 句子详情面板文件拆分重构 **变更说明:** - 🏗️ `sentence_detail_panel.dart`(1252行)拆分为3个文件,每个文件职责单一 - 📁 `sentence_detail_panel.dart`(267行)— 主面板协调器:状态管理、DragTarget拖拽、数据加载、面板头部 - 📁 `sentence_detail_content.dart`(~480行)— 内容展示:来源行、统计标签、句子卡片、图片预览、作者行、摘要框、HTML原文框、全屏图片查看器 - 📁 `sentence_detail_actions.dart`(~380行)— 操作按钮:快捷操作、二级操作、主要操作、危险操作、对话框、面板操作按钮组件 **重构优化:** - ✅ `_closePanel()` 方法提取,供面板头部和危险操作共用 - ✅ `_hasImage()` / `_hasHtmlContent()` 改为 getter,语义更清晰 - ✅ `_buildPanelHeader` 签名简化,移除未使用的 `context` 参数 - ✅ `feedId` / `targetType` 预计算传递,避免重复计算 - ✅ 移除不必要的 `material.dart` 导入 - ✅ Dart analyze 零问题通过 **修改文件** - `lib/features/home/presentation/panels/sentence_detail_panel.dart` — 精简为协调器 - `lib/features/home/presentation/panels/sentence_detail_content.dart` — 新建,内容展示 - `lib/features/home/presentation/panels/sentence_detail_actions.dart` — 新建,操作按钮 *** ## [v6.9.46] - 2026-06-01 ### 🐛 修复多项运行时报错 **1. 修复 QuickActions 设置快捷方式 PlatformException 🐛:** - 🐛 `quick_actions_service.dart` — `setShortcutItems()` 未 await 且无 try-catch,Android 端不支持时抛出 `PlatformException` 未被捕获 - ✅ 改为 `await` + `try-catch`,`PlatformException` 降级为 `Log.w` 警告日志 **2. 修复点击老用户登录按钮 SegmentedControl 断言失败 🐛:** - 🐛 `login_page.dart` — 从分段控制器移除 legacy tab 后,`_loginMode=legacy` 导致 `groupValue` 不在 `children.keys` 中 - ✅ 新增 `_segmentMode` 变量独立跟踪分段控制器选中值,legacy 模式不影响分段控制器显示 **3. 优化今日诗词 SDK 网络错误日志级别 📝:** - 📝 `jinrishici_sdk_service.dart` — `DioException` 从 `Log.e` 降级为 `Log.w`,网络中断不再显示为严重错误 - 📝 非200状态码补充 `Log.w` 日志 **修改文件** - `lib/core/services/device/quick_actions_service.dart` - `lib/features/auth/presentation/login_page.dart` - `lib/core/services/data/jinrishici_sdk_service.dart` *** ## [v6.9.45] - 2026-06-01 ### 🐛 修复主页下拉provider修改报错 & 去除按钮emoji **1. 修复主页下拉时 "Tried to modify a provider while the widget tree was building" 报错 🐛:** - 🐛 `home_tool_center.dart` — `_FloatingPanelState.initState()` 中同步调用 `refreshFromService()` 修改 provider state,改为 `Future(() {...})` 延迟执行 - 🐛 `home_sentence_list_section.dart` — `SliverChildBuilderDelegate` builder 中直接调用 `onLoadMore()` 和 `onCheckPreload()`,改为 `Future(() {...})` 延迟执行,避免在 build 阶段修改 provider **2. 去除创作卡片和编辑此句按钮左侧 emoji 🧹:** - 🧹 `home_action_buttons.dart` — 移除创作卡片 🎨 和编辑此句 📝 emoji - 🧹 `sentence_detail_sheet.dart` — 移除创作卡片 🎨 emoji - 🧹 `sentence_detail_panel.dart` — 移除编辑此句 ✏️ emoji **修改文件** - `lib/features/home/presentation/home_tool_center.dart` - `lib/features/home/presentation/widgets/home_sentence_list_section.dart` - `lib/features/home/presentation/widgets/home_action_buttons.dart` - `lib/features/home/presentation/providers/sentence_detail_sheet.dart` - `lib/features/home/presentation/panels/sentence_detail_panel.dart` *** ## [v6.9.44] - 2026-06-01 ### 🔄 登录页面:老用户登录按钮替换微信登录位置 **变更说明:** - 🔄 将微信登录按钮替换为老用户登录按钮,放置在社交登录区域 - 🎨 老用户登录按钮使用次要色(secondary color #FF6B6B)显示,与主色调形成视觉区分 - ✅ 点击老用户登录按钮可正常切换到老用户登录子页面 - 🧹 从分段控制器(SegmentedControl)中移除老用户登录 tab,避免重复入口 - 🛠️ `_buildSocialButton` 方法新增 `accentColor` 参数,支持自定义强调色 **修改文件** - `lib/features/auth/presentation/login_page.dart` — 替换微信按钮为老用户按钮,移除分段控制legacy tab,扩展_buildSocialButton *** ## [v6.9.43] - 2026-06-01 ### 🔧 修复鸿蒙端资源键名冲突与未定义引用 **背景:** 鸿蒙端编译时多个 HAR 包定义了相同的 string 资源键名(`page_show`、`module_desc`),导致 `CompileResource` 失败。同时部分包引用了未定义的 string 资源(`nfc_tag_reason`、`wifi_info_reason` 等),以及声明了系统级权限导致安装失败。 **1. 修复 `page_show` 键名冲突 🔧:** - 🔧 `connectivity_plus` → `connectivity_plus_page_show` - 🔧 `device_info_plus` → `device_info_plus_page_show` - 🔧 `flutter_local_notifications` → `flutter_local_notifications_page_show` - 🔧 `flutter_webrtc` → `flutter_webrtc_page_show` - 🔧 `local_auth_ohos` → `local_auth_ohos_page_show` - 🔧 `mobile_scanner` → `mobile_scanner_page_show` - 🔧 `package_info_plus` → `package_info_plus_page_show` **2. 修复 `module_desc` 键名冲突 🔧:** - 🔧 `gal` → `gal_module_desc` - 🔧 `live_activities` → `live_activities_module_desc` - 🔧 `network_info_plus_ohos` → `network_info_plus_ohos_module_desc`(同步更新 module.json5 引用) - 🔧 `permission_handler_ohos` → `permission_handler_ohos_module_desc` - 🔧 `speech_to_text` → `speech_to_text_module_desc` - 🔧 `workmanager_ohos` → `workmanager_ohos_module_desc` **3. 修复未定义 string 资源引用 🐛:** - 🐛 `flutter_nfc_kit` — 移除 `$string:nfc_tag_reason` 引用和 `NFC_TAG` 系统级权限 - 🐛 `flutter_blue_plus_ohos` — 移除未定义的 `$string:bluetooth_reason` / `$string:location_reason` 引用 - 🐛 entry base string.json — 补充缺失的 `permission_storage_reason` **4. 移除各包中的系统级权限声明 🗑️:** - 🗑️ `nearby_service` — 移除 `SET_WIFI_INFO`(system_core) / `GET_WIFI_INFO`(system_basic) - 🗑️ `wifi_iot` — 移除 `GET_WIFI_INFO`(system_basic) / `SET_WIFI_INFO`(system_core) - 🗑️ `flutter_nfc_kit` — 移除 `NFC_TAG`(system_core) - 🗑️ `flutter_local_notifications` — 移除 `PUBLISH_AGENT_REMINDER` - 🗑️ `network_info_plus_ohos` — 移除 `GET_WIFI_INFO`(system_basic) **修改文件** - `packages/connectivity_plus/ohos/` — 3个 string.json - `packages/device_info_plus/ohos/` — 3个 string.json - `packages/flutter_local_notifications/ohos/` — 3个 string.json + module.json5 - `packages/flutter_webrtc/ohos/` — 3个 string.json - `packages/local_auth_ohos/ohos/` — 3个 string.json - `packages/mobile_scanner/ohos/` — 3个 string.json - `packages/package_info_plus/ohos/` — 3个 string.json - `packages/gal/ohos/` — 1个 string.json - `packages/live_activities/ohos/` — 1个 string.json - `packages/network_info_plus_ohos/ohos/` — 1个 string.json + module.json5 - `packages/permission_handler_ohos/ohos/` — 3个 string.json - `packages/speech_to_text/ohos/` — 1个 string.json - `packages/workmanager_ohos/ohos/` — 1个 string.json - `packages/flutter_nfc_kit/ohos/` — module.json5 - `packages/flutter_blue_plus_ohos/ohos/` — module.json5 - `packages/nearby_service/ohos/` — module.json5 - `packages/wifi_iot/ohos/` — module.json5 - `ohos/entry/src/main/resources/base/element/string.json` — 补充 permission_storage_reason *** ## [v6.9.42] - 2026-06-01 ### 🐛 修复 DataSyncEventBus 单例 Hot Restart 失效问题 **背景:** `DataSyncEventBus` 是全局单例(`static final`),在 `App.dispose` 中调用 `dispose()` 会关闭内部 `StreamController`。但 Flutter Hot Restart 时静态变量不会重新创建,导致单例已关闭但不会重建,事件总线完全失效。 **1. 移除不当 dispose 调用 🐛:** - 🐛 `app.dart` — 移除 `DataSyncEventBus.instance.dispose()`,App 退出时进程即将终止,无需手动释放单例资源 **2. 增强 DataSyncEventBus 防御性 🛡️:** - 🛡️ `_ensureAlive()` — 在 `notify`/`on`/`all` 调用前检查控制器是否已关闭,若已关闭则自动重建 - 🛡️ `dispose()` — 改为仅标记 `_disposed` 状态,不再真正关闭 `StreamController`,防止单例状态不一致 - 🛡️ `isDisposed` getter — 暴露释放状态,便于外部检查 **修改文件** - `lib/app/app.dart` — 移除 DataSyncEventBus.instance.dispose() - `lib/core/sync/data_sync_event_bus.dart` — 增加防御性检查与自动重建机制 ### 🔒 鸿蒙端权限审计与修复 **背景:** 鸿蒙端 `module.json5` 中声明了多个系统级权限(system_basic / system_core),普通第三方应用无法授予,导致 HAP 安装失败(code:9568289)。 **1. 移除鸿蒙端系统级权限 🗑️:** - 🗑️ `ohos.permission.PASTEBOARD` → 不存在,改为 `READ_PASTEBOARD` 后发现仍是 system_basic,最终移除 - 🗑️ `ohos.permission.NOTIFICATION_AGENT_CONTROLLER` → system_core,移除(通知通过运行时API申请) - 🗑️ `ohos.permission.NOTIFICATION_CONTROLLER` → system_basic,移除 - 🗑️ `ohos.permission.READ_PASTEBOARD` → system_basic,移除 - 🗑️ `ohos.permission.GET_WIFI_INFO` → system_basic,移除 - 🗑️ `ohos.permission.SET_WIFI_INFO` → system_core,移除 - 🗑️ `ohos.permission.NFC_TAG` → system_core,移除 - 🗑️ `ohos.permission.GET_BUNDLE_INFO` → system_basic,移除 - 🗑️ `ohos.permission.FILE_ACCESS_PERSIST` → system_core,移除 **2. 保留鸿蒙端普通权限 ✅:** - ✅ `INTERNET` / `GET_NETWORK_INFO` / `VIBRATE` — normal 级别 - ✅ `CAMERA` / `MICROPHONE` / `LOCATION` / `APPROXIMATELY_LOCATION` / `ACCESS_BLUETOOTH` / `READ_MEDIA` / `WRITE_MEDIA` — user_grant 级别 **3. Android/iOS/macOS 端权限审计结论 ✅:** - ✅ Android 端所有权限均为 normal 或 user_grant 级别,无需移除 - ✅ iOS 端 NFC/蓝牙/相机/麦克风/相册权限声明合理,无需移除 - ✅ macOS 端 entitlements 仅含网络/文件访问,无需移除 **4. 被移除鸿蒙权限的代码使用场景 📋:** | 权限 | 代码使用场景 | Android/iOS替代方案 | |------|-------------|-------------------| | NFC_TAG | `nfc_pairing_service.dart` NFC触碰配对 | Android `NFC` normal权限,iOS `NFCReaderUsageDescription` | | GET_WIFI_INFO | `localsend_service.dart` WiFi设备发现 | Android `ACCESS_WIFI_STATE` normal权限 | | SET_WIFI_INFO | 无直接使用 | 无需替代 | | READ_PASTEBOARD | `clipboard_monitor_service.dart` 剪贴板读取 | Flutter `Clipboard.getData` 无需特殊权限 | | NOTIFICATION_* | `local_notification_service.dart` 本地通知 | Android 通知渠道运行时申请,iOS UNUserNotificationCenter | | GET_BUNDLE_INFO | `device_info_service.dart` 应用信息 | `package_info_plus` 无需特殊权限 | | FILE_ACCESS_PERSIST | 文件访问 | `file_picker` / `image_picker` 标准 API | **修改文件** - `ohos/entry/src/main/module.json5` — 移除6个系统级权限 *** ## [v6.9.41] - 2026-06-01 ### 🗑️ 移除 Supabase SDK,全面切换自建API **背景:** `supabase_flutter` SDK在项目中并未正式使用,所有引用该SDK的服务均有占位符保护或本地fallback。现移除SDK,缺失接口改用自建API(`https://tools.wktyl.com`)替代。 **1. Flutter端移除 Supabase 🗑️:** - 🗑️ 移除 `pubspec.yaml` 中 `supabase_flutter: ^2.8.0` 依赖 - 🗑️ 移除 `app_constants.dart` 中 `supabaseUrl` / `supabaseAnonKey` 常量 - 🗑️ 移除 `AndroidManifest.xml` 中 supabase_flutter 注释 - 🗑️ 更新 `agreement_data.dart` 隐私政策(中/英/日/韩/繁中5语言移除Supabase SDK条款) - 🗑️ 更新 `leisure_data_service.dart` / `font_management_notifier.dart` 中 Supabase 注释 **2. 重写5个服务文件(Supabase → ApiClient) 🔄:** - 🔄 `readlater_ai_service.dart` — AI摘要改用 POST `/api/readlater/generateSummary` 等4个接口 - 🔄 `readlater_sync_service.dart` — 云端同步改用 POST/GET `/api/readlater/upload|download|delete|fullSync` - 🔄 `readlater_collab_service.dart` — 协作服务改用自建API,Realtime订阅改为轮询机制 - 🔄 `font_sync_service.dart` — 字体列表改用 GET `/api/font_sync/list` - 🔄 `plugin_update_service.dart` — 插件更新改用 POST `/api/plugin_update/checkOne` 等4个接口 **3. PHP后端新增接口 🆕:** - 🆕 `Readlater.php` — 稍后读同步(4)+协作(6)+AI摘要(4)+安装(1) = 15个接口 - 🆕 `FontSync.php` — 字体同步(1)+安装(1) = 2个接口 - 🆕 `PluginUpdate.php` — 插件更新(4)+安装(1) = 5个接口 - 🆕 自动建表(`_initialize` 中 `CREATE TABLE IF NOT EXISTS`) - 🆕 CORS处理 + OPTIONS预检 **4. Admin管理后台(FastAdmin CRUD) 🆕:** - 🆕 `ReadlaterMessage` — 稍后读消息管理(控制器+模型+验证器+语言包) - 🆕 `ReadlaterSharedList` — 共享列表管理 - 🆕 `FontSync` — 字体管理(含分类/启用状态列表) - 🆕 `PluginMeta` — 插件元信息管理(含平台/启用状态列表) - 🆕 `PluginUserSetting` — 插件用户设置管理 **5. 文档更新 📝:** - 📝 新增 `API_READLATER_FONT_PLUGIN_DOC.md` — Readlater/FontSync/PluginUpdate接口文档 - 📝 更新 `API_ADMIN_DOC.md` — 新增27-31章节(稍后读/字体/插件管理) - 📝 更新服务端 `privacy-policy.html` — 移除Supabase SDK条款 **6. 服务器部署 ✅:** - ✅ 25个文件上传至 `tools.wktyl.com` 服务器 - ✅ 17/19接口测试通过(`plugin_update/checkOne` 带参数时被Nginx拦截,待后续处理) **⚠️ 已知问题:** - `/api/plugin_update/checkOne` 带查询参数时Nginx返回404(PHP直接运行正常),需在宝塔面板添加Nginx白名单 **修改文件** - `pubspec.yaml` — 移除supabase_flutter - `lib/core/constants/app_constants.dart` — 移除Supabase常量 - `lib/core/services/readlater/readlater_ai_service.dart` — 重写 - `lib/core/services/readlater/readlater_sync_service.dart` — 重写 - `lib/core/services/readlater/readlater_collab_service.dart` — 重写 - `lib/features/mine/settings/services/font_sync_service.dart` — 重写 - `lib/features/mine/settings/services/plugin_update_service.dart` — 重写 - `lib/features/tool_center/leisure/services/leisure_data_service.dart` — 更新注释 - `lib/features/agreements/data/agreement_data.dart` — 移除Supabase条款 - `lib/features/mine/settings/presentation/font_management_notifier.dart` — 更新注释 - `android/app/src/main/AndroidManifest.xml` — 更新注释 - `docs/toolsapi/application/api/controller/Readlater.php` — 新增 - `docs/toolsapi/application/api/controller/FontSync.php` — 新增 - `docs/toolsapi/application/api/controller/PluginUpdate.php` — 新增 - `docs/toolsapi/application/route.php` — 新增路由 - `docs/toolsapi/application/admin/controller/` — 5个新控制器 - `docs/toolsapi/application/admin/model/` — 5个新模型 - `docs/toolsapi/application/admin/validate/` — 5个新验证器 - `docs/toolsapi/application/admin/lang/zh-cn/` — 5个新语言包 - `docs/toolsapi/agreements/privacy-policy.html` — 移除Supabase - `docs/toolsapi/docs/API_READLATER_FONT_PLUGIN_DOC.md` — 新增 - `docs/toolsapi/docs/API_ADMIN_DOC.md` — 更新 *** ## [v6.9.40] - 2026-06-01 ### 🛠️ 开发工具:多语言翻译覆盖率检测Python脚本 **背景:** 现有Dart实现的翻译覆盖率检测依赖Flutter运行时,无法在CI/CD中独立运行。需要Python脚本实现相同功能,支持命令行参数和自动修复。 **1. 翻译覆盖率检测脚本 🆕:** - 🆕 `Scripts/check_translation_coverage.py` — CI/CD多语言翻译覆盖率自动检测 - ✅ 扫描 lib/l10n/languages/ 目录下14个语言文件 - ✅ 以 zh_cn.dart 为基准,递归解析嵌套Dart类型结构(THome→THomeBase/TSentenceDetail/TReadLater等) - ✅ 检测缺失键(目标文件中不存在的键)和空值键(存在但值为空的键) - ✅ 输出覆盖率报告:总键数、缺失键数、空值键数、覆盖率百分比、覆盖率排名 - ✅ 缺失/空值键的具体列表(section.field格式) - ✅ `--threshold` 参数自定义覆盖率阈值(默认80%),低于阈值返回非零退出码 - ✅ `--json` 参数输出JSON格式报告(含ranking、below_threshold等结构化数据) - ✅ `--fix` 参数自动将缺失键用基准语言值填充,添加 `// TODO: translate` 标记 - ✅ Windows GBK控制台UTF-8编码兼容 **解析策略:** - 字符级解析器跟踪括号深度和section栈,正确处理嵌套构造函数 - `find_matching_paren` 函数处理字符串内的括号(避免误匹配) - `find_constructor_ranges` 定位每个构造函数的起止位置,用于--fix插入 **当前覆盖率数据(1304个基准键):** - zh_CN/zh_TW/ja/ko/ar: 100% | en: 99.9% | de/es/bn: 91.6% | fr/it/pt/ru/hi: 91.6% **新增文件** - `Scripts/check_translation_coverage.py` *** ## [v6.9.39] - 2026-06-01 ### 🧪 协作画布CanvasProvider单元测试 & 🐛 Bug修复 **1. CanvasProvider单元测试 🆕:** - 🆕 `test/features/file_transfer/collaboration/canvas/canvas_provider_test.dart` — 42个测试用例 - ✅ CanvasState初始状态验证(10个字段默认值) - ✅ setTool/setColor/setWidth工具属性更新 - ✅ startStroke/addPoint/endStroke笔画创建完整流程 - ✅ undo/redo撤销恢复机制(含循环测试、空栈安全) - ✅ clearCanvas清空画布(含undo/redo栈清空验证) - ✅ _disposed防护(dispose后microtask不更新状态) - ✅ joinCanvas/leaveCanvas画布加入离开 - ✅ CanvasState.copyWith(clearCanvasId/clearActiveStroke/部分更新隔离) - ✅ StrokeType枚举映射(fromId正向/反向/边界) **2. Bug修复 🐛:** - 🔧 `leaveCanvas()`未清除canvasId/remoteCursors/cursorOpacities/participants - 🔧 `CanvasState.copyWith`添加`clearCanvasId`参数支持将canvasId置为null **测试方案说明:** - 使用`TestSignalingService`(implements SignalingService + noSuchMethod)替代mocktail - 原因:mocktail的`when()`与Riverpod ProviderContainer创建产生"Cannot call when within a stub response"冲突 - CanvasEngine/CanvasSyncService使用真实实例(无外部依赖,纯内存状态管理) - 通过`sharedSignalingProvider.overrideWithValue()`注入测试信令服务 **新增文件** - `test/features/file_transfer/collaboration/canvas/canvas_provider_test.dart` **修改文件** - `lib/features/file_transfer/collaboration/canvas/providers/canvas_provider.dart` *** ## [v6.9.38] - 2026-06-01 ### 🛠️ 开发工具:Android配置一致性检查脚本 **背景:** 之前 shortcuts.xml 中的 extra key 与 quick_actions_android 插件不匹配导致快捷方式失效,需要自动化检查工具防止类似问题 **1. Android配置检查脚本 🆕:** - 🆕 `Scripts/check_android_config.py` — 验证 Android 原生配置与 Flutter 插件一致性 - ✅ 解析 AndroidManifest.xml:权限声明、Activity 配置、IntentFilter、enableOnBackInvokedCallback、queries、WorkManager Receiver - ✅ 解析 shortcuts.xml:extra key 和 action 与 quick_actions_android 插件常量对比 - ✅ Dart ↔ XML 一致性:ShortcutItem type 与 shortcutId 匹配检查 - ✅ build.gradle.kts 检查:16KB 页面支持、SDK 版本、NDK 配置、签名配置 - ✅ gradle.properties 检查:AndroidX、JVM 内存参数 - ✅ 支持 `--verbose` 详细输出、`--json` JSON 格式报告 - ✅ 总体评分机制(当前项目评分 96/100) **新增文件** - `Scripts/check_android_config.py` *** ## [v6.9.37] - 2026-06-01 ### ✨ 功能新增 & 🎨 UI优化 **1. 统一功能分级标准 🆕:** - 🆕 `lib/core/services/auth/feature_access_level.dart` — 功能访问级别分级标准 - 🆕 `FeatureAccessLevel` 枚举 — localOnly / localWithCloudSync / cloudRequired 三级分类 - 🆕 `FeatureAccessConfig` 类 — 路由访问配置注册表,包含13个路由的分级定义 - 🆕 `canAccessWithoutLogin()` — 判断路由是否无需登录即可访问 - 🆕 `getAccessLevel()` — 获取路由的访问级别 - 🆕 `getCloudFeatureDescription()` — 获取路由的云端功能描述 **2. 贡献者头像墙 — 首字占位 🎨:** - 🎨 `_ContributorCard` — 左侧容器从 emoji 改为名称首字占位头像 - 🎨 背景色使用主题 accent 色 0.12 透明度,文字颜色使用主题 accent 色 - 🎨 英文名取首字母大写,中文名取第一个汉字 - 🗑️ `ContributorData` 移除 `emoji` 字段,改为只有 `name` 和 `role` 两个字段 - 🆕 `ContributorData.initial` getter — 智能获取名称首字符 - 📝 贡献者列表和特别感谢列表去掉 emoji 参数 **新增文件** - `lib/core/services/auth/feature_access_level.dart` **修改文件** - `lib/features/mine/profile/presentation/learn_us_sections.dart` *** ## [v6.9.36] - 2026-06-01 ### 🐛 Bug修复 & ✨ 功能优化(21项批量修复) **UI修复:** - 🔧 主页"句子广场"和"最新"文本去掉多余的emoji前缀 - 🔧 登录/注册按钮文本下半部分被遮住(minSize→minimumSize: Size.zero) - 🔧 工具中心底部栏去掉未实现的"编辑布局"按钮 - 🔧 引导页繁体中文国旗改为🇨🇳,语言列表改为可滑动防溢出 - 🔧 编辑器"实验中的功能"改为"Beta" - 🔧 协作画布无法绘制(_disposed判断逻辑反转修复) - 🔧 主页下拉面板最近打开页面显示不全(Provider刷新+路由归一化+appGo记录) **多语言支持:** - 🌐 登录/注册页面全面多语言化(新增TAuth翻译类型,14种语言) - 🌐 发现页面会话流列表多语言化(约100个翻译键) - 🌐 引导页软件协议多语言化 - 🌐 了解我们页面团队信息多语言化(社交链接按语言切换) - 🌐 软件信息页面备案信息多语言化+非中文info icon说明 **功能优化:** - ✅ 阅读报告页面不登录也能查看本地报告 - ✅ 内容纠错页面:未登录增加邮箱输入框(选填),提交前数学验证码 - ✅ 关于页面"检查更新"和"开源许可"迁移到软件信息页面 - ✅ 协作画布和屏幕共享标记为"开发中"(FeatureFlag+UI badge) - ✅ 了解我们页面开发者名称中文显示"微风暴工作室" - ✅ QQ群非中文时显示Telegram链接 - ✅ 贡献者新增特邀测试"广州性感母蟑螂",特别鸣谢新增"Tools/Plugins" **平台修复:** - 🤖 安卓长按桌面图标快捷菜单点击无跳转(shortcuts.xml key修复) - 🤖 Android 16KB页面大小支持(jniLibs useLegacyPackaging=false) - 📱 鸿蒙端File类型不匹配修复(ExtendedImage.file→FileImage) - 📱 鸿蒙端Platform.isOhos→Platform.operatingSystem=='ohos' **服务端更新:** - 📋 FeatureFlag.php新增collaboration_canvas和screen_share条目 *** ## [v6.9.35] - 2026-06-01 ### 🛠️ 管理后台 CRUD 模块新增(稍后读/字体/插件) **背景:** 为管理后台新增5组 CRUD 模块,用于可视化编辑管理稍后读数据、字体数据和插件数据 **1. 稍后读消息管理 (ReadlaterMessage) ✅:** - ✅ controller: `ReadlaterMessage` — 搜索字段 id/message_id/user_id - ✅ model: 表名 `readlater_messages`,时间戳 createtime/updatetime,状态列表 - ✅ validate: user_id/message_id/type 必填验证 - ✅ lang: 8个字段中文翻译 **2. 共享列表管理 (ReadlaterSharedList) ✅:** - ✅ controller: `ReadlaterSharedList` — 搜索字段 id/name/owner_id - ✅ model: 表名 `readlater_shared_lists`,时间戳 createtime/updatetime,状态列表 - ✅ validate: name/owner_id 必填验证 - ✅ lang: 5个字段中文翻译 **3. 字体管理 (FontSync) ✅:** - ✅ controller: `FontSync` — 搜索字段 id/name/font_family - ✅ model: 表名 `fonts`,分类列表(无衬线/衬线/等宽/展示/手写),启用状态列表 - ✅ validate: name/font_family/download_url 必填验证 - ✅ lang: 18个字段中文翻译 **4. 插件元信息管理 (PluginMeta) ✅:** - ✅ controller: `PluginMeta` — 搜索字段 id/plugin_id/name - ✅ model: 表名 `plugin_meta`,平台列表(Android/iOS/Web/鸿蒙),启用状态列表 - ✅ validate: plugin_id/version/name/platform 必填验证 - ✅ lang: 13个字段中文翻译 **5. 插件用户设置管理 (PluginUserSetting) ✅:** - ✅ controller: `PluginUserSetting` — 搜索字段 id/user_id/platform - ✅ model: 表名 `plugin_user_settings`,平台列表(Android/iOS/Web/鸿蒙) - ✅ validate: user_id/platform 必填验证 - ✅ lang: 5个字段中文翻译 **新增文件(共20个)** - `docs/toolsapi/application/admin/controller/ReadlaterMessage.php` - `docs/toolsapi/application/admin/controller/ReadlaterSharedList.php` - `docs/toolsapi/application/admin/controller/FontSync.php` - `docs/toolsapi/application/admin/controller/PluginMeta.php` - `docs/toolsapi/application/admin/controller/PluginUserSetting.php` - `docs/toolsapi/application/admin/model/ReadlaterMessage.php` - `docs/toolsapi/application/admin/model/ReadlaterSharedList.php` - `docs/toolsapi/application/admin/model/FontSync.php` - `docs/toolsapi/application/admin/model/PluginMeta.php` - `docs/toolsapi/application/admin/model/PluginUserSetting.php` - `docs/toolsapi/application/admin/validate/ReadlaterMessage.php` - `docs/toolsapi/application/admin/validate/ReadlaterSharedList.php` - `docs/toolsapi/application/admin/validate/FontSync.php` - `docs/toolsapi/application/admin/validate/PluginMeta.php` - `docs/toolsapi/application/admin/validate/PluginUserSetting.php` - `docs/toolsapi/application/admin/lang/zh-cn/readlater_message.php` - `docs/toolsapi/application/admin/lang/zh-cn/readlater_shared_list.php` - `docs/toolsapi/application/admin/lang/zh-cn/font_sync.php` - `docs/toolsapi/application/admin/lang/zh-cn/plugin_meta.php` - `docs/toolsapi/application/admin/lang/zh-cn/plugin_user_setting.php` *** ## [v6.9.34] - 2026-06-01 ### 📋 备案信息标题修改与多语言说明 **背景:** 软件信息页面的备案信息标题需改为"APP ICP核准备案号",非中文环境下需增加info icon弹窗说明ICP备案的意义 **1. t_about.dart ✅:** - ✅ 新增 `icpInfoHint` 翻译键(备案说明文本,非中文时显示) **2. 14个语言文件 ✅:** - ✅ `icpInfo` 标题统一修改:中文"APP ICP核准备案号"、繁体"APP ICP核準備案號"、英文"APP ICP Filing No."等 - ✅ 新增 `icpInfoHint` 翻译:解释ICP备案是中国大陆的安全保障措施,海外用户可忽略 **3. about_shared_widgets.dart ✅:** - ✅ `AboutSectionTitle` 新增可选 `trailing` 参数,支持标题右侧自定义组件 **4. app_info_sections.dart ✅:** - ✅ `IcpSection` 标题使用 `t.about.icpInfo`(已更新为"APP ICP核准备案号") - ✅ 非中文环境时,标题右侧显示 ℹ️ info icon(`CupertinoIcons.info_circle`) - ✅ 点击 icon 弹出 `CupertinoAlertDialog` 显示 `icpInfoHint` 说明文本 - ✅ 新增私有组件 `_IcpInfoIcon` **修改文件** - `lib/l10n/types/t_about.dart` - `lib/l10n/languages/zh_cn.dart` / `en.dart` / `zh_tw.dart` / `ja.dart` / `ko.dart` / `ar.dart` / `fr.dart` / `de.dart` / `es.dart` / `pt.dart` / `ru.dart` / `it.dart` / `hi.dart` / `bn.dart` - `lib/features/mine/profile/presentation/about_shared_widgets.dart` - `lib/features/mine/profile/presentation/app_info_sections.dart` *** ## [v6.9.33] - 2026-06-01 ### 🌐 会话流列表多语言支持(i18n) **背景:** 发现页面会话流相关组件存在大量硬编码中文,需替换为多语言翻译系统,支持14种语言 **1. t_chat_flow.dart ✅:** - ✅ 新增约100个翻译键(会话搜索、稍后读、标签/文件夹管理、导出、同步、协作、设备同步、剪贴板监控等) - ✅ toMap() / fromMap() 同步更新 **2. t_common.dart ✅:** - ✅ 新增 `copy` 翻译键 **3. 14个语言文件 ✅:** - ✅ zh_cn / en / zh_tw / ja / ko / ar / fr / de / es / pt / ru / it / hi / bn 全部添加新增翻译键 **4. 会话流组件多语言替换 ✅:** - ✅ `session_search_bar.dart` — 搜索占位符、无结果提示、会话/消息分区标题 - ✅ `session_row.dart` — 置顶/取消置顶、隐藏/取消隐藏(StatelessWidget → ConsumerWidget) - ✅ `session_popup_menu.dart` — 置顶、备注、已读/未读、免打扰、隐藏、隐藏设置、删除(新增 chatFlowT 参数) - ✅ `chat_flow_message_list.dart` — 空状态提示(StatelessWidget → ConsumerWidget) - ✅ `chat_flow_conversation_mixin.dart` — 新建对话标题、占位符、取消/创建按钮 - ✅ `chat_flow_send_toast.dart` — 发送提示(StatefulWidget → ConsumerStatefulWidget) - ✅ `chat_flow_readlater_mixin.dart` — 稍后读设置面板所有菜单项、清空确认、统计信息 - ✅ `chat_flow_readlater_settings_helper.dart` — 标签管理、文件夹管理弹窗(_TagTile/_FolderTile → ConsumerWidget) - ✅ `chat_flow_readlater_message_helper.dart` — 消息操作菜单、AI摘要、智能标签、归档、导出 - ✅ `chat_flow_readlater_sync_helper.dart` — 云端同步、AI摘要、共享协作、设备同步、小组件、剪贴板监控 **修改文件** - `lib/l10n/types/t_chat_flow.dart` - `lib/l10n/types/t_common.dart` - `lib/l10n/languages/zh_cn.dart` / `en.dart` / `zh_tw.dart` / `ja.dart` / `ko.dart` / `ar.dart` / `fr.dart` / `de.dart` / `es.dart` / `pt.dart` / `ru.dart` / `it.dart` / `hi.dart` / `bn.dart` - `lib/features/discover/presentation/widgets/session/session_search_bar.dart` - `lib/features/discover/presentation/widgets/session/session_row.dart` - `lib/features/discover/presentation/widgets/session/session_popup_menu.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_message_list.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_conversation_mixin.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_send_toast.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_readlater_mixin.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_readlater_settings_helper.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_readlater_message_helper.dart` - `lib/features/discover/presentation/widgets/chat/chat_flow_readlater_sync_helper.dart` *** ## [v6.9.32] - 2026-06-01 ### 🗑️ 隐私政策:移除Supabase相关内容 **背景:** 随着客户端从Supabase迁移至自建ApiClient完成,隐私政策文件中不再需要Supabase相关声明 **1. agreement_data.dart 🗑️:** - 🗑️ 中文版:移除Supabase Flutter SDK表格行及说明 - 🗑️ 英文版:移除Supabase Flutter SDK表格行 - ♻️ 日文版:第三者SDK标题移除Supabase - ♻️ 韩文版:제3자 SDK标题移除Supabase - ♻️ 繁体中文版:第三方SDK标题移除Supabase **2. privacy-policy.html 🗑️:** - 🗑️ 中文版:移除Supabase Flutter SDK表格行及说明 - 🗑️ 英文版:移除Supabase Flutter SDK表格行 **修改文件** - `lib/features/agreements/data/agreement_data.dart` - `docs/toolsapi/agreements/privacy-policy.html` *** ## [v6.9.31] - 2026-06-01 ### 🔄 客户端服务层:5个文件从Supabase迁移至自建ApiClient **背景:** 将客户端5个服务文件从 `supabase_flutter` 依赖迁移至项目已有的 `ApiClient`(基于Dio),配合v6.9.30新增的服务端API使用 **1. readlater_ai_service.dart ♻️:** - ♻️ 移除 `supabase_flutter` / `AppConstants` 引用 - ♻️ `generateSummary()` → POST `/api/readlater/generateSummary` - ♻️ `batchSummarize()` → POST `/api/readlater/batchSummarize` - ♻️ `generateDailySummary()` → POST `/api/readlater/dailySummary` - ♻️ `suggestTags()` → POST `/api/readlater/suggestTags` - 🗑️ 移除 `ensureInitialized()`、`_currentUserId` getter - ✅ 保留 `applySummary()`、`getSummary()`、`_buildContent()` 不变 **2. readlater_sync_service.dart ♻️:** - ♻️ 移除 `supabase_flutter` / `AppConstants` 引用 - ♻️ `uploadMessage()` → POST `/api/readlater/upload` - ♻️ `downloadMessages()` → GET `/api/readlater/download` - ♻️ `fullSync()` → POST `/api/readlater/fullSync` - ♻️ `deleteMessage()` → POST `/api/readlater/delete` - ♻️ 用户ID改用 `SecureStorage.read(SecureKeys.userId)` - 🗑️ 移除 `ensureInitialized()`、`_currentUserId` getter、`_tableName` - ✅ 保留 `SyncResult` 模型类、`getLastSyncTime()`、`_saveLastSyncTime()`、`setAutoSync()`、`getAutoSync()` 不变 **3. readlater_collab_service.dart ♻️:** - ♻️ 移除 `supabase_flutter` / `AppConstants` / `RealtimeChannel` 引用 - ♻️ `createSharedList()` → POST `/api/readlater/createSharedList` - ♻️ `inviteMember()` → POST `/api/readlater/inviteMember` - ♻️ `shareToSharedList()` → POST `/api/readlater/shareMessage` - ♻️ `getSharedListMessages()` → GET `/api/readlater/listMessages` - ♻️ `getMySharedLists()` → GET `/api/readlater/myLists` - ♻️ `leaveSharedList()` → POST `/api/readlater/leaveList` - 🔄 Realtime订阅 → 轮询机制:新增 `startPolling()`、`stopPolling()`、`pollListChanges()` - 🗑️ 移除 `subscribeToListChanges()`、`unsubscribeFromListChanges()`、`ensureInitialized()`、`_currentUserId` - ✅ 保留 `SharedReadlaterList` 模型类、`_listChangeController` StreamController 不变 **4. font_sync_service.dart ♻️:** - ♻️ 移除 `supabase_flutter` / `AppConstants` / `Logger` 引用 - ♻️ `fetchOnlineFonts()` → GET `/api/font_sync/list` - 🗑️ 移除 `_supabase` getter、`_client` 字段、占位符保护检查 - ✅ 保留 `OnlineFontEntry` 模型类、`_localFallback()` 方法不变 **5. plugin_update_service.dart ♻️:** - ♻️ 移除 `supabase_flutter` / `AppConstants` 引用 - ♻️ `checkUpdate()` → GET `/api/plugin_update/check` - ♻️ `checkAllUpdates()` → GET `/api/plugin_update/checkAll` - ♻️ `syncPluginState()` → POST `/api/plugin_update/syncState` - ♻️ `loadRemotePluginState()` → GET `/api/plugin_update/loadState` - ♻️ 用户ID改用 `SecureStorage.read(SecureKeys.userId)` - 🗑️ 移除 `_getSupabase()` 方法、`_client` 字段、占位符保护检查 - ✅ 保留 `PluginMeta`、`PluginUpdateResult` 模型类、`_compareVersions()` 方法不变 **修改文件** - `lib/core/services/readlater/readlater_ai_service.dart` - `lib/core/services/readlater/readlater_sync_service.dart` - `lib/core/services/readlater/readlater_collab_service.dart` - `lib/features/mine/settings/services/font_sync_service.dart` - `lib/features/mine/settings/services/plugin_update_service.dart` *** ## [v6.9.30] - 2026-06-01 ### 🆕 服务端API:替代Supabase的3个PHP控制器 **背景:** 将Supabase数据库表功能迁移至ThinkPHP5自建服务端API,提供稍后读同步、字体同步、插件更新3组接口 **1. Readlater.php — 稍后读同步+协作+AI摘要 🆕:** - 🆕 `docs/toolsapi/application/api/controller/Readlater.php` — 完整控制器 - 同步:upload(上传消息)、download(下载消息)、delete(删除消息)、fullSync(全量同步) - 协作:createSharedList(创建共享列表)、inviteMember(邀请成员)、shareMessage(分享消息)、listMessages(获取列表消息)、myLists(我的列表)、leaveList(退出列表) - AI摘要:generateSummary(单条摘要)、batchSummarize(批量摘要)、dailySummary(每日摘要)、suggestTags(标签建议) - 数据表:readlater_messages、readlater_shared_lists、readlater_shared_members、readlater_shared_messages - 所有方法需登录,AI摘要当前为占位符实现 **2. FontSync.php — 字体同步 🆕:** - 🆕 `docs/toolsapi/application/api/controller/FontSync.php` — 完整控制器 - list(获取在线字体列表),无需登录 - 数据表:fonts **3. PluginUpdate.php — 插件更新 🆕:** - 🆕 `docs/toolsapi/application/api/controller/PluginUpdate.php` — 完整控制器 - check(检查单个插件更新)、checkAll(检查所有插件更新),无需登录 - syncState(同步插件状态)、loadState(加载插件状态),需登录 - 数据表:plugin_meta、plugin_user_settings **通用特性:** - 所有控制器继承 `app\common\controller\Api`,使用 `$this->auth->id` 获取用户ID - 自动建表:`_initialize()` 中使用 `CREATE TABLE IF NOT EXISTS` 确保表存在 - 独立 install 接口:支持手动触发建表 - 统一返回格式:`$this->success()` / `$this->error()` - 完整参数校验 + try-catch 异常捕获 **新增文件** - `docs/toolsapi/application/api/controller/Readlater.php` - `docs/toolsapi/application/api/controller/FontSync.php` - `docs/toolsapi/application/api/controller/PluginUpdate.php` *** ## [v6.9.29] - 2026-06-01 ### 🔄 关于页面"检查更新"和"开源许可"迁移至软件信息页面 **任务13: 我的页面弹性布局确认** - ✅ `profile_page.dart` — 确认已有 `BouncingScrollPhysics()`,iOS风格弹性滚动已生效,无需修改 **任务14-15: "检查更新"和"开源许可"从关于页迁移至软件信息页 🔴高:** - ♻️ `about_page.dart` — _DeveloperSection 移除"开源许可"和"检查更新"两个列表项,仅保留"更新日志" - ♻️ `about_page.dart` — 移除 `flutter_svg` 和 `showLicensePage` 不再需要的 import - ✨ `app_info_widgets.dart` — LicenseItem 对话框新增"查看完整许可"按钮,点击跳转 Flutter 原生 License 页面 - 🆕 `app_info_widgets.dart` — 新增 `CheckUpdateItem` 组件,展示"检查更新"行项 + "已是最新版本"对话框 - ✨ `app_info_sections.dart` — BuildInfoSection 新增 `CheckUpdateItem`(位于 LicenseItem 之后) **修改文件** - `lib/features/mine/profile/presentation/about_page.dart` - `lib/features/mine/profile/presentation/app_info_widgets.dart` - `lib/features/mine/profile/presentation/app_info_sections.dart` *** ## [v6.9.28] - 2026-06-18 ### 🔄 路由架构重构:统一路由注册表,消除鸿蒙路由配置维护成本 **问题背景:** 路由定义分散在 `user_routes.dart`、`tool_routes.dart`、`content_routes.dart`、`settings_routes.dart`、`feature_routes.dart`、`editor_router.dart`、`ohos_nav_bridge.dart` 等 6-8 个文件中,GoRoute 和 OhosRouteEntry 需要手动同步,新增/修改路由时容易遗漏鸿蒙端配置。 **1. 新增统一路由注册表(Single Source of Truth)🆕:** - 🆕 `lib/core/router/route_def.dart` — 核心类型定义:`RouteModule`、`RouteTransition`、`RouteContext`、`RouteDef`、`RouteBuilder` typedef,以及 GoRouterState/OhosRouteContext 到 RouteContext 的转换扩展 - 🆕 `lib/core/router/route_registry.dart` — 统一路由注册表,所有路由定义的单一数据源,约1000行,包含 user/tool/content/settings/feature/editor 全部模块路由 - 🆕 `lib/core/router/route_builders.dart` — 从 route_registry 自动生成 `GoRoute` 和 `OhosRouteEntry` 的构建器,包含 `buildModuleGoRoutes()` 和 `buildOhosRouteEntries()` - 🆕 `lib/core/router/ohos_route_types.dart` — 从 ohos_nav_bridge.dart 提取的类型定义(OhosRouteParams、OhosRouteContext、OhosNavMiddleware、OhosRouteEntry、AuthMiddleware、LogMiddleware),打破循环依赖 - 🆕 `lib/core/router/ohos_placeholders.dart` — 从 ohos_nav_bridge.dart 提取的鸿蒙占位组件(CanvasPlaceholder、ScreenSharePlaceholder、TransferChatPlaceholder、QuickCardPlaceholder、EditorSubPlaceholder、OhosNotFoundWidget) **2. 重构现有路由文件 🔴高:** - 📝 `user_routes.dart` — 从280行缩减为17行,仅调用 `buildModuleGoRoutes(RouteModule.user, rootNavigatorKey)` - 📝 `tool_routes.dart` — 同上模式,约17行 - 📝 `content_routes.dart` — 同上模式,约17行 - 📝 `settings_routes.dart` — 同上模式,约17行 - 📝 `feature_routes.dart` — 同上模式,约17行 - 📝 `editor_router.dart` — GoRoute 定义部分改为调用 `buildModuleGoRoutes(RouteModule.editor, rootNavigatorKey)`,保留 EditorRoutes 常量类、EditorNav 扩展、辅助函数和数据类 - 📝 `ohos_nav_bridge.dart` — 从1188行(含100+手动路由注册)缩减为约245行,`_routes` 改为 getter 调用 `buildOhosRouteEntries()`,保留导航方法和中间件执行逻辑,export ohos_route_types.dart 和 ohos_placeholders.dart **3. RouteDef 设计要点:** - `page` 字段:无参数页面构建器(简单页面) - `builder` 字段:带 RouteContext 的页面构建器(需要参数的页面) - `ohosBuilder` 字段:鸿蒙端专用构建器(替代页面,如占位组件) - `transition` 字段:转场动画类型(iosSlide/iosFade/iosModal/glassSheet/heroine) - `middlewares` 字段:中间件列表(AuthMiddleware/LogMiddleware) - `redirectTo` 字段:重定向目标路径 - `children` 字段:嵌套子路由 **新增文件** - `lib/core/router/route_def.dart` - `lib/core/router/route_registry.dart` - `lib/core/router/route_builders.dart` - `lib/core/router/ohos_route_types.dart` - `lib/core/router/ohos_placeholders.dart` **修改文件** - `lib/core/router/user_routes.dart` - `lib/core/router/tool_routes.dart` - `lib/core/router/content_routes.dart` - `lib/core/router/settings_routes.dart` - `lib/core/router/feature_routes.dart` - `lib/core/router/editor_router.dart` - `lib/core/router/ohos_nav_bridge.dart` *** ## [v6.9.27] - 2026-06-01 ### 🐛 修复 - 🐛 `login_page.dart` / `register_section.dart` — 修复登录/注册按钮文字被截断:CupertinoButton 默认 minSize=44 和 padding 导致 SizedBox(height:50) 内文字溢出,添加 `padding: EdgeInsets.zero` 和 `minimumSize: Size.zero` - 🐛 `it.dart` — 修复意大利语翻译文件缺少 `auth: TAuth(...)` 段导致 analyzer 报错 `missing_required_argument` - 🐛 14个语言文件 — `emailRegisteredHint` 统一添加 `{email}` 占位符,与 `register_section.dart` 中 `replaceAll('{email}', email)` 调用对齐 ### ✨ 新增:登录/注册页面多语言(i18n)支持 - 🆕 `lib/l10n/types/t_auth.dart` — 新增 TAuth 翻译类型,包含 ~95 个翻译键(登录/注册/验证码/Token/老用户登录等) - 🆕 `lib/l10n/types/t.dart` — 导出 t_auth.dart - 🆕 `lib/l10n/types/t_root.dart` — T 类新增 `auth` 必需字段、toMap/fromMap 支持 - 🆕 14个语言文件全部添加 `auth: TAuth(...)` 翻译段(zh_cn, en, zh_tw, ja, ko, fr, de, es, it, pt, ru, ar, hi, bn) - 🆕 `translation_io_service.dart` — fallback 构造添加 `auth: fallback.auth` - ✨ `login_page.dart` — 所有硬编码中文文本替换为 `t.auth.*` / `t.common.*` 引用 - ✨ `register_section.dart` — 所有硬编码中文文本替换为 `t.auth.*` / `t.common.*` 引用 - ✨ `login_form_sections.dart` — PasswordFormSection/CodeFormSection/TokenFormSection/LegacyFormSection/LoginSuccessView 新增 `required TAuth auth` 参数,替换硬编码中文 *** ## [v6.9.26] - 2026-06-01 ### 🐛 修复 - 🐛 `home_tool_center.dart` — 修复主页下拉面板最近打开页面不显示的问题:浮动面板打开时未从 RecentRouteService 刷新 Provider 状态,导致显示旧数据。在 `_FloatingPanelState.initState()` 中添加 `refreshFromService()` 调用 - 🐛 `recent_route_service.dart` — 修复动态路由未归一化导致同一页面产生多条记录的问题:添加 `_normalizeRoute()` 方法,将 `/chat-flow/123` 归一化为 `/chat-flow`,`/editor?text=xxx` 归一化为 `/editor` - 🐛 `app_nav_extension.dart` — `appGo()` 方法添加 `RecentRouteService.addRecentRoute()` 调用,确保所有导航方式都记录最近路由 ### ✨ 改进 - ✨ `overview_dashboard.dart` — 概览仪表盘"最近浏览"接入 RecentRouteService,展示真实浏览记录(最多6条),支持点击跳转,替换原静态占位符 - ✨ 全局 — 将"实验中的功能"文案统一改为"Beta",涉及编辑器工具栏、实验功能页面、小部件管理页面、l10n翻译等6个文件 *** ## [v6.9.25] - 2026-06-01 ### 🐛 修复 - 🐛 `canvas_provider.dart` — 修复协作画布无法绘制的严重bug:所有 `Future.microtask` 回调中 `_disposed` 逻辑反转(`if (!_disposed) return;` 应为 `if (_disposed) return;`),导致引擎状态变更永远无法同步到 Riverpod state,画布始终为空。影响范围:`_onEngineChanged`、`leaveCanvas`、`_handleRemoteSnapshot`、`_handleRemoteCursor`、`_handleParticipantsChanged` 共5处 - 🐛 `canvas_page.dart` — GestureDetector 添加 `behavior: HitTestBehavior.opaque`,修复画布区域手势检测不灵敏问题 ### ✨ 改进 - ✨ `transfer_chat_page.dart` — 协作画布(🎨画布)和屏幕共享(📺屏幕)按钮添加"开发中"badge标记,使用 Stack + Positioned 叠加橙色小标签 - ✨ `FeatureFlag.php` — 新增 `collaboration_canvas`(协作画布) 和 `screen_share`(屏幕共享) 两个 Feature Flag 条目,均标记为 `developing` 状态 *** ## [v6.9.24] - 2026-06-01 ### ✨ 改进 - ✨ `reading_report_service.dart` — 未登录时降级为本地报告(AppDatabase),认证错误(401)不再阻断整个报告。新增 `_generateLocalReport` 方法,从本地 ReadHistory/Favorites 表生成摘要、趋势图和热力图数据 - ✨ `reading_report_page.dart` — 移除登录阻断页面(`_buildAuthError`),改为顶部登录提示横幅(`_buildLoginHintBanner`),未登录用户可查看本地阅读报告 - ✨ `reading_report_provider.dart` — `isAuthError` 改为信息性标记,不再阻断报告内容显示 ### 🐛 修复 - 🐛 `shortcuts.xml` — 修复安卓端长按桌面图标快捷菜单点击无跳转问题。根因:静态快捷方式的 extra key(`shortcutType`) 和 action(`VIEW`) 与 `quick_actions_android` 插件期望的 key(`some unique action key`) 和 action(`RUN`) 不匹配,导致插件无法识别快捷方式 intent。已对齐插件内部常量 - 🐛 `AndroidManifest.xml` — 在 `` 标签添加 `android:enableOnBackInvokedCallback="true"`,支持 Android 13+ 预测性返回手势 - 🐛 `build.gradle.kts` — 添加 `packaging.jniLibs.useLegacyPackaging = false`,支持 Android 15+ 16KB 页面大小设备,确保 .so 文件以 16KB 对齐方式存储 - 🐛 `gradle.properties` — 添加 `android.experimental.lint.missingBaselineIsEmptyBaseline=true`,消除 lint baseline 缺失警告 - 🐛 `image_cache_detail_page.dart` — 修复鸿蒙端 `ExtendedImage.file()` 的 `File` 类型不匹配编译错误(`dart:io` File 与 `extended_image_library` File 不兼容),改用 `ExtendedImage(image: FileImage(file))` - 🐛 `image_cache_grid.dart` — 同上,缩略图组件 `CacheThumbnail` 改用 `ExtendedImage(image: ExtendedResizeImage.resizeIfNeeded(provider: FileImage(file)))` 替代 `ExtendedImage.file()` - 🐛 `nearby_service.dart` — 修复鸿蒙端 `Platform.isOhos` 不存在编译错误,改用 `Platform.operatingSystem == 'ohos'` *** ## [v6.9.23] - 2026-05-31 ### 🐛 修复 - 🐛 `app.dart` — 修复 DataSyncEventBus 资源未释放问题,dispose 中添加 `DataSyncEventBus.instance.dispose()` 关闭内部 StreamController ### 🔄 数据同步架构:统一 DataSyncEventBus 替代分散 StreamController **1. 新增 DataSyncEventBus 统一事件总线 🆕:** - 🆕 `lib/core/sync/data_sync_event_bus.dart` — 全局数据同步事件总线,单例模式 - 🆕 `DataSyncEventType` 枚举 — 支持 `readlater`、`favorite` 两种事件类型,未来可扩展 - 🆕 `DataSyncEvent` 类 — 携带 `type`、`source`(来源标识)、`payload`(附加数据),便于调试追踪 - 🆕 `DataSyncEventBus.instance.notify()` — 发送事件,支持 source 追踪 - 🆕 `DataSyncEventBus.instance.on()` — 按类型过滤订阅事件 - 🆕 `DataSyncEventBus.instance.all` — 订阅所有事件 **2. 新增兼容层(零破坏性迁移)🆕:** - 🆕 `lib/core/sync/data_sync_compat.dart` — 提供与旧 API 完全一致的函数签名 - ✅ `notifyReadlaterRefresh()` / `notifyFavoriteRefresh()` — 兼容旧调用 - ✅ `readlaterRefreshStream` / `favoriteRefreshStream` — 兼容旧订阅 - ✅ `disposeReadlaterRefreshController()` / `disposeFavoriteRefreshController()` — 兼容旧清理(空操作,由 EventBus 统一管理) **3. 迁移旧 StreamController 🔴高:** - 🗑️ `chat_provider.dart` — 移除 `_readlaterRefreshController`、`notifyReadlaterRefresh()`、`readlaterRefreshStream`、`disposeReadlaterRefreshController()` - 🗑️ `favorite_provider.dart` — 移除 `_favoriteRefreshController`、`notifyFavoriteRefresh()`、`favoriteRefreshStream`、`disposeFavoriteRefreshController()` **4. 更新所有调用方 import 🔴高:** - 📝 `app.dart` — dispose 函数改为从 `core/sync/sync.dart` 导入 - 📝 `home_interaction_mixin.dart` — 移除对 `chat_provider.dart` 和 `favorite_provider.dart` 的依赖,改用 `core/sync/sync.dart` - 📝 `sharing_receiver_service.dart` — 移除对 `chat_provider.dart` 的依赖,改用 `core/sync/sync.dart` - 📝 `readlater_provider.dart` — 移除对 `chat_provider.dart` 的依赖,改用 `core/sync/sync.dart` - 📝 `chat_flow_page.dart` — 新增 `core/sync/sync.dart` 导入(保留 `chat_provider.dart` 因仍需 `chatMessagesProvider`) **新增文件** - `lib/core/sync/data_sync_event_bus.dart` - `lib/core/sync/data_sync_compat.dart` - `lib/core/sync/sync.dart` **修改文件** - `lib/features/discover/providers/chat_provider.dart` - `lib/features/home/providers/favorite_provider.dart` - `lib/app/app.dart` - `lib/features/home/providers/home_interaction_mixin.dart` - `lib/core/services/readlater/sharing_receiver_service.dart` - `lib/features/home/presentation/providers/readlater/readlater_provider.dart` - `lib/features/discover/presentation/pages/chat/chat_flow_page.dart` *** ## [v6.9.22] - 2026-05-31 ### 🎨 主题系统增强:isDark 便捷扩展 + Sheet/Dialog 硬编码颜色修复 **1. 新增 BuildContext 主题扩展 🆕:** - 🆕 `AppThemeContextExt` — 在 `app_theme.dart` 底部新增 `BuildContext` 扩展 - 🆕 `context.isDark` — 快捷判断暗色模式,替代 `AppTheme.isDarkMode(context)` 或 `CupertinoTheme.brightnessOf(context) == Brightness.dark` - 🆕 `context.ext` — 快捷访问 `AppThemeExtension`,替代 `AppTheme.ext(context)` **2. 修复 Sheet/Dialog 中硬编码颜色(暗色模式适配)🔴高:** - 🐛 `source_page.dart` — 频道详情弹窗按钮文字使用 `isDark ? ext.bgPrimary : CupertinoColors.white`,改为 `ext.textOnAccent` - 🐛 `chat_flow_readlater_sync_helper.dart` — 共享协作弹窗背景色 `CupertinoColors.systemBackground` → `ext.bgElevated`;关闭按钮 `CupertinoColors.systemGrey4` → `ext.bgSecondary` - 🐛 `chat_settings_page.dart` — 破坏性操作文字 `CupertinoColors.systemRed` → `ext.destructiveColor`(3处);Toast 弹窗 `CupertinoColors.systemGrey` + `Colors.white` → `ext.bgElevated` + `ext.textPrimary` - 🐛 `correction_page.dart` — 错误提示文字 `CupertinoColors.systemRed` → `ext.destructiveColor` - 🐛 `account_security_score_card.dart` — 安全评分颜色 `CupertinoColors.systemGreen/Orange/Red` → `ext.successColor/warningColor/destructiveColor`(5处) - 🐛 `account_bind_email_dialog.dart` — 输入框背景 `CupertinoColors.systemGrey6` → `ext.bgSecondary`(2处) **修改文件** - `lib/core/theme/app_theme.dart` — 新增 `AppThemeContextExt` 扩展 - `lib/features/source/presentation/source_page.dart` — 修复频道详情弹窗颜色 - `lib/features/discover/presentation/widgets/chat/chat_flow_readlater_sync_helper.dart` — 修复协作弹窗颜色 + 新增 app_theme 导入 - `lib/features/discover/presentation/pages/chat/chat_settings_page.dart` — 修复破坏性操作 + Toast 颜色 - `lib/features/correction/presentation/correction_page.dart` — 修复错误提示颜色 - `lib/features/mine/settings/presentation/account/account_security_score_card.dart` — 修复语义色 - `lib/features/mine/settings/presentation/account/account_bind_email_dialog.dart` — 修复输入框背景色 *** ## [v6.9.21] - 2026-05-31 ### 🔧 HarmonyOS 构建修复:module.json5 schema 校验失败 **Issue: hvigor PreBuild 报错 `shortcuts` 字段无效** - 🐛 根因:`module.abilities[0]` 中的 `shortcuts` 字段不在当前 HarmonyOS schema 允许的 abilities 属性列表中,导致 `Schema validate failed` - ✅ 移除 `abilities[0]` 中的 `shortcuts` 配置(包含 `action_theme` 和 `action_general_settings` 两个快捷方式) - ✅ 当前 API 版本的 abilities 不支持 `shortcuts`,需后续通过其他方式实现桌面快捷方式 **修改文件** - `ohos/entry/src/main/module.json5` *** ## [v6.9.20] - 2026-05-31 ### 🔧 HarmonyOS 配置修复:receive_sharing_intent + 缺失权限 **Task 9: 配置 receive_sharing_intent for HarmonyOS** - ✅ `module.json5`:EntryAbility 新增分享接收 skills - `ohos.want.action.sendData` — 接收单条分享内容 - `ohos.want.action.sendMultipleData` — 接收多条分享内容 - `entity.system.default` — 默认实体 - ✅ 插件 `ReceiveSharingIntentOhosPlugin` 已通过 `NewWantListener` + `AbilityAware` 自动注册,EntryAbility 无需额外修改 **Task 9.1: 修复 named parameter 错误** - 🐛 根因:`receive_sharing_intent` v1.8.1 (git br_v1.8.1_ohos) 的 `SharedMediaFile` 构造函数新增 5 个 required 参数:`uri`、`title`、`label`、`description`、`utd`,以及 1 个 optional 参数 `content`。`SafeSharedMediaFile.toSharedMediaFile()` 未传递这些参数导致编译错误 - ✅ `safe_sharing_receiver.dart`:`SafeSharedMediaFile` 新增 `uri`/`title`/`label`/`description`/`utd`/`content` 字段 - ✅ `fromMap()` 解析新字段 - ✅ `toSharedMediaFile()` 传递新字段给 `SharedMediaFile` 构造函数 - ✅ flutter analyze 验证通过,named parameter 错误已消除 **Task 8 follow-up: 添加缺失权限到 module.json5** - ✅ `ohos.permission.READ_MEDIA` — 读取相册照片/视频 (user_grant) - ✅ `ohos.permission.WRITE_MEDIA` — 保存照片/视频到相册 (user_grant) - ✅ `ohos.permission.FILE_ACCESS_PERSIST` — 文件访问 (system_grant) - ✅ `ohos.permission.NOTIFICATION_AGENT_CONTROLLER` — 本地通知 (system_grant) - ✅ `ohos.permission.PASTEBOARD` — 剪贴板访问 (system_grant) - ✅ `string.json` 新增 `permission_notification_reason` 权限说明文案 **修改文件** - `ohos/entry/src/main/module.json5` - `ohos/entry/src/main/resources/base/element/string.json` - `lib/core/services/readlater/safe_sharing_receiver.dart` *** ## [v6.9.19] - 2026-05-31 ### 🔄 修复稍后读/收藏跨页面同步问题 **Issue 10: 稍后读(Read Later)同步问题** - 🐛 根因:`ReadLaterNotifier.init()` 需手动调用(在 ReadLaterPage.initState 中),但 Provider 创建时不会自动调用。若用户从未访问稍后读页面,Provider 虽被创建但 `init()` 未执行,导致:1) 初始数据未加载;2) `readlaterRefreshStream` 未订阅。即使 `notifyReadlaterRefresh()` 被调用,刷新事件也会丢失。 - ✅ 修复:将 `init()` 逻辑移入 `build()` 生命周期方法,使用 `Future.microtask()` 避免在 build 中直接修改状态,确保 Provider 创建时自动加载和订阅 - ✅ `loadItems()` 重构为独立 try-catch,Feed API 和 ChatMessage 加载互不影响 - ✅ 清理 `readlater_page.dart` 中已废弃的 `init()` 调用 - ✅ `init()` 标记为 `@Deprecated` **Issue 11: 收藏(Favorite)同步问题** - 🐛 根因:收藏操作完全缺少实时刷新机制。`toggleFavorite()` 执行后仅更新本地数据库和服务端,但没有通知 `FavoriteNotifier` 刷新。此外 `loadFavorites()` 仅从服务端API加载,不包含本地数据库中标记为 `isFavorite=true` 的句子。 - ✅ 修复:新增 `favoriteRefreshStream` 全局事件总线(与 readlaterRefreshStream 模式一致) - ✅ `FavoriteNotifier.build()` 中订阅刷新流 - ✅ `HomeInteractionMixin.toggleFavorite()` 末尾调用 `notifyFavoriteRefresh()` - ✅ `loadFavorites()` 合并本地数据库收藏(`loadLocalDbFavorites` + `mergeWithLocalDb`) - ✅ 加载失败时回退到本地数据库收藏 - ✅ `app.dart` 注册 `disposeFavoriteRefreshController()` 清理 **代码质量** - ✅ 修复 `favorite_repository.dart` 中 `s.createdAt?.` 多余的 null-aware 操作符警告 - ✅ 移除 `FavoriteRepository` 中未使用的 `_ref` 字段 **修改文件** - `lib/features/home/presentation/providers/readlater/readlater_provider.dart` - `lib/features/home/presentation/providers/readlater_page.dart` - `lib/features/home/providers/favorite_provider.dart` - `lib/features/home/providers/home_interaction_mixin.dart` - `lib/features/home/repositories/favorite_repository.dart` - `lib/app/app.dart` *** ## 🏷️ 软件特性功能 (v6.9.18及更早版本已完成的特性) - 🏠 **主页** — 每日拾句/句子广场/下拉刷新动画/精灵角色互动/摇一摇换句 - 🔍 **发现** — 会话流AI聊天/稍后读/闲情逸致/灵感/日签卡片/壁纸模板/进度追踪/工具中心 - 👤 **我的** — 个人中心/收藏/历史/设备管理/内容纠错/文件传输 - ⚙️ **设置** — 主题个性化/通用设置/权限管理/插件系统/实验性功能 - 🎨 **设计系统** — 动态主题(亮/暗/AMOLED)/动态圆角/GlassContainer毛玻璃/统一设计令牌 - 🔒 **隐私合规** — 协议同意后初始化权限/AndroidManifest自启动防护/外部跳转确认弹窗 - 📱 **平台适配** — Android/iOS/鸿蒙/响应式布局/NFC文件传输 - 🔄 **路由架构** — 统一路由注册表(Single Source of Truth)/GoRoute+OhosRouteEntry自动生成/中间件架构 已归档版本 v6.9.18(了解我们弹窗) / v6.9.17(语言选择动态翻译) / v6.9.16(阅读报告本地降级) / v6.9.15(安卓快捷方式修复) / v6.9.14(主题系统增强) / v6.9.13(数据同步架构) / v6.9.12(协作画布修复) / v6.9.11(概览仪表盘) / v6.9.10(阅读报告服务) / v6.9.9(翻译插件) / v6.9.8(闲情逸致) / v6.9.7(诗词设置) / v6.9.6(工具中心) / v6.9.5(文件传输) / v6.9.4(搜索映射) / v6.9.3(灵感暗色渐变) / v6.9.2(隐私政策) / v6.9.1(FeatureFlag) / v6.9.0(稍后读修复) / v6.8.9(收藏同步) / v6.8.8(图片缓存) / v6.8.7(纠错布局) / v6.8.6(闲情热力图) / v6.8.5(外部跳转) / v6.8.4(工具面板重构) / v6.8.3(导航配置) / v6.8.1(引导页多语言) / v6.8.0(实验功能) / v6.7.9-v6.7.0(多项迭代) / v6.6.172-v6.6.168(插件+翻译+OHOS) / v6.6.167-v6.6.163(汇率+异常保护+API降级) / v6.6.162-v6.6.135(多项功能迭代) / v6.6.133-v6.5.45(综合审计+隐私+热力图+工具面板) / v16.36.0-v16.36.3(插件+翻译+OHOS) / v16.35.0(性能优化8项) / 6.25.0-6.25.1(鸿蒙小组件) / 6.24.0(诗词设置) / 14.0.0-14.23.0(传输+翻译+画布+WebRTC) / 13.2.0-13.9.0(信令+本地化+主题+设置) / 6.4.1-6.4.5(鸿蒙数据库) / 5.10.0-5.13.0(鸿蒙SDK+auth) / 1.21.0-1.48.0(早期功能迭代) — 更早版本详见 git history