Files
xianyan/CHANGELOG.md

1838 lines
102 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。
***
## [v6.16.3] - 2026-06-04
### 🐛 Hive降级初始化 — 解决iOS模拟器objective_c库导致整个Hive系统瘫痪
#### 根因分析
`Hive.initFlutter()`内部调用`getApplicationDocumentsDirectory()`在iOS模拟器上因objective_c库加载失败而抛出ArgumentError。
之前的修复只是让app不崩溃降级模式但Hive完全不可用导致壁纸页面、缓存管理页面等所有依赖Hive的功能无数据。
#### 修复内容
- **HiveSafeAccess.ensureInitialized()** — `Hive.initFlutter()`失败时,降级使用`Hive.init()`+手动获取路径(`getApplicationDocumentsDirectory()`失败则用`Directory.systemTemp.path`
- 这样Hive可以在iOS模拟器上正常工作使用临时目录所有依赖Hive的服务壁纸、缓存、设置等恢复正常
#### 修改文件
- `hive_safe_access.dart`
***
## [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/refwidget 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`
***
## [v6.15.0] - 2026-06-04
### 🐛 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直接调用异步方法访问refwidget dispose后仍操作element
- **修复:** 添加`_disposed`标志+dispose()方法initState改用addPostFrameCallback所有ref/setState前检查mounted和disposed添加5秒超时保护
- **修改文件:** `widget_management_page.dart`
### 🔍 验收审计 - 举一反三分析
审计发现项目存在以下系统性风险模式:
| 风险类别 | 高危数 | 中危数 | 低危数 | 合计 |
|---------|-------|-------|-------|------|
| 异步生命周期(ref/setState无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** |
**已修复的举一反三问题:**
- ✅ 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.14.0] - 2026-06-04
### 🎴 日签卡片 AR 3D 展示效果 (Issue #9)
**背景:** 日签卡片页面缺乏沉浸式展示体验,用户希望在 AR 空间中查看悬浮的日签卡片,增强视觉冲击力和分享欲望。
**技术方案:** 采用伪AR效果方案 — 使用 Flutter 的 3D 变换和设备传感器模拟 AR 体验,无需原生 ARKit/ARCore 集成。
**实现内容:**
- ✅ 创建 `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` — 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 倾斜交互库
***
## [v6.13.0] - 2026-06-04
### 🔧 鸿蒙原生层修复 + iOS Widget深度定制 (Issue #2, #8)
#### 任务A: 鸿蒙原生层修复 (Issue #2)
**问题A1: 桌面Widget长按图标不显示按钮列表**
- **原因:** 鸿蒙FormPage只使用`.onClick()`处理点击事件,没有实现长按手势或上下文菜单
- **修复内容:**
- ✅ 为所有FormPage添加`.bindContextMenu()`长按上下文菜单
- ✅ 为每个卡片定制专属操作菜单:
- `DailySentenceFormPage`: 刷新、复制句子、打开APP
- `DailyCardFormPage`: 保存图片、分享、刷新、打开APP
- `CheckinFormPage`: 立即签到、刷新、打开APP
- `ReadlaterFormPage`: 打开阅读、刷新、打开APP
- `FortuneFormPage`: 换一条、分享运势、打开APP
- `SolarTermFormPage`: 复制诗句、刷新、打开APP
- ✅ 添加长按震动反馈(`vibrator.vibrate()`
**修改文件:**
- `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`
**问题A2: 日签卡片保存按钮无反应**
- **原因:** `gal` (gallery_saver) 插件不支持OHOS平台
- **修复内容:**
- ✅ 修改 `export_io_native.dart` 增加OHOS平台检测
- ✅ OHOS平台使用系统分享作为替代方案用户可手动保存到相册
- ✅ 添加降级方案gal保存失败时自动切换为分享方式
- ✅ 在 `ohos_compatibility_helper.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<T>(name)` 方法自动检查并初始化带重试机制默认3次
- ✅ 提供 `ensureOpen(name)` / `tryGetBox<T>(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
- ✅ 扫描结果智能处理URL自动打开浏览器、WiFi密码一键复制、文本复制到剪贴板
- ✅ 添加闪光灯开关、从相册选择图片识别等辅助功能
- ✅ Cupertino风格扫描界面支持动态主题
- ✅ 在路由注册表添加 `/qrcode-scanner` 路由
- ✅ 修改 `profile_page.dart`,将"开发中..."替换为跳转到扫码页面
**新增文件:**
- `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` 权限
- 添加 `<uses-feature android.hardware.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用于快速集成
***
## [v6.10.5] - 2026-06-02
### 🧭 修复多个页面缺少AppBar标题和返回按钮
**问题:** 多个页面使用 `AdaptiveBackButton` 但当 `canPop()` 为 false 时按钮消失,或缺少 `middle` 标题导致导航栏空白;部分页面使用自定义导航栏而非标准 `CupertinoNavigationBar`,风格不统一。
**修复内容:**
-`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`
**涉及文件:**
- `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.5] - 2026-06-02
### 🏗️ pubspec.yaml 双模板机制(重大架构变更)
**背景:** 鸿蒙端和 MacBook Pro 端共用一个 `pubspec.yaml`MacBook Pro 端每次 `git pull` 后需手动替换 82 行本地包引用,容易出错且经常互相覆盖。
**核心变更:**
- 🏗️ `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`
**新增文件:**
- 📄 `pubspec.ohos.yaml` — 鸿蒙端模板(使用本地 packages/ 目录)
- 📄 `pubspec.macos.yaml` — MacBook Pro 端模板(使用远程版本号)
- 🛠️ `tools/setup_pubspec.ps1` — 平台模板生成脚本
**修改文件:**
- `.gitignore` — 新增 `/pubspec.yaml` + `/pubspec.lock`
- `iOS_macOS_Developer_Guide.md` — v7 全面重写 §2 章节(双模板机制 + 变更流程)
**迁移指南:**
- 鸿蒙端:`.\tools\setup_pubspec.ps1 -Platform ohos``flutter pub get`
- MacBook Pro端`.\tools\setup_pubspec.ps1 -Platform macos``flutter pub get`
***
## [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<bool>` 检查
- `GetClipboardData()``Win32Result<HANDLE>`HANDLE → HGLOBAL 类型转换
- `GlobalAlloc` / `GlobalLock` / `GlobalUnlock` / `GlobalFree``Win32Result<T>` 检查
- `SetClipboardData(id, handle.address)``SetClipboardData(id, HANDLE(handle))`
- `TEXT('ms-photos:')``'ms-photos:'.toPcwstr()`
- `RegisterClipboardFormat``Win32Result<int>` 检查
- `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` — 删除与新字段冲突的废弃getteraccountSettings/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-catchAndroid 端不支持时抛出 `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` — 协作服务改用自建APIRealtime订阅改为轮询机制
- 🔄 `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返回404PHP直接运行正常需在宝塔面板添加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.copyWithclearCanvasId/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.xmlextra 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` — 在 `<application>` 标签添加 `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-catchFeed 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