diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b4ec016..26355495 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,87 +6,32 @@ ## [v6.16.3] - 2026-06-04 -### 🐛 Hive降级初始化 — 解决iOS模拟器objective_c库导致整个Hive系统瘫痪 +### 🛡️ 系统性稳定性加固与审计修复(v6.16.0 ~ v6.16.3 合并) -#### 根因分析 -`Hive.initFlutter()`内部调用`getApplicationDocumentsDirectory()`,在iOS模拟器上因objective_c库加载失败而抛出ArgumentError。 -之前的修复只是让app不崩溃(降级模式),但Hive完全不可用,导致壁纸页面、缓存管理页面等所有依赖Hive的功能无数据。 +#### 审计修复 — 5类系统性风险26处加固 +基于验收审计发现的87个潜在问题,优先修复26处高危问题: +- **gal插件ArgumentError捕获**(5处)— iOS模拟器objective_c库异常时降级为友好提示 +- **path_provider异常降级**(8处)— 失败时降级使用`Directory.systemTemp` +- **Hive.openBox ArgumentError捕获**(2处)— 降级打开fallback box +- **addPostFrameCallback mounted检查**(6处)— 回调开头添加mounted保护 +- **页面级pop canPop()保护**(5处)— 不可pop时降级导航到首页 -#### 修复内容 -- **HiveSafeAccess.ensureInitialized()** — `Hive.initFlutter()`失败时,降级使用`Hive.init()`+手动获取路径(`getApplicationDocumentsDirectory()`失败则用`Directory.systemTemp.path`) -- 这样Hive可以在iOS模拟器上正常工作(使用临时目录),所有依赖Hive的服务(壁纸、缓存、设置等)恢复正常 +#### Hive系统级联崩溃根因修复(v6.16.2 + v6.16.3) +- **根因:** `Hive.initFlutter()`在iOS模拟器因objective_c库问题失败后,导致整个Hive系统瘫痪 +- **影响范围:** KvStorage、WallpaperFavoriteService、WallpaperHealthService、SettingsChangeLogger等全部初始化失败 +- **修复:** `HiveSafeAccess.ensureInitialized()` — 失败时降级使用`Hive.init()`+手动路径获取;各服务添加全异常捕获优雅降级 -#### 修改文件 -- `hive_safe_access.dart` +#### 引导页 & 小部件修复(v6.16.1) +- 引导页重复显示 — 将判断从`initialLocation`移到`redirect`回调,改用`isOnboardingCompleted` +- 桌面小部件framework断言 — `CupertinoSliverNavigationBar`补充`largeTitle`参数 -*** - -## [v6.16.2] - 2026-06-04 - -### 🐛 壁纸模版页面卡死 + Hive系统级联崩溃(根因修复) - -#### 根因:Hive.initFlutter()在iOS模拟器因objective_c库问题失败后rethrow,导致整个Hive系统瘫痪 -- **影响范围:** 所有依赖Hive的服务(KvStorage、WallpaperFavoriteService、WallpaperHealthService、SettingsChangeLogger、ExchangeRateService等)全部初始化失败,KvStorage持续输出"未初始化"警告,壁纸页面数据为空导致卡死 - -#### 修复内容: -1. **HiveSafeAccess.ensureInitialized()** — 失败时不再rethrow,标记`_hiveInitFailed`状态,让后续操作可优雅降级 -2. **KvStorage.init()** — 失败时不再rethrow,进入降级模式(所有存储操作返回默认值) -3. **WallpaperFavoriteService.init()** — 添加`on HiveError catch` + `catch (e)` 全异常捕获 -4. **WallpaperHealthService.init()** — 同上 -5. **SettingsChangeLogger.init()** — 同上 -6. **HiveSafeAccess._openWithRetry()** — Hive初始化失败时直接抛出明确错误,不浪费3次重试 - -#### 修改文件: +**修改文件:** - `hive_safe_access.dart`, `kv_storage.dart`, `wallpaper_favorite_service.dart`, `wallpaper_health_service.dart`, `settings_change_logger.dart` - -*** - -## [v6.16.1] - 2026-06-04 - -### 🐛 引导页重复显示 + 桌面小部件framework断言(根因修复) - -#### 引导页重复显示 -- **根因:** `GoRouter`构造时调用`_resolveInitialLocation()`,此时`KvStorage`尚未初始化,`isOnboardingCompleted`返回默认值`false`,导致路由始终指向`/onboarding` -- **修复:** 将引导页判断从`initialLocation`(同步执行)移到`redirect`回调(每次导航时执行,此时KvStorage已就绪);`initialLocation`固定为`AppRoutes.home`;删除不再使用的`_resolveInitialLocation()` -- **修改文件:** `app_router.dart` - -#### 桌面小部件页面framework断言错误 -- **根因:** `CupertinoSliverNavigationBar`缺少`largeTitle`参数,iOS 26/Flutter最新版要求必须提供,否则触发`largeTitleContent != null`断言,级联导致`_elements.contains(element)`断言和`RenderViewport expected RenderSliver`错误 -- **修复:** 添加`largeTitle`参数 -- **修改文件:** `widget_management_page.dart` - -*** - -## [v6.16.0] - 2026-06-04 - -### 🛡️ 审计修复 — 5类系统性风险26处加固 - -基于v6.15.0验收审计发现的87个潜在问题,优先修复28个高危问题中的26处(2处为设计决策保留)。 - -#### 1. gal插件ArgumentError捕获(5处) -- **原因:** iOS模拟器objective_c原生库加载失败时gal抛出ArgumentError,未捕获导致崩溃 -- **修复:** 5处gal调用添加`on ArgumentError catch`分支,降级为友好提示 -- **修改文件:** `share_sheet.dart`, `leisure_share_sheet.dart`, `progress_share_card.dart`, `chat_video_bubble.dart`, `china_colors_page.dart` - -#### 2. path_provider异常降级(8处) -- **原因:** `getTemporaryDirectory()`/`getApplicationDocumentsDirectory()`在某些平台可能抛出异常 -- **修复:** 所有调用点添加try-catch,失败时降级使用`Directory.systemTemp` -- **修改文件:** `export_io_native.dart`(4处), `font_download_service.dart`, `logger.dart`, `sentence_detail_actions.dart`, `account_export_info_sheet.dart`, `voice_recorder_sheet.dart`, `ohos_compatibility_helper.dart`, `general_fields_provider.dart`(2处) - -#### 3. Hive.openBox ArgumentError捕获(2处) -- **原因:** iOS模拟器objective_c库异常时Hive.openBox抛出ArgumentError -- **修复:** 添加`on ArgumentError catch`,降级打开fallback box -- **修改文件:** `wallpaper_favorite_service.dart`, `wallpaper_health_service.dart` - -#### 4. addPostFrameCallback mounted检查(6处) -- **原因:** 回调中直接使用context/setState/ref,widget dispose后触发framework断言错误 -- **修复:** 所有回调开头添加`if (!mounted) return;`(ConsumerWidget用`context.mounted`) -- **修改文件:** `progress_beautify_page.dart`, `signin_page.dart`, `app_lock_pattern_setup.dart`, `image_cache_page.dart`, `chat_flow_page.dart`, `weather_settings_page.dart` - -#### 5. 页面级pop canPop()保护(5处) -- **原因:** 在根页面pop可能导致黑屏或异常 -- **修复:** 添加`canPop()`检查,不可pop时降级导航到首页 -- **修改文件:** `signin_page.dart`, `hot_search_page.dart`, `security_question_page.dart`, `change_password_page.dart`, `sentence_detail_sheet.dart` +- `share_sheet.dart`, `leisure_share_sheet.dart`, `progress_share_card.dart`, `chat_video_bubble.dart`, `china_colors_page.dart` +- `export_io_native.dart`, `font_download_service.dart`, `logger.dart`, `sentence_detail_actions.dart`, `account_export_info_sheet.dart`, `voice_recorder_sheet.dart`, `ohos_compatibility_helper.dart`, `general_fields_provider.dart` +- `progress_beautify_page.dart`, `signin_page.dart`, `app_lock_pattern_setup.dart`, `image_cache_page.dart`, `chat_flow_page.dart`, `weather_settings_page.dart` +- `hot_search_page.dart`, `security_question_page.dart`, `change_password_page.dart`, `sentence_detail_sheet.dart` +- `app_router.dart`, `widget_management_page.dart` *** @@ -94,77 +39,29 @@ ### 🐛 10项Bug修复 + 验收审计举一反三 -#### Bug #1: 了解我们页面 - 微信搜索移到右边作为单独标签 -- **原因:** "微风暴(微信搜索)"合并为一个标签,用户无法单独操作微信搜索 -- **修复:** 拆分为两个独立标签,左边"微风暴"带复制功能,右边"微信搜索"带搜索图标 -- **修改文件:** `learn_us_widgets.dart` - -#### Bug #2: 权限管理页面 - 摇一摇权限点击关闭无反应 -- **原因:** `refresh()`将全页面设为loading状态,导致开关组件被销毁重建 -- **修复:** 新增`_refreshSilently()`方法,不设loading状态避免销毁开关;启用摇一摇时重启ShakeDetector -- **修改文件:** `permission_management_page.dart`, `permission_service.dart` - -#### Bug #3: 发现页面 - 日签卡片一直转圈loading -- **原因:** API请求无超时保护,网络异常时可能无限挂起 -- **修复:** provider层添加10秒超时+TimeoutException捕获,service层添加8秒超时 -- **修改文件:** `daily_card_provider.dart`, `daily_card_service.dart` - -#### Bug #4: 发现页面进度 - 保存图片失败(objective_c库问题) -- **原因:** iOS模拟器objective_c原生库加载失败,gal插件抛出ArgumentError -- **修复:** export_io_native增加`on ArgumentError catch`降级为分享方案;进度美化页面改用ExportService -- **修改文件:** `export_io_native.dart`, `progress_beautify_page.dart` - -#### Bug #5: 数据管理页面 - 无法获取应用文档目录异常 -- **原因:** `safeAppDirPath`返回null时直接throw,无降级方案 -- **修复:** 降级使用临时目录;数据管理页面增加try-catch保护 -- **修改文件:** `backup_service.dart`, `data_management_page.dart` - -#### Bug #6: 缓存管理页面 - AppBar标题去掉"图片"两字 -- **修复:** 修改zh_cn/zh_tw翻译文件 -- **修改文件:** `zh_cn.dart`, `zh_tw.dart` - -#### Bug #7: 个人中心 - objective_c库报错(Hive缓存) -- **原因:** 与Bug #4同根因,HiveCacheStore打开Box时objective_c库异常 -- **修复:** HiveCacheStore增加`on ArgumentError catch`降级打开临时Box -- **修改文件:** `cache_config.dart` - -#### Bug #8: iOS长按App icon进入页面无返回按钮 -- **原因:** QuickActions使用`appRouter.go()`替换当前路由,无导航栈 -- **修复:** 改用`appRouter.push()`保留导航栈;审计发现app.dart中另有2处同类问题一并修复 -- **修改文件:** `app.dart`(3处go→push) - -#### Bug #9: iOS清理后台重新打开显示引导页 -- **原因:** 路由判断使用`isFirstLaunch`,Hive冷启动读取失败时默认true导致误判 -- **修复:** 改用`isOnboardingCompleted`作为主要判断;引导页完成时flush Hive确保持久化 -- **修改文件:** `app_router.dart`, `onboarding_provider.dart` - -#### Bug #10: 桌面小部件页面 - framework断言错误 -- **原因:** `_WidgetDataPreview`在initState直接调用异步方法访问ref,widget dispose后仍操作element -- **修复:** 添加`_disposed`标志+dispose()方法;initState改用addPostFrameCallback;所有ref/setState前检查mounted和disposed;添加5秒超时保护 -- **修改文件:** `widget_management_page.dart` +| # | 问题 | 根因 | 修改文件 | +|---|------|------|---------| +| 1 | 了解我们页面微信搜索无法单独操作 | 标签合并导致 | `learn_us_widgets.dart` | +| 2 | 权限管理摇一摇开关关闭无反应 | refresh()销毁开关组件 | `permission_management_page.dart`, `permission_service.dart` | +| 3 | 日签卡片一直转圈loading | API请求无超时保护 | `daily_card_provider.dart`, `daily_card_service.dart` | +| 4 | 进度保存图片失败 | objective_c库gal抛ArgumentError | `export_io_native.dart`, `progress_beautify_page.dart` | +| 5 | 数据管理页文档目录异常 | safeAppDirPath null无降级 | `backup_service.dart`, `data_management_page.dart` | +| 6 | 缓存管理AppBar标题多余"图片" | 翻译文案问题 | `zh_cn.dart`, `zh_tw.dart` | +| 7 | 个人中心Hive缓存报错 | HiveCacheStore打开Box异常 | `cache_config.dart` | +| 8 | iOS长按App icon无返回按钮 | QuickActions用go()替换路由 | `app.dart`(3处go→push) | +| 9 | 清理后台重开显示引导页 | 路由判断用isFirstLaunch误判 | `app_router.dart`, `onboarding_provider.dart` | +| 10 | 桌面小部件framework断言 | initState异步访问ref | `widget_management_page.dart` | ### 🔍 验收审计 - 举一反三分析 -审计发现项目存在以下系统性风险模式: - -| 风险类别 | 高危数 | 中危数 | 低危数 | 合计 | -|---------|-------|-------|-------|------| -| 异步生命周期(ref/setState无mounted保护) | 11 | 20 | 9 | 42 | +| 风险类别 | 高危 | 中危 | 低危 | 合计 | +|---------|------|------|------|------| +| 异步生命周期(mounted保护) | 11 | 20 | 9 | 42 | | Hive/Path/Gal缺少ArgumentError捕获 | 9 | 10 | 4 | 29 | -| 路由导航(go应改push/pop无空栈保护) | 4 | 4 | 2 | 10 | -| KvStorage关键标志位默认值保护 | 4 | 2 | 0 | 6 | -| **合计** | **28** | **36** | **15** | **87** | +| 路由导航(go应改push) | 4 | 4 | 2 | 10 | +| KvStorage关键标志位默认值 | 4 | 2 | 0 | 6 | -**已修复的举一反三问题:** -- ✅ app.dart中数据管理和小组件导航入口go→push(与Bug #8同根因) -- ✅ KvStorage.isFirstLaunch默认值分析(保持true,因路由已改用isOnboardingCompleted) - -**建议后续优先修复的高危问题:** -1. `share_sheet.dart`等5处gal调用缺少ArgumentError捕获(与Bug #4同根因) -2. `export_io_native.dart`等8处path_provider缺少null检查(与Bug #5同根因) -3. `wallpaper_favorite_service.dart`等2处Hive.openBox缺少ArgumentError捕获(与Bug #7同根因) -4. 6处addPostFrameCallback中使用context/setState无mounted检查(与Bug #10同根因) -5. `signin_page.dart`等5处页面级pop缺少canPop()保护 +> 注:v6.16.0已修复上述审计建议的高危问题 *** @@ -172,1667 +69,128 @@ ### 🎴 日签卡片 AR 3D 展示效果 (Issue #9) -**背景:** 日签卡片页面缺乏沉浸式展示体验,用户希望在 AR 空间中查看悬浮的日签卡片,增强视觉冲击力和分享欲望。 +采用伪AR方案 — Flutter 3D变换 + 设备传感器模拟AR体验: -**技术方案:** 采用伪AR效果方案 — 使用 Flutter 的 3D 变换和设备传感器模拟 AR 体验,无需原生 ARKit/ARCore 集成。 +- **3D卡片渲染** — Matrix4透视投影变换,设备感应倾斜偏移(`sensors_plus`) +- **景深效果** — RadialGradient深空背景 + 动态星空粒子 + ShaderMask暗角 +- **光影动画** — 4秒周期LinearGradient光影流动覆盖层 +- **截图分享** — RepaintBoundary截取PNG → `share_plus`系统分享 +- **6套AR主题** — 宇宙深空🌌 / 极光幻境🌈 / 落日余晖🌅 / 森林秘境🌿 / 深海探幽🌊 / 水晶殿堂💎 +- **手势控制** — 拖拽旋转 / 双击重置(触觉反馈) / 捏合缩放(0.6x-2.0x) +- **Cupertino风格控制面板** — GlassContainer底部面板(截图/主题切换/自动旋转/重置) -**实现内容:** -- ✅ 创建 `daily_card_ar_view.dart` — AR 3D 展示页面(~735行) - - **3D卡片渲染**:日签内容以 3D 卡片形式悬浮显示(Matrix4 透视投影变换) - - **设备感应**:手机倾斜时卡片产生对应的透视偏移(`sensors_plus` 加速度计数据) - - **景深效果**:RadialGradient 深色背景 + 动态星空粒子 + ShaderMask 暗角 - - **光影动画**:4秒周期 LinearGradient + ShaderMask 光影流动覆盖层 - - **截图/录制**:RepaintBoundary 截图 → PNG → `share_plus` 系统分享 - - **6套 AR 主题**:宇宙深空🌌 / 极光幻境🌈 / 落日余晖🌅 / 森林秘境🌿 / 深海探幽🌊 / 水晶殿堂💎 - - **手势控制**:拖拽旋转 / 双击重置(带触觉反馈) / 捏合缩放(0.6x-2.0x) - - **Cupertino风格控制面板**:GlassContainer 底部面板(截图/主题切换/自动旋转/重置) - - **自动/手动模式切换**:传感器自动旋转 vs 手势手动控制 - - **呼吸悬浮动画**:3秒周期上下浮动(±8px) -- ✅ 修改 `daily_card_page.dart` — 操作栏新增「AR」按钮(`CupertinoIcons.viewfinder` 图标),点击跳转 AR 视图并传递当前卡片数据 -- ✅ 路由注册: - - `app_routes.dart` — 新增 `dailyCardArView = '/daily-card/ar'` 常量 - - `route_registry.dart` — 注册 builder 路由(通过 `DailyCardArParams` 传递卡片数据) +**新增文件:** `lib/features/daily_card/presentation/daily_card_ar_view.dart` -**新增文件:** -- `lib/features/daily_card/presentation/daily_card_ar_view.dart` — AR 3D 展示页面 - -**修改文件:** -- `lib/features/daily_card/presentation/daily_card_page.dart` — 新增 AR 入口按钮 + `_onArView()` 方法 -- `lib/core/router/app_routes.dart` — 新增 dailyCardArView 路由常量 -- `lib/core/router/route_registry.dart` — 注册 AR 页面路由 - -**依赖复用(无需新增):** -- `sensors_plus: ^6.1.0` — 已有,用于加速度计数据采集 -- `share_plus: ^13.1.0` — 已有,用于截图分享 -- `flutter_tilt: ^4.0.0` — 已有,备选 3D 倾斜交互库 +**修改文件:** `daily_card_page.dart`, `app_routes.dart`, `route_registry.dart` *** ## [v6.13.0] - 2026-06-04 -### 🔧 鸿蒙原生层修复 + iOS Widget深度定制 (Issue #2, #8) +### 🔧 鸿蒙原生层修复 + iOS Widget深度定制 + 基础设施 -#### 任务A: 鸿蒙原生层修复 (Issue #2) +#### A. 鸿蒙原生层修复 (Issue #2) +- 所有FormPage添加`.bindContextMenu()`长按上下文菜单(6个卡片页面各自定制操作菜单) +- 日签卡片保存按钮OHOS兼容 — gal不支持OHOS,降级为系统分享方案 -**问题A1: 桌面Widget长按图标不显示按钮列表** -- **原因:** 鸿蒙FormPage只使用`.onClick()`处理点击事件,没有实现长按手势或上下文菜单 -- **修复内容:** - - ✅ 为所有FormPage添加`.bindContextMenu()`长按上下文菜单 - - ✅ 为每个卡片定制专属操作菜单: - - `DailySentenceFormPage`: 刷新、复制句子、打开APP - - `DailyCardFormPage`: 保存图片、分享、刷新、打开APP - - `CheckinFormPage`: 立即签到、刷新、打开APP - - `ReadlaterFormPage`: 打开阅读、刷新、打开APP - - `FortuneFormPage`: 换一条、分享运势、打开APP - - `SolarTermFormPage`: 复制诗句、刷新、打开APP - - ✅ 添加长按震动反馈(`vibrator.vibrate()`) +#### B. iOS Widget深度定制 — AppIntent交互式按钮 (Issue #8) +- 新增7种AppIntent定义(刷新/点赞/分享/切换/签到/打开页面/保存卡片) +- 6个Widget View添加iOS 17+ `Button(intent:)`交互式按钮,iOS 14-16降级为Link方式 +- Flutter端更新`home_widget_service.dart`处理新Intent类型 -**修改文件:** -- `ohos/entry/src/main/ets/formability/pages/DailySentenceFormPage.ets` -- `ohos/entry/src/main/ets/formability/pages/DailyCardFormPage.ets` -- `ohos/entry/src/main/ets/formability/pages/CheckinFormPage.ets` -- `ohos/entry/src/main/ets/formability/pages/ReadlaterFormPage.ets` -- `ohos/entry/src/main/ets/formability/pages/FortuneFormPage.ets` -- `ohos/entry/src/main/ets/formability/pages/SolarTermFormPage.ets` +#### C. 基础设施 (Issue #3, #4) +- **Hive安全访问单例** — 新建`hive_safe_access.dart`,统一lazy-init守卫、Box缓存、并发锁、重试机制;KvStorage/CrashMonitor/CacheConfig/RssService全部接入 +- **设备发现去重增强** — deviceId+IP组合键去重 + 30秒心跳超时清理定时器 -**问题A2: 日签卡片保存按钮无反应** -- **原因:** `gal` (gallery_saver) 插件不支持OHOS平台 -- **修复内容:** - - ✅ 修改 `export_io_native.dart` 增加OHOS平台检测 - - ✅ OHOS平台使用系统分享作为替代方案(用户可手动保存到相册) - - ✅ 添加降级方案:gal保存失败时自动切换为分享方式 - - ✅ 在 `ohos_compatibility_helper.dart` 添加图片保存兼容方法 +**新增文件:** `hive_safe_access.dart`, `XianyanWidgetIntents.swift` +**修改文件:** 6个FormPage.ets, `XianyanWidget.swift`, `home_widget_service.dart`, `export_io_native.dart`, `ohos_compatibility_helper.dart`, `kv_storage.dart`, `lan_discovery_service.dart`, `device_discovery_provider.dart` -**修改文件:** -- `lib/editor/services/export/export_io_native.dart` — OHOS兼容性支持 -- `lib/core/utils/platform/ohos_compatibility_helper.dart` — 新增saveImageToGalleryCompat方法 - ---- - -#### 任务B: iOS Widget深度定制 - AppIntent交互式按钮 (Issue #8) - -**需求:** 让桌面闲言Widget支持交互式操作(不仅是展示+刷新) - -**新增文件:** -- `ios/XianyanWidget/Intents/XianyanWidgetIntents.swift` — AppIntent定义 - - `RefreshWidgetIntent` — 刷新Widget - - `LikeSentenceIntent` — 点赞句子 - - `ShareContentIntent` — 分享内容 - - `NextContentIntent` — 切换下一条 - - `CheckinIntent` — 执行签到 - - `OpenAppPageIntent` — 打开APP特定页面 - - `SaveCardIntent` — 保存日签卡片 - -**修改的Widget View(添加iOS 17+交互式按钮):** -- `DailySentenceWidgetEntryView`: 点赞❤️ + 分享📤 + 刷新🔄 -- `DailyCardWidgetEntryView`: 保存💾 + 分享📤 + 刷新🔄 -- `CheckinWidgetEntryView`: 签到✅ + 刷新🔄 -- `FortuneWidgetEntryView`: 换一条🔀 + 分享📤 + 刷新🔄 -- `SolarTermWidgetEntryView`: 复制📋 + 刷新🔄 -- `ReadlaterWidgetEntryView`: 打开阅读📖 + 刷新🔄 - -**向后兼容:** -- iOS 17+ 使用 `Button(intent:)` 交互式按钮 -- iOS 14-16 降级为原有 `Link(destination:)` 方式 - -**Flutter端配合:** -- 更新 `home_widget_service.dart` 处理新的Intent类型 -- 新增路由映射:`action` → `_widget_interactive_action`, `open` → `_widget_open_page` -- 新增 `_handleInteractiveAction()` 方法处理点赞/分享/切换/签到/保存等操作 - -**修改文件:** -- `ios/XianyanWidget/XianyanWidget.swift` — 各Widget View添加交互式按钮 -- `lib/core/services/data/home_widget_service.dart` — Flutter端Intent处理 - ---- - -### 🐛 Hive初始化时序修复 + 设备发现去重增强 - -#### 任务A: Hive安全访问工具类 (Issue #3) -**问题:** OHOS冷启动时可能出现 `HiveError: Box not found`,因为缺乏统一的lazy-init守卫 - -**修复内容:** -- ✅ 创建 `lib/core/storage/hive_safe_access.dart` 统一Hive安全访问单例 -- ✅ 提供 `safeBox(name)` 方法:自动检查并初始化,带重试机制(默认3次) -- ✅ 提供 `ensureOpen(name)` / `tryGetBox(name)` 方法 -- ✅ 使用 Box 缓存 + 并发打开锁防止重复打开 -- ✅ 完整日志追踪便于调试 -- ✅ 更新 `KvStorage.init()` 通过 HiveSafeAccess 统一管理 -- ✅ 更新 `CrashMonitor`、`CacheConfig`、`RssService` 使用安全访问 -- ✅ 更新 `OhosCompatibilityHelper.safeOpenBox()` 委托给 HiveSafeAccess - -**新增文件:** -- `lib/core/storage/hive_safe_access.dart` — Hive安全访问单例 - -**修改文件:** -- `lib/core/storage/kv_storage.dart` — 集成HiveSafeAccess -- `lib/core/services/error/crash_monitor.dart` — 使用safeBox替代直接openBox -- `lib/core/network/cache_config.dart` — HiveCacheStore使用safeBox -- `lib/features/discover/services/rss_service.dart` — 使用safeBox -- `lib/core/utils/platform/ohos_compatibility_helper.dart` — 委托给HiveSafeAccess - -#### 任务B: 设备发现心跳超时清理 (Issue #4) -**问题:** 文件传输助手的设备列表在鸿蒙端出现重复设备,缺乏心跳超时清理机制 - -**修复内容:** -- ✅ 增强 `LanDiscoveryService` 设备去重逻辑: - - 基于 **deviceId + IP 组合键** 去重(而非仅靠deviceId) - - 同一设备出现新广播时更新 lastSeenAt 而非新增 - - 添加 **30秒超时阈值** 的心跳清理定时器(每10秒检查一次) - - 超时设备自动标记离线并从列表移除 - - 完整的清理日志记录 -- ✅ 增强 `DeviceDiscoveryProvider` 设备去重逻辑: - - 同样使用 deviceId+IP 组合键去重 - - 添加相同的心跳超时清理机制 - - `_addDevice()` 方法也支持去重更新 - - 扫描停止时自动清理定时器 - -**修改文件:** -- `lib/features/file_transfer/services/discovery/lan_discovery_service.dart` -- `lib/features/file_transfer/providers/device_discovery_provider.dart` - ---- +*** ## [v6.11.0] - 2026-06-04 ### 📷 集成真实扫码SDK + 鸿蒙端全面修复 -#### 任务A: 扫码功能完善 -**问题:** "我的"页面的"扫一扫"功能显示"开发中...",未实现真实的二维码扫描功能 +#### 扫码功能完善 +- 创建通用扫码页面`qrcode_scanner_page.dart`,集成`mobile_scanner: ^7.1.4` +- 完整流程:相机权限 → 动画扫描线 → URL/文本/Email/电话/WiFi/vCard分类处理 → 智能结果处理 +- 闪光灯开关、相册识别辅助功能,Cupertino风格界面支持动态主题 -**修复内容:** -- ✅ 创建通用扫码页面 `qrcode_scanner_page.dart`,集成 `mobile_scanner: ^7.1.4` -- ✅ 实现完整的扫码流程:相机权限请求 → 扫描界面(带动画扫描线) → 结果分类处理 -- ✅ 支持多种二维码类型识别:URL、文本、Email、电话、WiFi、vCard -- ✅ 扫描结果智能处理:URL自动打开浏览器、WiFi密码一键复制、文本复制到剪贴板 -- ✅ 添加闪光灯开关、从相册选择图片识别等辅助功能 -- ✅ Cupertino风格扫描界面,支持动态主题 -- ✅ 在路由注册表添加 `/qrcode-scanner` 路由 -- ✅ 修改 `profile_page.dart`,将"开发中..."替换为跳转到扫码页面 +#### 鸿蒙端兼容性修复(9项) +- ✅ 相机权限缺失 → AndroidManifest.xml添加CAMERA +- ⚠️ 文件传输设备列表重复 → 已有去重逻辑,建议增加IP组合键 +- ⚠️ 长按桌面图标无按钮列表 → 鸿蒙原生限制需改.ets代码 +- ✅ HiveError Box not found → OhosCompatibilityHelper.safeOpenBox() +- ⚠️ 日签保存无反应 → gal不支持OHOS,降级为分享 +- ✅ 输入框不弹输入法 → requestKeyboardFocus()增强方法 +- ✅ 数据管理显示0B → safeGetDirectorySize()安全读取 +- ✅ 设备信息unknown → getEnhancedPlatform()/getEnhancedDeviceModel() +- ✅ OhosCompatibleState Mixin快速集成 -**新增文件:** -- `lib/features/shared/presentation/qrcode_scanner_page.dart` - -**修改文件:** -- `lib/core/router/app_routes.dart` — 添加 qrcodeScanner 路由常量 -- `lib/core/router/route_registry.dart` — 注册扫码页面路由 -- `lib/features/mine/profile/presentation/profile_page.dart` — 替换"开发中..."为页面跳转 -- `android/app/src/main/AndroidManifest.xml` — 添加相机权限声明 - -#### 任务B: 鸠蒙端兼容性修复 - -##### B.1.1 相机权限缺失 ✅ -**问题:** Android端缺少CAMERA权限声明,导致扫码等功能无法使用 - -**修复:** -- 在 `AndroidManifest.xml` 添加 `android.permission.CAMERA` 权限 -- 添加 `` 声明(非必需) -- **注意:** 鸿蒙端 `module.json5` 已有 `ohos.permission.CAMERA` 权限(第184行) - -##### B.1.2 文件传输设备列表重复 ✅ -**分析结果:** -- 设备发现代码已有基于 `deviceId` 的去重逻辑(`transfer_notifier.dart:446-451`) -- 合并设备时也做了ID去重(`file_transfer_discovery_tab.dart:37-43`) -- **可能原因:** 鸿蒙端设备标识符不稳定或广播包重复 -- **建议:** 增加时间窗口去重 + IP+端口组合去重作为补充策略 - -##### B.1.3 长按桌面图标不显示按钮列表 ⚠️ -**分析结果:** -- 这是鸿蒙原生端的限制,需要修改 `.ets` FormAbility 代码 -- Flutter层 `home_widget` 插件无法完全控制OHOS widget交互行为 -- **建议:** 在 `ohos/entry/src/main/ets/formability/` 目录下检查各FormAbility的 `onReceiveFormEvent` 实现 - -##### B.1.4 HiveError Box not found ✅ -**解决方案:** -- 创建 `OhosCompatibilityHelper.safeOpenBox()` 方法,提供重试机制 -- 建议在应用启动时统一初始化所有Hive Box -- 特别关注OHOS平台初始化时序问题 - -##### B.1.6 设备信息显示unknown ✅ -**分析结果:** -- `device_info_service.dart` 已有OHOS平台适配(第394-396行, 424-432行) -- 但平台标识返回 `'ohos'` 而非标准 `'harmonyos'` -- **增强方案:** 创建 `getEnhancedPlatform()` 返回标准名称 -- 创建 `getEnhancedDeviceModel()` 提供兜底显示逻辑 - -##### B.1.7 日签卡片保存按钮无反应 ⚠️ -**分析结果:** -- 使用 `gal: ^2.3.0` 插件保存图片到相册 -- 该插件对OHOS平台的支持可能不完整 -- **建议:** - - 检查 `pubspec.ohos.yaml` 是否有gal的OHOS替代实现 - - 或使用 `image_picker` 的反向操作保存图片 - - 添加try-catch和用户提示 - -##### B.1.8 输入框不弹输入法 ✅ -**解决方案:** -- 创建 `requestKeyboardFocus()` 增强方法 -- 使用延迟焦点请求 + SystemChannels fallback机制 -- 提供 `wrapOnTapForKeyboard()` 包装器方法 - -##### B.1.9 数据管理图片缓存显示0B ✅ -**解决方案:** -- 创建 `safeGetDirectorySize()` 安全读取方法 -- 处理目录不存在、权限不足等异常情况 -- 创建 `normalizeCachePath()` 规范化路径格式 - -**新增文件:** -- `lib/core/utils/platform/ohos_compatibility_helper.dart` — 鸿蒙端兼容性工具类 - -**工具类提供的能力:** -- 输入法增强(键盘唤起) -- 设备信息标准化 -- 文件路径适配与安全读取 -- 权限检查增强 -- Hive初始化容错 -- UI渲染增强 -- OhosCompatibleState Mixin用于快速集成 +**新增文件:** `qrcode_scanner_page.dart`, `ohos_compatibility_helper.dart` +**修改文件:** `profile_page.dart`, `app_routes.dart`, `route_registry.dart`, `AndroidManifest.xml` *** ## [v6.10.5] - 2026-06-02 -### 🧭 修复多个页面缺少AppBar标题和返回按钮 +### 🏗️ 架构优化 + 多语言全覆盖 + 构建修复(v6.10.0 ~ v6.10.5 合并) -**问题:** 多个页面使用 `AdaptiveBackButton` 但当 `canPop()` 为 false 时按钮消失,或缺少 `middle` 标题导致导航栏空白;部分页面使用自定义导航栏而非标准 `CupertinoNavigationBar`,风格不统一。 +#### 架构优化 (v6.10.0) +- **MacosPlatformService统一** — 分散MethodChannel统一为新服务,Swift端扩展为10个方法处理器 +- **二维码WebSocket长连接** — QrcodeWsService双通道架构(WS优先+HTTP轮询降级)+ 中继服务器 +- **RSS全文阅读** — Readability算法提取全文 + 图片画廊阅读模式 +- **灵动岛倒计时聚焦模式** — startCountdownActivity/update/endCountdownActivity +- **自定义Lint规则** — double_angle_brackets / hardcoded_color / hardcoded_chinese +- **应用图标和名称** — 全平台图标更新,iOS/macOS名称改为中文「闲言」 -**修复内容:** -- ✅ `login_page.dart` — 添加动态 `middle` 标题(登录/注册切换),替换 `AdaptiveBackButton` 为始终可见的导航按钮(可返回时显示返回箭头,不可返回时显示关闭按钮并导航回首页) -- ✅ `chat_video_bubble.dart` — 添加 `middle` 标题「🎬 视频播放」 -- ✅ `chat_image_bubble.dart` — 添加 `middle` 标题「🖼️ 图片预览」 -- ✅ `tts_plugin_page.dart` — `CupertinoSliverNavigationBar` 添加 `middle` 属性,滚动折叠后仍显示标题 -- ✅ `widget_management_page.dart` — 自定义导航替换为标准 `CupertinoSliverNavigationBar` -- ✅ `source_page.dart` — 自定义导航替换为标准 `CupertinoNavigationBar` -- ✅ `leisure_timeline_page.dart` — 自定义 BackdropFilter 导航替换为标准 `CupertinoNavigationBar` +#### 多语言全覆盖 (v6.10.3 + v6.10.4) +- **6页面全量i18n** — 账户设置(18key)、数据管理(33key)、来源(40key)、收藏(68key)、离线(67key) +- **翻译字段补全** — roleNative + 7个分发渠道字段,12种语言补全 +- **覆盖14种语言** — zh_cn/en/ja/zh_tw/ko/de/it/es/ar/bn/hi/pt/ru/fr -**涉及文件:** -- `lib/features/auth/presentation/login_page.dart` -- `lib/features/discover/presentation/widgets/chat_bubble/chat_video_bubble.dart` -- `lib/features/discover/presentation/widgets/chat_bubble/chat_image_bubble.dart` -- `lib/features/mine/settings/presentation/plugin/tts_plugin_page.dart` -- `lib/features/widget/presentation/widget_management_page.dart` -- `lib/features/source/presentation/source_page.dart` -- `lib/features/tool_center/leisure/presentation/pages/leisure_timeline_page.dart` +#### 构建修复 (v6.10.1 + v6.10.2 + v6.10.5) +- **Syncfusion Chart崩溃** — DeferredBuilder包裹35处图表延迟渲染,21个文件 +- **扫码登录自动跳转** — HTTP轮询(3s) + WebSocket双通道监听 + 自动tokenLogin +- **pubspec.yaml双模板** — 拆分pubspec.ohos.yaml/pubspec.macos.yaml,tools/setup_pubspec.ps1自动生成 +- **AppBar标题/返回按钮修复** — 7个页面统一CupertinoNavigationBar风格 + +**涉及文件:** macos平台服务、路由注册、扫码登录、多语言系统(5新模块+14语言)、图表组件、pubspec模板、7个页面导航栏 *** -## [v6.10.5] - 2026-06-02 +## [v6.9.28] - 2026-06-01 -### 🏗️ pubspec.yaml 双模板机制(重大架构变更) +### 🏗️ 路由架构重构 + 基础设施建设(v6.9.19 ~ v6.9.51 合并) -**背景:** 鸿蒙端和 MacBook Pro 端共用一个 `pubspec.yaml`,MacBook Pro 端每次 `git pull` 后需手动替换 82 行本地包引用,容易出错且经常互相覆盖。 +#### 路由架构重构 (v6.9.28) — Single Source of Truth +- 新增统一路由注册表`route_registry.dart`(~1000行),消除6-8个文件手动同步鸿蒙配置 +- 自动生成GoRoute和OhosRouteEntry,ohos_nav_bridge从1188行缩减至245行 +- 新增5个核心文件:route_def/route_registry/route_builders/ohos_route_types/ohos_placeholders -**核心变更:** -- 🏗️ `pubspec.yaml` 拆分为双模板:`pubspec.ohos.yaml`(鸿蒙端)+ `pubspec.macos.yaml`(MacBook Pro端) -- 🔒 `pubspec.yaml` 和 `pubspec.lock` 加入 `.gitignore`,两端都不再提交 -- 🛠️ 新增 `tools/setup_pubspec.ps1` 脚本,自动选择平台模板生成 `pubspec.yaml` -- 📋 新增三方库变更通知机制:新增依赖必须同时更新两个模板 + `iOS_macOS_Developer_Guide.md` +#### 数据同步架构 (v6.9.23) — DataSyncEventBus +- 统一事件总线替代分散StreamController,零破坏性迁移(compat兼容层) +- 支持readlater/favorite两种事件类型,source追踪便于调试 -**新增文件:** -- 📄 `pubspec.ohos.yaml` — 鸿蒙端模板(使用本地 packages/ 目录) -- 📄 `pubspec.macos.yaml` — MacBook Pro 端模板(使用远程版本号) -- 🛠️ `tools/setup_pubspec.ps1` — 平台模板生成脚本 +#### Supabase SDK移除 (v6.9.41) — 全面切换自建API +- 移除supabase_flutter依赖,5个服务重写为ApiClient调用 +- PHP后端新增22个接口(Readlater 15 + FontSync 2 + PluginUpdate 5) +- Admin管理后台新增5组CRUD模块(FastAdmin) -**修改文件:** -- `.gitignore` — 新增 `/pubspec.yaml` + `/pubspec.lock` -- `iOS_macOS_Developer_Guide.md` — v7 全面重写 §2 章节(双模板机制 + 变更流程) +#### 句子详情面板重构 (v6.9.47 + v6.9.48) +- 1252行拆分为3个文件(panel/content/actions),Riverpod Notifier消除prop drilling +- TTS关闭按钮、相关推荐、卡片分享图片、AnimatedSwitcher过渡动画 -**迁移指南:** -- 鸿蒙端:`.\tools\setup_pubspec.ps1 -Platform ohos` → `flutter pub get` -- MacBook Pro端:`.\tools\setup_pubspec.ps1 -Platform macos` → `flutter pub get` +#### 主题系统 & UI修复 (v6.9.22 + v6.9.36) +- `context.isDark`/`context.ext`便捷扩展;Sheet/Dialog硬编码颜色全面修复(7个文件) +- 21项批量UI修复:emoji清理、按钮溢出、协作画布绘制bug、Android快捷方式、16KB页面支持 -*** +#### 多语言 & 功能 (v6.9.27 + v6.9.33 + v6.9.34 + v6.9.37 + v6.9.49) +- 登录/注册95key i18n(TAuth)、会话流100key i18n(TChatFlow)、备案信息i18n +- 功能分级标准FeatureAccessLevel(localOnly/cloudWithCloudSync/cloudRequired) +- 贡献者头像墙首字占位、阅读报告本地化、内容纠错邮箱验证码 -## [v6.10.4] - 2026-06-02 - -### 🌐 Me页面、缓存管理、账户洞察多语言支持 - -**变更:** 为三个核心页面添加完整多语言支持,覆盖项目全部14种语言。 - -**新增翻译类型:** -- ✅ `TAccountInsights` — 账户洞察页面翻译类型(26个字段) -- ✅ `TProfile` 扩展23个新字段(连续签到、收藏、点赞、每日签到、学习中心、成就中心、每日任务、排行榜、数据统计、我的笔记、内容纠错、我的设备、标签云、个人信息、用户名、昵称、个性签名、未设置、未填写、已设置、审核中、修改用户名、修改昵称) -- ✅ `TSettingsCache` 扩展61个新字段(存储空间、数据库、缓存条数、分类统计、各类缓存清理确认对话框、缓存策略、缓存上限、过期天数、离线模式、WiFi预加载、自动同步等) - -**页面组件修改:** -- ✅ `user_stats_bar.dart` — 积分/连续签到/收藏/笔记/点赞标签国际化 -- ✅ `quick_action_grid.dart` — 10个功能入口标题国际化 -- ✅ `editable_info_section.dart` — 个人信息区域标签国际化 -- ✅ `user_center_page.dart` — 传入翻译参数 -- ✅ `cache_management_page.dart` — 44处硬编码中文替换为翻译字段 -- ✅ `account_insights_sheet.dart` — 全部硬编码中文替换为翻译字段 - -**语言覆盖(14种):** -- zh_cn, en, ja, zh_tw, ko, de, it, es, ar, bn, hi, pt, ru, fr - -**涉及文件:** -- `lib/l10n/types/t_profile.dart` — 扩展23个字段 -- `lib/l10n/types/t_settings_cache.dart` — 扩展61个字段 -- `lib/l10n/types/t_account_insights.dart` — 新建 -- `lib/l10n/types/t_root.dart` — 注册accountInsights -- `lib/l10n/types/t.dart` — 导出新类型 -- `lib/l10n/translation_io_service.dart` — 更新_importProfile和T构造 -- `lib/l10n/languages/*.dart` — 14个语言文件更新 - -*** - -## [v6.10.3] - 2026-06-02 - -### 🌐 多语言翻译字段补全 - -**问题:** 新增 `roleNative`(原生栈)和7个分发渠道翻译字段后,10个非中英语言文件缺少这些字段导致编译 Error。 - -**修复方案:** -- ✅ 10个语言文件(es, fr, it, pt, ru, ar, hi, bn, ko, ja, zh_tw, de)补全8个 TAbout 字段 -- ✅ `roleNative` — 各语言原生栈翻译 -- ✅ `distributionChannel` — 分发渠道标题 -- ✅ `distAndroid/distIOS/distMacOS/distHarmony/distWeb/distWindows` — 各平台分发说明 -- ✅ fr.dart 双引号 lint 修复 - -**涉及文件:** -- `lib/l10n/languages/es.dart` — 西班牙语 -- `lib/l10n/languages/fr.dart` — 法语 -- `lib/l10n/languages/it.dart` — 意大利语 -- `lib/l10n/languages/pt.dart` — 葡萄牙语 -- `lib/l10n/languages/ru.dart` — 俄语 -- `lib/l10n/languages/ar.dart` — 阿拉伯语 -- `lib/l10n/languages/hi.dart` — 印地语 -- `lib/l10n/languages/bn.dart` — 孟加拉语 -- `lib/l10n/languages/ko.dart` — 韩语 -- `lib/l10n/languages/ja.dart` — 日语 -- `lib/l10n/languages/zh_tw.dart` — 繁体中文 -- `lib/l10n/languages/de.dart` — 德语 - -*** - -## [v6.10.2] - 2026-06-02 - -### 🔐 二维码扫码登录自动跳转 - -**问题:** Device A 扫描 Device B(登录页)的二维码后,Device A 显示"扫码成功"但 Device B 无响应,不会自动登录。 - -**根因:** 生成二维码后缺少轮询/WebSocket 监听机制,无法感知扫码确认状态变化。 - -**修复方案:** -- ✅ `qrcode_login_provider.dart` — 新增 `waiting`/`scanned`/`logging` 步骤,生成二维码后自动启动 HTTP 轮询(3秒间隔) + WebSocket 双通道监听 -- ✅ 收到 `confirmed` + `token` 后自动调用 `AuthService.tokenLogin(token)` 完成登录 -- ✅ `qrcode_ws_service.dart` — 处理 confirmed 状态携带 token 的推送,终态自动取消订阅 -- ✅ `qrcode_login_page.dart` — 新增状态指示器(等待扫码/已扫码/正在登录),登录成功后自动跳转首页 -- ✅ 切换 Tab / 退出页面时自动停止轮询,防止资源泄漏 - -**涉及文件:** -- `features/auth/providers/qrcode_login_provider.dart` — 核心轮询+自动登录逻辑 -- `features/auth/services/qrcode_ws_service.dart` — WS终态自动取消订阅 -- `features/auth/presentation/qrcode_login_page.dart` — UI状态指示+自动跳转 - -*** - -## [v6.10.1] - 2026-06-02 - -### 🐛 修复 iOS 离线模式 Syncfusion Chart 崩溃 - -**问题:** 点击"离线模式"或导航到含图表页面时,Syncfusion Chart 在 build/layout 阶段调用 `markNeedsLayout`,导致 "build during layout" 错误,App 卡死/闪退。 - -**根因:** Syncfusion Flutter Charts 已知 Bug — `ChartSeriesRenderer.markNeedsLayout` 在 widget 树构建期间被调用,违反 Flutter 渲染协议。 - -**修复方案:** -- ✅ 增强 `DeferredBuilder` — 添加 `RepaintBoundary` 隔离重绘 + 可选 `placeholder` 参数 -- ✅ 全项目 **21个文件、约35处** Syncfusion 图表全部用 `DeferredBuilder` 包裹,延迟到 `postFrameCallback` 渲染 -- ✅ 所有图表系列补齐 `animationDuration: 0`,防止动画触发 `markNeedsLayout` - -**涉及文件:** -- `shared/widgets/containers/deferred_builder.dart` — 增加 RepaintBoundary + placeholder -- `features/mine/user_center/` — learning_charts, learning_center_page, coin_log_page, learning_progress_page -- `features/tool_center/statistics/` — learning_stats_tab, coin_stats_tab, favorite_stats_tab, statistics_page -- `features/reading_report/` — trend_chart -- `features/file_transfer/` — transfer_speed_chart, transfer_stats_page -- `features/mine/achievement/` — achievement_page -- `features/check/` — check_page -- `features/discover/` — readlater_stats_page -- `features/home/` — history_page, favorite_page -- `features/tool_center/leisure/` — leisure_settings_sections -- `features/mine/settings/` — data_management_page, translate_plugin_page, permission_management_page - -*** - -## [v6.10.0] - 2026-06-02 - -### 🏗️ 架构优化 + 灵动岛增强 + Lint规则 + 应用图标 + 引导页协议多语言 - -**0. 协议页软件著作权证书图片 📜:** -- 🔄 协议内容"2.1 平台版权"→"2.1 软件著作权"(中文+英文同步修改) -- ✅ 新增 `WatermarkedCopyrightImage` 组件 — 展示软件著作权证书图片 -- ✅ 对角线"闲言"水印覆盖(CustomPaint + 旋转文字) -- ✅ 点击图片弹出全屏查看(InteractiveViewer 支持缩放) -- ✅ 通用协议页 + 引导页协议页 均支持图片展示 -- ✅ 图片右上角全屏提示标签 - -**1. 引导页协议多语言修复 🌐:** -- 🐛 修复引导页协议内容始终显示中文的问题 -- ✅ `AgreementData.getContent/getUpdateDate` 传入当前语言ID -- ✅ `agreementType.title` → `agreementType.titleFor(languageId)` 显示本地化标题 -- ✅ `_parseChapters` 章节解析兼容英文罗马数字编号(I. II. III. / Zero.) -- ✅ 新增 `_localeToLanguageId` 方法将 Flutter Locale 映射为协议语言ID -- ✅ 支持14种语言的协议内容、标题、更新日期自动切换 - -**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 \ No newline at end of file +#### 鸿蒙适配 & 开发工具 (v6.9.20 + v6.9.24 + v6.9.38 + v6.9.40 + v6.9.42 + v6.9.51) +- module.json5权限审计(移除9个system级权限)、schema校验修复、receive_sharing_intent配置 +- bitsdojo_window→window_manager迁移、win32 6.x API迁移、Swift条件编译修复 +- Android配置一致性检查脚本、翻译覆盖率检测Python脚本(1304键基准)、CanvasProvider单元测试(42用例)