# Changelog 所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。 *** ## [v14.99.0] - 2026-05-22 ### 新增 — 主题令牌审计工具增强 **Feature: 主题令牌自动审计引擎** - 🆕 `theme_audit.dart` 重构为可编程审计引擎 `ThemeAuditEngine` - `AuditCategory` 枚举 — 违规类别 (color/spacing/radius/fontSize) - `AuditViolation` 数据类 — 记录 filePath/lineNumber/category/currentCode/suggestion - `AuditSummary` 汇总类 — 按类别统计违规数/涉及文件数/总数 - `ThemeAuditEngine` 审计引擎 — 扫描 lib/ 下所有 .dart 文件 - `runAudit()` 方法 — 执行全量审计,返回 AuditSummary - 颜色检测: `Color(0x...)` / `CupertinoColors.xxx` / `Colors.xxx` / `'#FF0000'` 十六进制字符串 - 间距检测: `SizedBox(height: N)` / `EdgeInsets.all(N)` / `EdgeInsets.symmetric(...)` 非令牌值 - 圆角检测: `BorderRadius.circular(N)` / `Radius.circular(N)` 非令牌值 - 字号检测: `fontSize: N` 非令牌值 - 白名单排除: `lib/core/theme/` / `lib/l10n/` / `*.g.dart` / `*.freezed.dart` / 主题定义文件 - 智能建议: 自动匹配最近令牌值,输出修复建议 - 🆕 `scripts/theme_audit.dart` CLI 审计脚本 - `dart run scripts/theme_audit.dart` — 运行全量审计 - `--category=color|spacing|radius|fontSize` — 按类别过滤 - `--fix-hints` — 显示修复建议 - `--json` — JSON 格式输出 (CI 集成) - `--help` — 帮助信息 - 退出码: 0=无违规, 1=有违规 (CI 集成) - ✏️ `theme_audit.dart` — 原有文档注释保留,新增审计引擎代码 **举一反三**: - 审计引擎可在 Flutter 应用内调用 `ThemeAuditEngine().runAudit()` 展示审计结果 - CLI 脚本可集成到 CI/CD 流水线,确保新代码不引入硬编码令牌 - 后续可扩展 `AuditCategory` 添加更多检测维度 (如 fontWeight/shadow/animation duration) *** ## [v14.98.0] - 2026-05-22 ### 新增 — 自定义页面转场动画 + 设备信息缓存刷新 + 字体下载服务提取 **Feature 1: 自定义页面转场动画** - 🆕 `app_page_transitions.dart` 自定义PageRouteBuilder转场动画 - `AppSlideTransition` — iOS风格从右滑入+轻微淡入,350ms,Curves.easeOutCubic - `AppFadeScaleTransition` — 淡入+缩放(0.95→1.0),300ms,Curves.easeOut,适用于模态/Sheet页面 - `instantTransition` — 减少动画模式下的即时转场(Duration.zero) - `resolveTransition(ref)` — 根据generalSettingsProvider的reduceAnimations和pageTransitionMode自动选择转场 - `resolveTransitionFromContext(context)` — 无WidgetRef时从ProviderScope.containerOf读取设置 - ✏️ `app_nav_extension.dart` — `appPush` 新增可选 `transitionMode` 参数,鸿蒙端使用自定义转场 - ✏️ `ohos_nav_bridge.dart` — `push`/`replace` 从CupertinoPageRoute改为自定义转场 - `push` 新增 `transitionMode` 参数,支持调用方指定转场类型 - `replace` 使用 `resolveTransitionFromContext` 自动选择转场 - 新增 `general_settings_provider.dart` 和 `app_page_transitions.dart` 导入 **Feature 2: 设备信息缓存刷新** - 🆕 `device_info_service.dart` 新增 `refresh()` 方法 - 清除缓存 → 重新读取平台设备信息 → 更新缓存 → 如果之前已注册则重新注册到服务端 - 解决 `initCache()` 使用 `??=` 只初始化一次的问题 - 🆕 `device_info_service.dart` 新增 `clearCache()` 方法 - 仅清除 `_cachedDeviceModel` 和 `_cachedDeviceName`,不重新注册 - 适用于设备信息变更但不需要立即注册的场景 **Feature 3: 字体下载服务提取** - 🆕 `font_download_service.dart` 独立字体下载服务 - `FontDownloadService.downloadFont()` — 从URL下载字体(含重试+降级+进度回调) - `FontDownloadService.downloadFontFromUrl()` — URL方式下载(含重试+验证) - `FontDownloadService.importLocalFonts()` — 本地文件导入(含格式验证) - `FontDownloadService.loadFontIntoEngine()` — 字体加载到Flutter引擎 - `FontDownloadService.isValidFontFile()` — TTF/OTF/TTC文件头验证(公开方法) - `FontDownloadService.getFontDirectory()` — 获取字体目录(公开方法) - `FontDownloadResult` — 下载结果数据类(success/savePath/fileSize/errorMsg/fontFamily/displayName) - `ProgressCallback` — 进度回调类型定义 - ✏️ `font_management_notifier.dart` — 下载逻辑委托给FontDownloadService - `downloadFont()` → 调用 `FontDownloadService.downloadFont()` + 进度回调更新状态 - `downloadFontFromUrl()` → 调用 `FontDownloadService.downloadFontFromUrl()` + 进度回调 - `importFont()` → 调用 `FontDownloadService.importLocalFonts()` + 加载引擎 - `_loadDynamicFonts()` → 调用 `FontDownloadService.loadFontIntoEngine()` - `_getFontDirectory()` → 委托 `FontDownloadService.getFontDirectory()` - 移除 `_dio`、`_isValidFontFile`、`_loadFontIntoEngine` 私有方法(已提取到Service) - Notifier仅管理状态,不直接处理下载/验证/文件IO逻辑 **举一反三**: - 自定义转场可在 `appPush` 调用时通过 `transitionMode` 参数覆盖默认设置,如:`context.appPush('/settings', transitionMode: PageTransitionMode.sheet)` - `DeviceInfoService.refresh()` 可在设备信息变更后调用(如系统更新、设备重命名),确保服务端设备信息同步 - `FontDownloadService` 为纯静态服务类,后续可扩展为实例类+依赖注入,便于单元测试mock *** ## [v14.97.0] - 2026-05-22 ### 新增 — 工具中心弹性回弹 + BottomSheet 手势冲突修复 **Feature 1: 工具中心弹性回弹效果** - 🆕 `home_tool_center.dart` 顶部滑入动画改用 `SpringSimulation` 弹簧物理 - 参数:`SpringDescription(mass: 1, stiffness: 400, damping: 15)`,阻尼比 0.375(欠阻尼),约 5% 过冲后回弹 - 展开动画:`_animationController.animateWith(SpringSimulation(...))`,自然弹性回弹 - 收起动画:`_animationController.animateTo(0, curve: Curves.easeInCubic)`,平滑减速无回弹 - `transitionDuration` 从 400ms 调整为 600ms 适配弹簧动画时长 - 移除 `_slideAnimation` CurvedAnimation,直接使用 `_animationController` 驱动 SlideTransition - `_backdropAnimation` 保持 `CurvedAnimation(Curves.easeOut)`,由 CurvedAnimation 内部 clamp 保证不超调 - 🆕 新增 `import 'package:flutter/physics.dart'` **Feature 2: BottomSheet ScrollView 嵌套手势冲突修复** - 🆕 `bottom_sheet.dart` 新增 `ScrollAwareSheetContent` 组件 - `NotificationListener` 跟踪内部滚动位置 - `NotificationListener` 非顶部时禁用 overscroll 指示器 - `NotificationListener` 非顶部时消费向下 overscroll 通知,防止误触关闭面板 - 配合 `stupid_simple_sheet` 的 `ScrollDragDetector`(`onlyDragWhenScrollWasAtTop: true`)双重保护 - 🆕 `AppBottomSheet.showCustom` 新增 `scrollAware` 参数(默认 false) - 🆕 `AppBottomSheet.showHalf` 新增 `scrollAware` 参数(默认 false) - 使用方式:`AppBottomSheet.showCustom(context: ctx, builder: ..., scrollAware: true)` **举一反三**: - 后续新增含 ListView/ScrollView 的 BottomSheet 内容时,应设置 `scrollAware: true` - 弹簧参数可根据不同场景调整:stiffness 越大回弹越快,damping 越大回弹越小 - `SpringSimulation` 也可应用于其他面板/弹窗的入场动画,替代 `Curves.easeOut*` *** ## [v14.96.0] - 2026-05-22 ### 新增 — 画布样式编辑器三大交互功能 **文件**: `lib/editor/widgets/panels/canvas_style_sheet.dart` **Feature 1: 样式预设模板** - 🆕 顶部新增「样式预设」横向滚动区域 - 提供 5 种预设风格:🃏卡片风 / ✨极简风 / 🧊毛玻璃风 / 📜复古风 / 💡霓虹风 - 每个预设芯片含迷你预览卡片 + emoji名称 - 点击预设一键应用全部样式值 - 当前激活预设显示 ✓ 勾选标记 - `_StylePreset` 数据模型 + `_buildPresets()` 工厂函数 + `_matchesPreset()` 匹配逻辑 **Feature 2: 拖拽调整圆角** - 🆕 圆角区域新增「拖拽手柄」CupertinoSwitch 开关 - 开启后预览卡片四角显示 12×12 半透明圆形手柄 - 拖拽手柄向内增大圆角、向外减小圆角 - 四角联动,拖拽任一手柄同步更新所有角 - `_CornerHandle` 组件:基于对角线投影计算半径变化量 - 手柄视觉:accent色60%透明 + 白色1.5px描边 + 阴影 **Feature 3: 取色器(Eyedropper)** - 🆕 边框颜色行新增 👁 取色按钮 - 点击进入取色模式,Header 切换为「取色中」状态标签 - 预览区覆盖半透明遮罩 + 「👆 点击取色」提示 - 触摸/滑动实时采样像素颜色,显示放大镜效果(圆形色块 + 十字准星 + HEX值) - 释放手指或点击确认取色,自动应用并退出取色模式 - `_CapturedImageData` 缓存 + `RepaintBoundary.toImage()` + RGBA字节采样 - `_EyedropperOverlayPainter` 自定义画笔绘制放大镜 **设计规范**: - 全部使用 `AppTheme.ext(context)` 主题令牌,支持动态主题 - iOS Cupertino 风格组件(CupertinoSwitch / CupertinoIcons) - 遵循 AppSpacing / AppRadius / AppTypography 设计系统 *** ## [v14.95.0] - 2026-05-22 ### 重构 — my_devices_page.dart 拆分子组件 **问题**:`my_devices_page.dart` 超过 1170 行,远超 1000 行限制,维护困难。 **拆分方案**: - 🆕 `devices/device_utils.dart` — 工具函数(平台图标/颜色/名称/认证/剪贴板/确认弹窗) - 🆕 `devices/device_overview_card.dart` — 设备概览卡片 + 文件传输入口卡片 - 🆕 `devices/device_card.dart` — 设备卡片 + 分区标题头组件 - 🆕 `devices/device_detail_sheet.dart` — 设备详情底部弹窗 + 信息行组件 - ✏️ `my_devices_page.dart` — 主页面精简至 ~400 行,导入并使用子组件 **组件接口**: - `DeviceOverviewCard(state)` — 接收 DeviceState 显示概览 - `FileTransferEntry(onTap)` — 文件传输入口 - `DeviceCard(device, isOnline, onTap, onRename)` — 单个设备卡片 - `DeviceSectionHeader(title, count, isOnline)` — 分区标题 - `showDeviceDetailSheet(context, device, isOnline, isCurrent, onRename, onOffline, onRemove)` — 详情弹窗 - `DeviceInfoRow(icon, label, value, trailing)` — 信息行 - 工具函数:`getPlatformIcon/Color/Emoji/Label`, `getDisplayDeviceName`, `getFriendlyModel`, `authenticate`, `copyToClipboard`, `showConfirmDialog` *** ## [v14.94.0] - 2026-05-22 ### 重构 — 合并 NotificationScheduler + DailyNotifyService → NotificationCenter **问题**:`NotificationScheduler` 和 `DailyNotifyService` 存在功能重叠,两者都管理每日通知调度,且 ID 命名空间可能冲突(DailyNotifyService 使用 ID 2000,与 NotificationScheduler 的节气 ID 2001 相邻)。 **合并方案**: - 🆕 新增 `NotificationCenter`(`lib/core/services/notification/notification_center.dart`),统一管理所有本地通知调度 - 🔴 `NotificationScheduler` 标记 `@Deprecated`,保留文件但不再使用 - 🔴 `DailyNotifyService` 标记 `@Deprecated`,保留文件但不再使用 **NotificationCenter 统一管理**: - 全局通知开关 `setNotificationsEnabled` / `isNotificationsEnabled` - 每日推荐 `setDailyRecommendEnabled` / `setDailyRecommendTime` - 签到提醒 `setSigninReminderEnabled` / `setSigninReminderTime` - 节气通知 `setSolarTermEnabled` - 每日运势 `setFortuneEnabled` / `setFortuneTime` - 学习进度 `setStudyProgressEnabled` - 稍后读 `isReadlaterEnabled` / `setReadlaterEnabled` - 统一 ID 命名空间:1001(推荐) 1002(签到) 1003(运势) 1004(学习) 2001(节气) - `configureAll()` — 一键调度所有已启用通知 - `cancelAllManaged()` — 取消所有受管理的通知 **消费者更新**: - `general_settings_provider.dart` — 替换 `NotificationScheduler`/`DailyNotifyService` → `NotificationCenter` - `notification_settings_page.dart` — 替换所有 `NotificationScheduler` 调用 → `NotificationCenter` - `local_notification_service.dart` — 替换 `NotificationScheduler.isNotificationsEnabled` → `NotificationCenter.isNotificationsEnabled` **举一反三**: - 新增通知类型时只需在 `NotificationCenter` 中添加 ID 常量、存储键、getter/setter 和 `_configureXxx` 方法 - ID 命名空间统一管理,避免不同服务间的 ID 冲突 - 所有通知调度入口统一为 `configureAll()`,确保状态一致性 *** ## [v14.93.0] - 2026-05-22 ### 安全 — 移除3个高敏感权限,降低应用商店审核风险 **问题**:`AppPermission` 枚举包含3个高敏感/受限权限,可能导致应用商店审核被拒: - `systemAlertWindow`(悬浮窗)— 大多数应用商店拒绝请求此权限的应用 - `contacts`(通讯录)— 高度敏感,非核心功能不需要 - `ignoreBatteryOptimization`(忽略电池优化)— 受限权限,Google Play要求特殊理由 **移除**: - 🔴 `systemAlertWindow` — 移除枚举值及 `isPlatformRelevant` 判断 - 🔴 `contacts` — 移除枚举值 - 🔴 `ignoreBatteryOptimization` — 移除枚举值及 `isPlatformRelevant` 判断 **平台配置检查**(均无需修改): - ✅ AndroidManifest.xml — 未声明 SYSTEM_ALERT_WINDOW / READ_CONTACTS / REQUEST_IGNORE_BATTERY_OPTIMIZATIONS - ✅ Info.plist — 未声明 NSContactsUsageDescription - ✅ macOS entitlements — 未声明通讯录权限 - ✅ module.json5 — 未声明通讯录权限 **剩余权限审查**(10项,均合理保留): - camera / photos / notification — 必要权限,核心功能 - location — 已使用粗略位置(城市级),最小化方案 - bluetooth / nearbyDevices — 文件传输核心功能 - microphone — 仅语音功能使用时请求,已正确门控 - storage — 仅 Android SDK≤32 需要,已正确门控 - network / clipboard — 虚拟权限,仅信息展示 **举一反三**: - 新增权限时需评估应用商店审核风险,高敏感权限应避免或提供替代方案 - 悬浮窗功能可改用应用内浮层(Overlay)替代系统悬浮窗 - 通讯录功能可改用邀请码/链接分享替代直接读取通讯录 - 电池优化可改用 WorkManager 周期任务替代前台服务+电池优化豁免 *** ## [v14.92.0] - 2026-05-22 ### 修复 — 引导页空壳功能实现 + PC端宽屏布局溢出 **Issue 1: 引导页空壳功能实现** - `welcome_page.dart`: 新增"扫一扫"功能卡片;所有功能卡片添加点击提示(AppToast),扫一扫提示"引导完成后可在首页工具中心使用扫一扫" - `agreement_page.dart`: "权限说明"Tab从纯文本改为权限列表展示,使用`AppPermission`枚举显示图标、名称、描述、必要/系统级标签 - `personalization_page.dart`: 功能开关同步`generalSettingsProvider`持久化 - "摇一摇换句" → `setShakeToSwitch()` - "特效背景" → 新增开关 + `setShaderBackground()` - "音效反馈" → `setSfxEnabled()` - `personalization_page.dart`: 字体大小滑块同步更新`generalSettingsProvider.fontScaleId` - `agreement_page.dart`: "跳过引导"按钮改为`async`,先调用`completeOnboarding()`保存状态再导航 - `onboarding_provider.dart`: 新增`shaderBackground`字段;`completeOnboarding()`同步设置到`generalSettingsProvider` - `onboarding_constants.dart`: `coreFeatures`新增"扫一扫"条目 **Issue 2: PC端宽屏布局溢出修复** - `onboarding_page.dart`: 使用`LayoutBuilder`检测屏幕宽度;>900px时左右分栏布局(左侧角色+品牌,右侧PageView内容500px宽);≤900px保持原有纵向布局 - `welcome_page.dart`: `Center`+`ConstrainedBox(maxWidth:600)`约束内容宽度;宽屏时功能卡片2列`Wrap`布局 - `agreement_page.dart`: `Center`+`ConstrainedBox(maxWidth:600)`约束内容宽度 - `personalization_page.dart`: `Center`+`ConstrainedBox(maxWidth:600)`约束内容宽度;预览卡片`maxWidth:400`居中 - 所有子页面移除重复`SafeArea`(父级`onboarding_page.dart`已有) **举一反三**: - 宽屏布局断点统一为900px,后续新增引导页也需遵循此约束 - 功能开关需同时更新`onboardingProvider`(UI状态)和`generalSettingsProvider`(持久化),避免引导完成后设置丢失 - 权限列表使用`AppPermission.isPlatformRelevant`过滤,自动适配不同平台 *** ## [v14.91.0] - 2026-05-22 ### 修复 — 字体大小导航 + 设备识别增强 **Issue 1: 字体大小按钮无响应** - `general_settings_page.dart`: `_onNavigate` 方法新增 `font_scale` case,导航到字体管理页面 (`AppRoutes.fontManagement`) **Issue 2: 设备识别显示"unknown"** - `device_info_service.dart` 大幅增强: - 新增品牌中文名映射表 (`_brandNameMap`):华为/荣耀/小米/红米/OPPO/vivo/一加/真我/魅族/三星/中兴/联想/摩托罗拉等30+品牌 - 新增热门型号友好名称映射表 (`_modelNameMap`):华为Mate/P系列、小米14/13/12系列、OPPO Find/Reno系列、vivo X/S系列、三星Galaxy S/Note/Z系列等100+型号 - 新增iOS设备型号映射表 (`_iosModelMap`):iPhone 8~16 Pro Max、iPad Pro/Air/mini等40+型号 - `getDeviceModel()` 改进:优先使用友好名称,回退到品牌中文名+型号代码,不再返回"HarmonyOS Device"或"unknown" - `getDeviceName()` 改进:优先使用友好名称,回退到品牌中文名,不再返回"Unknown" - `getDeviceId()` 改进:失败时生成稳定UUID并缓存到SharedPreferences,避免每次启动生成不同ID导致重复注册 - 新增公开方法 `getBrandChineseName()`、`getModelFriendlyName()` 供其他模块调用 **Issue 2 续: 我的设备页面展示优化** - `my_devices_page.dart` 改进: - `_getPlatformIcon()`: macOS/Linux使用 `desktopcomputer`,区分桌面平台 - 新增 `_getPlatformEmoji()`: 鸿蒙设备显示"鸿蒙"标签,Android显示🤖 - 新增 `_getDisplayDeviceName()`: 优先使用友好型号名称,回退到deviceName - 新增 `_getFriendlyModel()`: 详情Sheet中设备型号显示友好名称 - `_platformLabel()`: 鸿蒙平台显示"HarmonyOS 🪶" - 设备卡片和详情Sheet统一使用友好名称展示 **举一反三**: - 新增手机型号时需同步更新 `_modelNameMap`,建议定期补充新款机型 - iOS型号映射需跟随苹果新品发布更新 - 品牌映射表可扩展至海外品牌(如ASUS ROG、Nothing等已包含) *** ## [v14.90.0] - 2026-05-22 ### 新增 — 权限管理页面补全7项基础权限 **问题**:`AppPermission` 枚举仅有6个权限(相机/相册/通知/位置/蓝牙/附近设备),缺少麦克风、存储、电池优化、悬浮窗、通讯录等基础权限,也未展示网络和剪贴板等系统级能力。 **新增权限**: - 🎤 `microphone` — 麦克风:语音朗读、语音搜索、AI对话语音输入 - 📁 `storage` — 存储空间:保存卡片、字体下载、数据导出(Android 12及以下) - 🔋 `ignoreBatteryOptimization` — 忽略电池优化:确保通知准时推送、后台同步(Android only) - 🪟 `systemAlertWindow` — 悬浮窗:番茄钟/阅读计时悬浮窗(Android only) - 👥 `contacts` — 通讯录:好友发现、邀请好友 - 🌐 `network` — 网络连接(虚拟权限):展示网络连接状态 - 📋 `clipboard` — 剪贴板(虚拟权限):展示剪贴板访问状态 **架构变更**: - `AppPermission` 枚举新增 `isVirtual` 布尔字段,区分真实权限和虚拟权限 - 虚拟权限使用 `Permission.notification` 作为占位符(不实际请求) - `PermissionService.checkStatus()` 对虚拟权限直接返回 `granted` - `PermissionService.checkAllStatus()` 过滤平台不相关权限(iOS不显示storage/batteryOptimization/systemAlertWindow) - `AppPermission.isPlatformRelevant` getter:storage仅Android SDK≤32显示,batteryOptimization/systemAlertWindow仅Android显示 - `PermissionService.requestPermission()` 虚拟权限直接返回 `true`,不发起请求 - `PermissionService.requestMicrophone()` 快捷方法 **UI变更**: - 权限管理页面分为两个区域:「📱 应用权限」和「⚙️ 系统级能力」 - 虚拟权限显示紫色「系统级」标签(含齿轮图标),替代「必要/可选」标签 - 虚拟权限右侧显示灰色信息图标(不可点击),替代「请求/去设置」按钮 - `_buildCategoryBadge()` 方法统一处理必要/可选/系统级三种标签 **举一反三**: - 新增权限时需考虑平台差异:Android特有权限需在 `isPlatformRelevant` 中过滤 - 虚拟权限模式可扩展至其他系统级能力(如NFC、生物识别等) *** ## [v14.89.0] - 2026-05-22 ### 重构 — 统一状态栏样式管理 **问题**: 1. 状态栏样式在多处分散设置(main.dart/app.dart/app_shell.dart/ohos_app_shell.dart/editor_system_ui.dart/pro_editor_bridge.dart),导致不同页面/设备状态栏图标颜色不一致 2. main.dart 硬编码 `Brightness.dark` 状态栏图标,不响应主题切换,深色模式下图标不可见 3. app_shell.dart 和 ohos_app_shell.dart 各自设置 `AnnotatedRegion`,覆盖 app 层设置 4. 沉浸式状态栏开关(display_settings_provider)仅存储布尔值,不调用 `SystemChrome.setEnabledSystemUIMode`,开关无实际效果 5. 编辑器退出时 `_applyDefaultOverlayStyle` 硬编码深色图标,与当前主题不匹配 **修复**: - 新增 `lib/core/services/ui/status_bar_service.dart`: - `StatusBarService` 集中管理类:`resolveStyle(isDark)` 统一生成 `SystemUiOverlayStyle`,`applyStyle(isDark)` 直接应用,`setImmersive(bool)` 切换沉浸式/edgeToEdge 模式 - `StatusBarStyleRegion` Widget:封装 `AnnotatedRegion`,供 app 层使用 - `app.dart`: - 两处 `AnnotatedRegion` 替换为 `StatusBarStyleRegion(isDark: settings.isDark)` - 移除 `flutter/services.dart` 导入 - `app_shell.dart`: - 移除 `AnnotatedRegion` 包裹,让 app 层统一管理 - 移除 `flutter/services.dart` 导入 - `ohos_app_shell.dart`: - 同上,移除 `AnnotatedRegion` 包裹和 `flutter/services.dart` 导入 - `main.dart`: - 移除 `SystemChrome.setSystemUIOverlayStyle()` 硬编码调用,仅保留 `setEnabledSystemUIMode(edgeToEdge)` - `editor_system_ui.dart`: - `enterEditor`/`exitEditor`/`updateForTheme` 改用 `StatusBarService.applyStyle()` 和 `StatusBarService.enterEdgeToEdge()` - 移除 `_applyOverlayStyle`/`_applyDefaultOverlayStyle` 私有方法 - `pro_editor_bridge.dart`: - `MainEditorStyle.uiOverlayStyle` 改用 `StatusBarService.resolveStyle(isDark:)` - 移除 `flutter/services.dart` 导入 - `display_settings_provider.dart` + `general_settings_provider.dart`: - `setImmersiveStatusBar` 新增 `StatusBarService.setImmersive(v)` 调用,开关实际生效 **举一反三**: - 所有 `SystemUiOverlayStyle` 使用现在集中在 `StatusBarService`,后续修改状态栏行为只需改一处 - `StatusBarStyleRegion` 作为 Widget 可响应主题变化,确保状态栏图标颜色始终与当前主题匹配 - 沉浸式模式使用 `SystemUiMode.immersiveSticky`(用户滑出后自动隐藏),退出沉浸式恢复 `edgeToEdge` *** ## [v14.88.0] - 2026-05-22 ### 新增 — 桌面端返回按钮 + 键盘快捷键 **功能**: 1. 桌面端(Windows/macOS/Linux) CupertinoNavigationBar 自动显示返回按钮 2. 键盘快捷键返回:Alt+Left(Windows/Linux) / Cmd+Left(macOS) 3. 移动端(Android/iOS/鸿蒙)不显示返回按钮,依赖系统手势 **实现**: - `adaptive_back_button.dart`: - 检测 `pu.isDesktop`,桌面端且可 pop 时显示 `CupertinoIcons.chevron_left` 返回按钮 - 移动端返回 `SizedBox.shrink()`,不影响系统手势返回 - 使用 `AppTheme.ext(context).accent` 主题色 - `keyboard_back_handler.dart`: - 使用 `Shortcuts` + `Actions` 注册 Alt+Left / Cmd+Left 快捷键 - 通过 `rootNavigatorKey.currentState` 访问 Navigator,无需在 Navigator 子树内 - 仅桌面端激活 - `app.dart`: - 在 `ScreenUtilInit` builder 外层包裹 `KeyboardBackHandler` - 79个页面文件: - 所有无 `leading:` 的 CupertinoNavigationBar 添加 `leading: const AdaptiveBackButton()` - 已有 `leading:` 的页面不重复添加(如 crash_log_page 选择模式切换) **举一反三**: - 桌面端 UX 需额外考虑键盘快捷键和鼠标交互,后续可扩展更多快捷键 - `AdaptiveBackButton` 模式可推广到其他平台差异化 UI 组件 *** ## [v14.87.0] - 2026-05-22 ### 修复 — 引导页在鸿蒙端不显示 **问题**: 1. 鸿蒙端使用 `MaterialApp(home: OhosAppShell())` 而非 `MaterialApp.router(routerConfig: appRouter)`,GoRouter 的 `_resolveInitialLocation()` 引导页判断逻辑从未执行 2. `OhosAppShell` 直接渲染 Tab 页面,完全跳过引导页检查 3. `OhosNavBridge._routes` 路由注册表缺少 `/onboarding` 路由 4. `onboarding_provider.dart` 中 `completeOnboarding()` 写入键名 `'show_on_next_launch'`,但 `KvStorage.shouldShowOnboarding` 读取键名 `'show_onboarding'`,键名不匹配导致引导页状态无法正确持久化(影响所有平台) **修复**: - `ohos_app_shell.dart`: - `initState` 新增 `_checkOnboarding()` 方法,检查 `KvStorage.isFirstLaunch` 和 `KvStorage.shouldShowOnboarding` - 首次启动或需要显示引导页时,通过 `Navigator.push()` 推送 `OnboardingPage` - 引导页完成后 `context.appGo(AppRoutes.home)` 自动 pop 回 Shell 并切换 Tab - 新增 `KvStorage` 和 `OnboardingPage` 导入 - `ohos_nav_bridge.dart`: - 路由注册表新增 `/onboarding` → `OnboardingPage` 条目 - 新增 `OnboardingPage` 导入 - `onboarding_provider.dart`: - `completeOnboarding()` 中 `setBool('show_on_next_launch', ...)` → `KvStorage.setShowOnboarding(...)`,修复键名不匹配 Bug - `app_router.dart`: - `_resolveInitialLocation()` 鸿蒙端引导页路径增加详细日志 **举一反三**: - 鸿蒙端因不使用 GoRouter,所有依赖 GoRouter `initialLocation`/`redirect` 的逻辑都需要在 `OhosAppShell` 中单独实现 - 新增路由时必须双写:`app_router.dart`(GoRouter)+ `ohos_nav_bridge.dart`(鸿蒙注册表) - `KvStorage` 便捷方法(如 `setShowOnboarding`)应优先使用,避免直接 `setBool(硬编码键名)` *** ## [v14.86.0] - 2026-05-22 ### 修复 — 编辑器画布样式圆角+图标+中间件 **问题**: 1. 顶部导航栏「工具抽屉」和「画布样式」按钮显示问号图标(`sidebar_left`/`rectangle` 未注册到 `EditorIconData.cupertinoMapping`) 2. 画布样式面板圆角设置仅影响预览卡片,不作用于实际画布 3. `canvas_style_sheet.dart` 中硬编码间距/圆角值,未使用主题令牌 4. 画布样式面板头部图标和边框区域图标不够语义化 **修复**: - `editor_icons.dart`: - `cupertinoMapping` 新增 `sidebar_left`、`rectangle`、`paintbrush_fill` 三个缺失映射 - 修复 `EditorIcon.cupertino('sidebar_left')` 和 `EditorIcon.cupertino('rectangle')` 回退到问号图标的问题 - `canvas_style_middleware.dart`: - `ClipRRect` 新增 `clipBehavior: Clip.hardEdge` 确保圆角裁剪生效 - 新增 `CanvasStyleWrapper` 组件:自动从 `EditorSettingsService` 读取/持久化画布样式 - 新增 `CanvasStyleScope` 便捷访问类:子组件可通过 InheritedWidget 读取/更新样式 - 新增 `_CanvasStyleInherited` InheritedWidget 实现跨组件样式共享 - `canvas_style_sheet.dart`: - 头部图标 `CupertinoIcons.rectangle` → `CupertinoIcons.paintbrush_fill`(更语义化) - 圆角区域图标 → `CupertinoIcons.rectangle`,边框区域图标 → `CupertinoIcons.square` - 硬编码间距/圆角替换为主题令牌 `AppSpacing`、`AppRadius` - 颜色选择器弹窗圆角使用 `AppRadius.xl` - `editor_top_nav.dart`: - 画布样式按钮图标 `EditorIcon.cupertino('rectangle')` → `EditorIcon.svg('square_dashed')`(虚线矩形更语义化) - `pro_editor_page.dart`: - 更新文件头部注释 *** ## [v14.85.0] - 2026-05-22 ### 修复 — 字体下载失败(CDN不可靠+逻辑Bug+无重试) **问题**: 1. `cdn.jsdelivr.net` 在中国不稳定,6个在线字体中有5个使用该CDN,下载经常失败 2. `downloadFont()` 无重试机制,一次网络波动即失败 3. `downloadFontFromUrl()` 同样无重试,且无文件格式验证 4. `_isValidFontFile()` 不支持 TTC 格式(文泉驿微米黑为 .ttc 文件) 5. `setActiveFont()` 逻辑Bug:`if (fontInfo.path.isEmpty && !fontInfo.path.startsWith('google_fonts://'))` 中 `path.isEmpty` 时 `startsWith` 必为 false,`!false=true`,条件永远为 true,导致 Google Font 切换也被拦截 6. 无备用URL降级机制,主URL失败后直接报错 **修复**: - `font_models.dart`: - 替换5个 `cdn.jsdelivr.net` URL 为 `raw.githubusercontent.com`(更稳定) - 替换阿里巴巴普惠体 URL 为阿里 OSS 直链 - 新增2个字体:更纱黑体(SarasaGothicSC) 🎯、文泉驿微米黑(WenQuanYiMicroHei) ✒️ - 新增 `fontFallbackUrls` 备用URL映射,每个字体1-2个备用CDN - `font_management_notifier.dart`: - `downloadFont()` 新增3次指数退避重试(1s/2s/4s延迟) - `downloadFont()` 新增URL降级:主URL失败后依次尝试 `fontFallbackUrls` 中的备用URL - `downloadFont()` 新增下载后文件头验证:验证 TTF/OTF/TTC 魔数,无效文件自动删除 - `downloadFontFromUrl()` 同步增加3次重试+文件头验证 - `_isValidFontFile()` 新增 TTC 格式支持(魔数 `ttcf`)和 TTF `true` 变体 - `setActiveFont()` 修复逻辑Bug:改为 `if (fontInfo.path.isEmpty && !fontInfo.isBuiltIn)` + 额外检查 Google Font 路径 - `Scripts/verify_fonts.dart`:新增字体验证脚本,验证所有主URL+备用URL的可访问性和文件格式,`dart run Scripts/verify_fonts.dart` 运行 *** ## [v14.84.0] - 2026-05-22 ### Bug修复 — 通用设置页面通知系统多项缺陷 **问题**: 1. `notificationEnabledProvider` 使用静态同步调用,通知状态不响应式更新,始终显示"已关闭" 2. `general_settings_provider` 和 `notification_settings_page` 各自维护独立的通知状态系统(`dailyNotification` vs `dailyRecommend`),互不同步 3. 关闭单个通知类型时调用 `NotificationService.cancelAll()` / `LocalNotificationService.cancelAll()`,误杀所有通知 4. `studyProgress` 仅保存布尔值,无实际通知调度;`chargingReadLater` 充电监听未在启动时恢复 5. `clearCache` 仅清临时目录,但 `calculateCacheSize` 计算3个目录,显示与实际清理不一致 6. `resetAll` 重置后不取消已调度通知 7. 通知文本不统一:'拾光为你选了一句' vs '闲言每日一句' 8. `DailyNotifyService`(ID 2000) 和 `NotificationScheduler`(ID 1001) 双重调度同一每日通知 **修复**: - `notification_scheduler.dart`: - 新增 `_cancelAllManaged()` 替代 `cancelAll()`,仅取消已管理的通知ID(1001-1004, 2001) - 新增学习进度通知调度(ID 1004, 20:00, payload: study_progress) - 统一每日一句文本为 '闲言每日一句' / '今天的句子已准备好,来看看吧 ✨' - `general_settings_provider.dart`: - `notificationEnabledProvider` 改为 watch `generalSettingsProvider.select((s) => s.dailyNotification)` 实现响应式 - `setDailyNotification`/`setNotifyTimeHour`/`setNotifyTimeMinute` 统一使用 `NotificationScheduler` 调度,移除 `DailyNotifyService` - 新增 `setNotifyTime(hour, minute)` 合并方法避免双重 configureAll - `clearCache` 扩展为清除临时/文档/支持3个目录,与 `calculateCacheSize` 一致 - `resetAll` 增加 `DailyNotifyService.cancelAll()` + `NotificationScheduler.setNotificationsEnabled(false)` + `ReadlaterReminderService.stopMonitoring()` - `notification_settings_page.dart`: - `loadFromPrefs` 改为从 `NotificationScheduler`/`ReadlaterReminderService` 读取状态,移除 SharedPreferences 依赖 - `setDailyRecommend` 同步更新 `generalSettingsProvider.dailyNotification` - `setDailyRecommendTime` 同步更新 `generalSettingsProvider.setNotifyTime` - 移除所有 `NotificationService.cancelAll()` 调用,统一由 `NotificationScheduler.configureAll()` 管理 - `setStudyProgress` 改为调用 `NotificationScheduler.setStudyProgressEnabled` 实现实际调度 - `loadFromPrefs` 中若 `chargingReadLater` 已启用则自动启动 `ReadlaterReminderService.startMonitoring()` - `general_settings_pickers.dart`:移除 `DailyNotifyService` 引用,使用 `setNotifyTime` 统一调度 - `general_settings_page.dart`:移除 `_onToggle` 中 `daily_notification` 的重复调度代码 - `local_notification_service.dart`:新增 `study_progress` payload 路由处理 *** ## [v14.83.0] - 2026-05-22 ### 修复 — 首页工具中心下拉无法打开 **问题**: 1. 下拉阈值过大(stage1=80px,stage2需160px),导致工具中心几乎无法触发 2. 工具中心使用底部弹窗(AppBottomSheet.showCustom),不符合"从顶部滑入"的交互预期 3. 松手后无顶部滑入动画 **修复**: - `home_refresh_indicator.dart`:降低二段式阈值 - stage1 阈值从 80→55px - stage2 触发从 `_pullProgress > 1.0` 改为 `_pullProgress > 0.7`(总拖拽约90px即可触发) - 刷新触发从 0.8 降至 0.5 - 进度显示适配新阈值:stage2 显示"松手打开工具中心" - `home_tool_center.dart`:从底部弹窗改为顶部滑入面板 - 使用自定义 `_ToolCenterRoute`(PageRoute)实现全屏覆盖 - AnimationController 驱动 SlideTransition(从顶部滑入)+ FadeTransition(背景遮罩) - 毛玻璃效果(BackdropFilter blur 30) - 点击背景遮罩或"收起"按钮关闭,带反向滑出动画 - 网格从3列改为4列,适配顶部面板布局 - `home_page.dart`:`_showToolCenter` 改用 `HomeToolCenter.show(context)` *** ## [v14.82.1] - 2026-05-22 ### Bug修复 — ShaderCardBackground 重复生命周期监听 **问题**:`ShaderCardBackground` 同时通过 `WidgetsBindingObserver` 和 `PerformanceOrchestrator` 注册前后台回调,导致 `_pauseTicker()`/`_resumeTicker()` 被重复调用。 **修复**: - 移除 `WidgetsBindingObserver` mixin 及相关代码(`addObserver`/`removeObserver`/`didChangeAppLifecycleState`) - 统一使用 `PerformanceOrchestrator` 的 `onForeground`/`onBackground` 回调机制 **Issue验证**: - ❌ Issue1(switch缺少break)— **虚假问题**。Dart 3.0+ switch case 不再隐式 fall-through,当前代码正确无需修改 - ✅ Issue2(重复生命周期监听)— **确认存在并已修复** *** ## [v14.82.0] - 2026-05-22 ### 移动端发热与资源占用优化 — 智能节流方案 **问题分析**:移动端发热严重,GPU/CPU 占用高。核心瓶颈: - Fragment Shader 以 60fps 全速渲染 - 21+ AnimationController 全部无节流运行 - 149 处 BackdropFilter 无缓存隔离 - 8+ 后台服务在前台/后台无差别运行 - 多个重量级特效(Confetti/Lottie)可并发触发 **新增核心服务**: - ✅ `PerformanceOrchestrator` — 性能调度中心单例 - 三级性能模式:完整(60fps) / 平衡(30fps) / 省电(20fps) - 电量联动:电量严重不足自动切换省电模式 - 前后台回调注册:组件可感知 App 状态变化 - 帧率节流:`createFrameThrottle()` 按级别跳帧 - ✅ `AppLifecycleGate` — 前后台统一管理门(Mixin) - 后台自动暂停:摇一摇/剪贴板监控/电池轮询 - 前台自动恢复:按需重启已启用的服务 - 集成到 App 根组件,替代原有手动 `addObserver` - ✅ `EffectMutex` — 特效互斥调度器 - 限制并发重量级特效数量(默认 2 个) - 优先级队列:交互 > 反馈 > 装饰 - 防止 GPU 过载 **组件级优化**: - ✅ `ShaderCardBackground` — Shader 帧率节流 + 前后台暂停 + RepaintBoundary - ✅ `AppBarCharacterSprite` — 后台暂停 idle 动画 + `_eyeOffset` 改 `ValueNotifier` 局部刷新 - ✅ `TabIconSprite` — 后台暂停 glow 呼吸动画 - ✅ `GlassContainer` — BackdropFilter 子树包裹 RepaintBoundary 减少重绘范围 - ✅ `GlassBottomNavBar` — 整体包裹 RepaintBoundary 隔离重绘 - ✅ `BatteryInfoService` — 新增 `pausePolling`/`resumePolling` 后台暂停轮询 - ✅ `main.dart` — 初始化 `PerformanceOrchestrator` **无需修改的组件**(已是按需设计): - `CelebrationOverlay` — 仅在调用 `celebrate()` 时播放 Confetti - `HomeRefreshIndicator` — setState 仅在用户下拉时触发,频率低 **优化效果预估**: - GPU 占用降低 40-60%(Shader 节流 + BackdropFilter 缓存 + 特效互斥) - CPU 占用降低 20-30%(后台暂停动画 + 服务暂停轮询) - 电池续航提升 15-25%(前后台联动 + 电量联动省电模式) - 视觉效果零阉割(完整模式下所有动画和特效保持原样) *** ## [v14.81.0] - 2026-05-21 ### 权限审查与修复 — 全平台权限冗余/缺失问题 **问题分析**:对 Android / iOS / macOS / Windows 四个平台的权限配置进行全面审查, 对比 `lib` 目录中实际代码使用的功能,发现冗余权限和严重缺失权限。 **Android 修复**: - 🔴 移除 `FOREGROUND_SERVICE` + `FOREGROUND_SERVICE_MEDIA_PROJECTION` 冗余权限 - 屏幕共享已重构为 InApp 模式(RepaintBoundary 截图流),不再使用 MediaProjection - `ScreenCaptureService.requestPermission()` 明确返回 "InApp mode, no system permission needed" **iOS 修复**: - 🔴 新增 `NSCameraUsageDescription` — 相机权限描述(image_picker 拍照 + mobile_scanner 扫码) - 🟡 新增 `NSBluetoothAlwaysUsageDescription` — 蓝牙权限描述(flutter_blue_plus BLE 配对) - 🟡 新增 `NFCReaderUsageDescription` — NFC 权限描述(flutter_nfc_kit 触碰配对) - ✅ 新建 `Runner/Runner.entitlements` — NFC Tag Reading + App Groups - ✅ `project.pbxproj` 三个构建配置(Debug/Release/Profile)添加 `CODE_SIGN_ENTITLEMENTS` **macOS 修复**: - 🔴 Release entitlements 补全 `network.client` — 之前 Release 版无法发起网络请求 - 🔴 Release entitlements 补全 `network.server` — 之前 Release 版文件传输服务无法启动 - 🔴 Release entitlements 补全 `cs.allow-jit` — Flutter 引擎 JIT 编译需要 - 🟡 两配置补全 `files.user-selected.read-only/read-write` — file_picker 选择文件需要 - 🟡 DebugProfile 补全 `network.client` — 之前只有 `network.server`,缺少出站请求 **保留权限说明**(Android 全部有实际代码使用): - INTERNET / ACCESS_NETWORK_STATE / ACCESS_WIFI_STATE → dio / supabase / cached_network_image - 存储权限 → file_picker / gal 保存到相册 - VIBRATE → 触感反馈 - NFC → flutter_nfc_kit 配对 - BLUETOOTH* → flutter_blue_plus + BleAdvertiserPlugin - CHANGE_WIFI_MULTICAST_STATE → nearby_service 设备发现 - usb.host → UsbTransportService 有线传输 *** ## [v14.80.5] - 2026-05-21 ### 修复 — 拾光栏配置弹窗报错 "Cannot get size from dirty render object" 根因分析:`stupid_simple_sheet` 包的 `_RelativeGestureDetector` 在 `GestureDetector` 回调中 直接访问 `context.size!`(不安全),当 `DateConfigSheet` 内部的 `ListView` 使用 `shrinkWrap: true` 时,每次滚动都会触发重新布局,导致 render object 被标记为 dirty,此时访问 `context.size` 抛出异常。 修复:移除 `DateConfigSheet` 中 `ListView.separated` 的 `shrinkWrap: true` 和 `ClampingScrollPhysics()`,让 `ListView` 使用 `Flexible` 提供的空间自行滚动, 避免触发不必要的重新布局。 *** ## [v14.80.4] - 2026-05-21 ### 修复 — 卡片滑不动(根因:Tilt的GestureDetector竞赢CardSwiper的onPan) 根因分析:`Tilt` 组件的 `GesturesListener` 内部注册了 `GestureDetector` 的 `onHorizontalDragUpdate` + `onVerticalDragUpdate`,与 `CardSwiper` 的 `GestureDetector.onPan` 在手势竞技场中竞争。由于 `Tilt` 是 `CardSwiper` 的子组件,子组件的手势识别器在竞技场中 优先赢得裁决,导致 `CardSwiper` 的 Pan 手势被取消,卡片无法滑动。 这是第三次修复暴露出的架构级问题:`CardSwiper` + `Tilt` 的嵌套结构天然存在手势冲突。 `CardSwiper` 使用 `onPan`(水平+垂直),`Tilt` 使用 `onHorizontalDrag` + `onVerticalDrag`, 两者在竞技场中互斥竞争。 修复:`TiltConfig(enableGestureTouch: false)` 禁用 Tilt 的触摸手势识别器, 让 CardSwiper 独占 Pan 手势。Tilt 的光影效果仍保留(静态渲染),但不再响应触摸倾斜。 桌面端 hover 倾斜效果仍可用。 *** ## [v14.80.3] - 2026-05-21 ### 修复 — 滑动卡片手势被下方句子广场消费(鸡生蛋问题) 根因分析:v14.80.2 移除 `Listener` 后,`CardSwiper` 的 `GestureDetector.onPan` 在手势竞技场中与 `CustomScrollView` 的 `Scrollable` 竞争。`CustomScrollView` 的垂直滚动先达到阈值赢得竞技场, `CardSwiper` 的 Pan 手势被取消,导致卡片无法滑动。这是一个鸡生蛋问题: - `onSwipeDirectionChange` 只在 `CardSwiper` 手势赢得竞技场后才触发 - 但 `CardSwiper` 的手势因为 `CustomScrollView` 先赢了竞技场而永远无法触发 - 之前 `Listener` 能工作是因为它是被动观察者,不受竞技场影响,且通过 `onScrollLockChanged` 锁定 `CustomScrollView`(切换为 `NeverScrollableScrollPhysics`),让 `CardSwiper` 的手势能正常竞争 修复方案:恢复 `Listener` 的滚动锁定功能,但不做自定义位移动画(避免双重位移冲突): - **恢复 `Listener` 包裹**:`onPointerDown` → 锁定 `CustomScrollView`,`onPointerUp/Cancel` → 解锁 - **不做自定义位移动画**:不恢复 `_dragOffsetNotifier`、`_buildDragTransform`、`_bounceController` - **不调用 `_controller.swipe()`**:让 `CardSwiper` 的 `onPanEnd` 自然触发滑动 - **移除 `onSwipeDirectionChange` 回调**:滚动锁定改由 `Listener` 直接控制 *** ## [v14.80.2] - 2026-05-21 ### 修复 — 滑动卡片卡死(根因:Listener + CardSwiper + Tilt 三层手势冲突) 根因分析:`Listener` 包裹 `CardSwiper`,两者同时处理拖拽事件,导致双重位移和双重滑动触发: 1. `Listener._onPointerMove` 更新 `_dragOffsetNotifier` → `AnimatedBuilder` 移动卡片 2. `CardSwiper.GestureDetector.onPanUpdate` 调用 `setState` → `_cardAnimation` 移动卡片 3. `Listener._onPointerUp` 调用 `_controller.swipe()` 触发滑动 4. `CardSwiper.GestureDetector.onPanEnd` 也触发 `_onEndAnimation()` 滑动 双重位移导致卡片移动速度是预期的2倍,内部状态与视觉位置不同步,debug模式下帧率暴跌甚至完全卡死。 Catcher2无弹窗原因:异常发生在渲染帧循环中,被Flutter框架内部吞掉,不会抛到Zone层。 - **移除 `Listener` 包裹**:让 `CardSwiper` 独占手势处理,消除双重位移和双重滑动 - **移除自定义拖拽逻辑**:`_onPointerDown/Move/Up`、`_dragOffsetNotifier`、`_buildDragTransform`、`_isDragging`、`_isBouncing`、`_bounceController` 及相关常量 - **移除 `_controller.swipe()` 调用**:让 `CardSwiper` 的 `onPanEnd` 自然触发滑动 - **使用 `onSwipeDirectionChange` 回调**替代 `Listener` 中的 `onScrollLockChanged` 通知 - **`onEnd` 回调中重置滚动锁**:确保所有卡片滑完后释放滚动锁定 *** ## [v14.80.1] - 2026-05-21 ### 修复 — 滑动卡片 debug 模式卡死 + 类型转换异常 - **DailyCard didUpdateWidget 无限重建 CardSwiper**:`dailySentences` 列表引用比较 `!=` 每次都为 `true`(`updateSentence` 每次创建新列表),导致 `setState → _dataVersion++ → CardSwiper key 变化 → 完全重建` 循环 - 改为 ID 列表内容比较,仅 ID 变化时重建 `CardSwiper` - 属性变化(如 `isLiked`)仅更新 `_cards` 数据,不重建 `CardSwiper` - **`_syncDailyWithCharacterWidget` 类型转换异常**:`AppKVStore.getString('character_mood_value')` 读取 `setDouble` 写入的值,`as String?` 强转失败 - 改用 `AppKVStore.getDouble('character_mood_value')`,与写入方式一致 - **Catcher2 弹窗未出现原因**:该异常被 `try-catch` 捕获,Catcher2 仅拦截未捕获异常 *** ## [v14.80.0] - 2026-05-21 ### 新增 — 崩溃日志管理系统 + Catcher2 可配置化 - **CrashLogService**:持久化存储崩溃日志到本地文件(`applicationSupportDirectory/crash_logs.json`),支持增删查清空,自动限制最大100条 - **CrashLogPage**:崩溃日志管理页面,支持查看/复制/删除/清空/导出/分享,长按进入多选模式,点击查看详情(Error + Stack Trace 均可选中复制) - **Catcher2ConfigService**:统一管理 Catcher2 异常捕获开关与动态配置更新 - Debug 模式:`CopyableDialogReportMode`(弹窗显示异常详情,支持复制,含唯一标识 `ERR-XXX`) - Release 模式:`SilentReportMode`(静默记录) - 设置中可动态开关,调用 `updateConfig` 即时生效 - **设置页 Catcher2 开关**:debug 默认开启(弹窗模式),release 默认关闭(静默模式),最底层逻辑保留默认开启 - **设置页崩溃日志入口**:开发者分组新增"崩溃日志"导航项,跳转到 CrashLogPage - **异常自动持久化**:`_ConsoleLogHandler` 在控制台输出的同时,自动调用 `CrashLogService.addLog()` 保存到本地 ### 修复 — DailyCard dispose后回调访问已关闭资源导致ANR - 所有 Listener 回调添加 `mounted` 检查 - `_controller.swipe()` 仅在 `mounted` 时调用 - dispose 顺序修正:先停止动画源,最后释放 ValueNotifier *** ## [v14.79.3] - 2026-05-21 ### 修复 — DailyCard dispose后回调访问已关闭资源导致ANR 根因:DailyCard 的 `Listener` 回调(`_onPointerDown/Move/Up`)和 `AnimationController` 回调(`_onBounceTick/Status`)在 widget dispose 后仍可能被触发,此时访问已关闭的 `CardSwiperController._eventController`(StreamController)或已 dispose 的 `ValueNotifier` 抛出 `Cannot add new events after calling close`,Catcher2 捕获异常后导致主线程阻塞(ANR 8.8秒)。 - **所有 Listener 回调添加 `mounted` 检查**:`_onPointerDown/Move/Up` 和 `_onBounceTick/Status` 在回调开头检查 `if (!mounted) return` - **`_controller.swipe()` 安全调用**:在 `mounted` 检查后才调用,避免向已关闭的 StreamController 添加事件 - **dispose 顺序修正**:先 dispose 动画控制器和 CardSwiperController,最后 dispose ValueNotifier(确保回调中仍可安全使用 ValueNotifier 直到动画控制器先停止) - **弹跳结束重置偏移**:`_onBounceStatus` 完成时同步重置 `_dragOffsetNotifier.value = Offset.zero` *** ## [v14.79.2] - 2026-05-21 ### 修复 — 首页多处崩溃+卡死 - **HomeRefreshIndicator LateInitializationError**:`_resetAnimation` 声明为 `late final`,`_animateReset()` 尝试再次赋值导致崩溃。修复:移除 `_resetAnimation`,改用 `_resetBeginValue` + `_displayProgress` 中直接计算插值 - **WeatherInfoNotifier 循环依赖**:`build()` 中直接调用 `loadWeatherBrief()`,而 `loadWeatherBrief()` 读取 `state`(此时 provider 未初始化完成)。修复:改用 `Future.microtask()` 延迟调用 - **DailyCard 拖拽/弹跳性能优化**:`_onBounceTick` 和 `_onPointerMove` 每帧调用 `setState(() {})` 导致整棵 widget 树重建。修复:改用 `ValueNotifier` + `AnimatedBuilder` 仅触发局部重绘 *** ## [v14.79.1] - 2026-05-21 ### 修复 — 首页Stack无界约束导致卡死 根因:DailyCard 中 `OverflowBox(maxWidth: infinity, maxHeight: infinity)` 给 `CardSwiper` 传递无界约束,而 `CardSwiper` 内部使用 `Stack(fit: StackFit.expand)` 需要有界约束才能确定大小,导致 `size.isFinite` 断言失败。此外 `_SentenceCardWithSkeleton` 中的 `Stack` 在 `SliverList` 无界约束下也有同样问题。 - **DailyCard OverflowBox 移除**:移除 `OverflowBox(maxWidth: infinity, maxHeight: infinity)`,让 `CardSwiper` 直接接收 `SizedBox(height: 240)` 的有界约束。`CardSwiper` 内部 Stack 已有 `clipBehavior: Clip.none`,卡片仍可视觉溢出 - **_SentenceCardWithSkeleton Stack 移除**:彻底移除 `Stack` + `IntrinsicHeight` 方案(IntrinsicHeight 在 flutter_animate 包裹下无法正确测量),改用简单的骨架屏/卡片切换淡入淡出 - **举一反三**:`OverflowBox(maxWidth/Height: infinity)` 会给子组件传递无界约束,禁止在包含 `Stack(fit: StackFit.expand)` 的第三方组件外使用 *** ## [v14.79.0] - 2026-05-21 ### 修复 — 首页句子卡片空白+卡死 根因:`_ShaderAwareContent` 使用 `Stack` + `Positioned.fill(ShaderCardBackground())` 在 SliverList 无限约束下导致卡片高度为0(空白);`ShaderCardBackground` 每帧调用 `setState` 在列表项中造成N个Ticker同时运行(卡死)。 - **SentenceCard 重构**:移除 `_ShaderAwareContent` 和 `Stack`/`Positioned.fill`,改用 `Padding > Column` 直接布局,保留 `IntrinsicHeight` + `Row(stretch)` 确保 accent bar 拉伸 - **Shader背景替代**:列表项中不再使用 `ShaderCardBackground`(Fragment Shader),改用静态 `LinearGradient`(蓝紫渐变,与 Shader 降级色一致),视觉效果相似但零性能开销 - **ShaderCardBackground 优化**:修复每帧 `setState` 导致整棵 widget 树重建的问题,改用 `ValueNotifier` + `CustomPainter(repaint: notifier)` 仅触发重绘不触发 rebuild - **性能警告注释**:在 `ShaderCardBackground` 添加文档注释,明确标注不应在列表项中使用 *** ## [v14.78.0] - 2026-05-21 ### 重构 — OhosNavBridge 注册表+中间件架构 将鸿蒙端路由从手动 if-else 匹配重构为注册表驱动+中间件管道架构: - **新增核心数据结构**:`OhosRouteParams`(自动参数解析)、`OhosRouteContext`(路由上下文)、`OhosMiddlewareResult`(中间件结果)、`OhosNavMiddleware`(中间件基类)、`OhosRouteEntry`(路由注册条目) - **新增 AuthMiddleware**:登录态拦截,未登录自动重定向到 `/login` - **新增 LogMiddleware**:路由跳转日志记录 - **路由注册表**:集中管理所有路由,支持路径参数(`:id`)、查询参数、extra 对象 - **自动参数解析**:替代手动 if-else,从 URL 自动提取路径参数和查询参数 - **replace() 增强**:支持带参数路由替换 - **go() 增强**:支持跳转到指定 Tab(通过 `OhosAppShell.switchTab`) - **404 页面**:未匹配路由显示友好 404 页面 - **OhosAppShell**:新增 `switchTab()` 静态方法供路由桥调用 *** ## [v14.77.0] - 2026-05-21 ### 文档 — iOS/macOS开发者指南 v2 重大更新 重构 `packages/iOS_macOS_Developer_Guide.md`,核心策略变更: - **MacBook Pro 端不需要 `packages/` 目录**:直接使用远程三方库,避免 `TargetPlatform.ohos` 编译错误 - **pubspec.yaml 替换指南**:完整列出 38 个本地包 → 远程版本的替换清单 - **dependency_overrides 精简**:MacBook Pro 端仅保留 `meta`、`web` 版本号覆盖 - **git stash 隔离策略**:MacBook Pro 端修改的 pubspec.yaml 不提交,使用 stash 隔离 - **新增 §5.5 同步说明**:ios/macos 修改后鸿蒙端不需要同步,lib/ 需要同步 - **更新 TargetPlatform.ohos 适配点**:列出 5 个本地包共 17 处引用 *** ## [v14.76.0] - 2026-05-21 ### 文档 — 新增iOS/macOS开发者指南 - **新增** `packages/iOS_macOS_Developer_Guide.md`:面向iOS/macOS开发者的项目开发指南,涵盖: - Flutter SDK选择(官方SDK vs 鸿蒙SDK) - pubspec.yaml三方库本地包与远程包说明 - Git提交合并规范(防止污染鸿蒙适配代码) - `TargetPlatform.ohos` 处理规范(禁止exhaustive switch,推荐if-else或default) - 应用入口架构差异(GoRouter vs Navigator) - 路由注册双写要求(app_router.dart + ohos_nav_bridge.dart) - 常见问题与快速检查清单 *** ## [v14.75.0] - 2026-05-21 ### 重构 — 纯Dart本地包迁移至远程版本 将11个纯Dart(无原生代码)且有本地化修改的包,从本地路径依赖改为远程版本依赖,删除对应本地包目录。 `flex_color_picker` 因含 `TargetPlatform` switch 语句需鸿蒙适配,保留为本地包: | 包名 | 本地版本 | 远程版本 | 说明 | 状态 | |---|---|---|---|---| | badges | 3.2.0-ohos.1 | ^3.2.0 | 角标/徽章组件 | ✅ 已迁移远程 | | flex_color_picker | 3.8.0 | 3.8.0-ohos.1 | HSL颜色选择器 | 🔧 保留本地(需ohos适配) | | flutter_card_swiper | 7.2.0 | ^7.2.0 | 卡片滑动切换 | ✅ 已迁移远程 | | catcher_2 | 2.1.9-ohos.1 | ^2.1.9 | 全局异常捕获+上报 | ✅ 已迁移远程 | | stupid_simple_sheet | 0.9.1+1 | ^0.9.1+1 | 简易底部弹出面板 | ✅ 已迁移远程 | | liquid_glass_easy | 1.1.1-ohos.1 | ^1.1.1 | 液态玻璃效果封装 | ✅ 已迁移远程 | | liquid_glass_widgets | 0.11.0-ohos.1 | ^0.11.0 | iOS26液态玻璃组件库 | ✅ 已迁移远程 | | flutter_shaders_ui | 0.1.1-ohos.1 | ^0.1.0 | Fragment Shader效果 | ✅ 已迁移远程 | | flutter_spritesheet_animation | 1.0.2-ohos.1 | ^1.0.1 | 精灵图帧动画 | ✅ 已迁移远程 | | image_size_getter | 2.4.1 | ^2.4.1 | 图片尺寸读取 | ✅ 已迁移远程 | | extended_image | 10.0.1 | ^10.0.1 | 图片缓存+缩放+裁剪 | ✅ 已迁移远程 | | photo_view | 0.15.0 | ^0.15.0 | 图片缩放/平移查看 | ✅ 已迁移远程 | - **flex_color_picker 保留原因**:`picker_functions.dart` 中 `platformControlKey()` 和 `isDesktop()` 函数使用 `switch(TargetPlatform)` 枚举匹配,鸿蒙 SDK 新增 `TargetPlatform.ohos` 枚举值,远程版本未包含该 case 导致编译失败。本地版本已添加 `case TargetPlatform.ohos` 修复 - **其他包检查结果**:catcher_2、badges、flutter_card_swiper、photo_view、image_size_getter、liquid_glass_easy 均无 `TargetPlatform` switch;extended_image 和 liquid_glass_widgets 仅使用 `==` 比较,不触发 exhaustive switch 错误 - **判断依据**:这些包均为纯Dart实现(无android/ios/ohos等原生目录),本地化修改仅为版本号后缀加`-ohos.1`,无实际代码改动,可安全替换为远程版本 - **删除目录**:`packages/` 下对应的11个本地包目录已删除(flex_color_picker 保留) *** ## [v14.74.0] - 2026-05-21 ### 修复 — 鸿蒙端 AppKVStore 崩溃 + hive_flutter 本地化适配 - **AppKVStore 未初始化崩溃**:鸿蒙端 `Hive.initFlutter()` 失败导致 `AppKVStore._initialized=false`,后续所有读写操作抛 `StateError`。修复:`_box()` 返回 `Box?`(nullable),未初始化时读操作返回 `null`、写操作静默跳过并记录警告日志,所有调用方无需逐个加 `isReady` 检查 - **hive_flutter 本地化**:将 `hive_flutter:1.1.0` 下载到 `packages/hive_flutter`,版本号改为 `1.1.0-ohos.1`,`pubspec.yaml` 中 `path_provider` 改为引用本地 `../path_provider`(含 OHOS 适配) - **initFlutter 鸿蒙容错**:`hive_extensions.dart` 的 `initFlutter()` 增加 fallback 链:优先 `getApplicationDocumentsDirectory()` → 失败则 `getTemporaryDirectory()/hive` → 最终 fallback 到相对路径 `./hive_data`,确保鸿蒙端不会因路径获取失败而崩溃 - **Web stub 补全**:`path_provider.dart` stub 增加 `getTemporaryDirectory()` 空实现 *** ## [v14.73.0] - 2026-05-21 ### 修复 — 首页句子卡片Stack布局崩溃 + SVG资源缺失 - **Stack无限约束崩溃**:`home_sentence_card.dart` 中 `Stack` 在 `SliverList` 内收到无限高度约束导致 `size.isFinite` 断言失败。重构布局:将 `IntrinsicHeight` 提升到 `Row` 外层,`Stack` 移入 `Expanded` 内部并设置 `StackFit.passthrough`,确保 `Stack` 获得有限约束 - **_SentenceCardWithSkeleton Stack约束**:`home_page.dart` 骨架屏 `Stack` 添加 `fit: StackFit.passthrough`,避免无限约束下布局失败 - **SVG资源缺失**:`assets/svgs/editor/upload.svg` 文件不存在,引导页 `OnboardingConstants.svgBasePath` 拼接 `upload` 图标时找不到资源。创建 upload.svg(Lucide风格上传图标),与 editor 目录下其他图标风格一致 *** ## [v14.72.0] - 2026-05-21 ### 新增 — 账户安全洞察功能 + 全流程API接口验证 - **账户洞察模型**:`account_insight_model.dart` 定义7种洞察类型(密码变更/新设备登录/长期未活跃/IP异常/密保未设置/2FA预告/安全建议),含优先级/已读状态/暂停/忽略/过期等计算属性 - **本地计算服务**:`account_insights_service.dart` 对比 KV Store 缓存与 API 数据,检测7类安全问题,支持刷新和写入记录 - **Riverpod状态管理**:`account_insights_provider.dart` Notifier管理洞察列表,支持标记已读/7天暂停/永久忽略/删除/全部已读 - **半模态Sheet UI**:`account_insights_sheet.dart` iOS风格半屏Sheet展示洞察卡片,含优先级标签/操作按钮/标记已读确认对话框 - **AppBar盾牌按钮**:`user_center_page.dart` 右侧新增盾牌图标+未读计数徽章,点击弹出洞察Sheet - **全流程API验证脚本**:`Scripts/account_insights_full_test.py` 30项测试全部通过,覆盖注册/登录/用户信息/设备管理/IP查询/密保/数据面板/签到/互动/收藏/回执登录/Token登录/注销状态/统计/运势/申请注销/退出登录 - **注销接口验证**:使用 `requestDeletion` 接口成功申请注销测试用户(uid=82),3天后自动注销 ### 洞察分析结论 - ✅ 密保问题检测:`extra.sec_question.question_id=0` 触发 → 正确 - ✅ 新设备检测:对比 KV Store 缓存 `last_login_device` → 正确 - ✅ IP异常检测:对比 KV Store 缓存 `last_login_ip` → 正确 - ✅ 长期未活跃:对比 `last_login_time`,>30天触发 → 正确 - ⚠️ 密码变更检测:API不返回 `password_changed_at` 字段 → 本地无法计算,需后端支持 - ✅ 2FA预告/安全建议:纯静态通知 → 正确 - 📈 准确率:6/7 (85%) *** ## [v14.71.0] - 2026-05-21 ### 修复 — 7项Bug修复(诗词模型/日期配置/引导页交互) - **JinrishiciUserInfo.fromSdk字段映射错误**:`jinrishici_models.dart` 修复ipAddress从`data['ip']`读取(原错误读取`data['ipAddress']`),weather和temperature从`data['weatherData']`嵌套对象读取(原错误直接从data读取),temperature使用`.toString()`兼容double类型 - **date_config_sheet空字符串未回退**:`date_config_sheet.dart` valueMap中weather/temp/city/ip字段使用三元运算符检查`.isNotEmpty`,空字符串时回退为'--'(原`??`仅处理null不处理空字符串) - **引导页"开始使用"按钮不跳转**:`onboarding_page.dart` 添加`ref.listen`监听`currentPage`变化,当provider状态与PageController不同步时自动调用`animateToPage`同步(原welcome_page按钮调用nextPage()只更新provider,PageView未跟随) - **引导页右滑未同意协议无提醒**:`onboarding_page.dart` `_onPageChanged`在弹回前显示CupertinoAlertDialog温馨提示(原仅静默弹回,用户无感知) - **跳过引导按钮移至协议页**:`welcome_page.dart` 删除"跳过引导"按钮,`agreement_page.dart` 新增`_buildSkipButton`方法,仅在`canProceedAgreement`为true时可用(原按钮在欢迎页可无条件跳过,绕过协议) - **重新设计"了解软件权限"按钮**:`welcome_page.dart` 从GlassContainer改为iOS风格轻量链接按钮,使用accent色+lock_shield图标+居中布局(原GlassContainer样式过重不协调) - **引导页标题添加应用图标**:`welcome_page.dart` `_buildTitle`在"欢迎使用闲言"文字前添加`icon_120x120.png`图标(36x36),`pubspec.yaml`新增`assets/templates/resized/`资源目录 *** ## [v14.70.0] - 2026-05-21 ### 修复 — 首页三个Bug修复 - **句子卡片空白问题**:`home_page.dart` 当 `dailySentence` 为 null 且 `dailySentences` 为空时,DailyCard 因无数据导致空白。新增 `_buildEmptyDailyCard()` 占位方法,显示"正在获取今日推荐..."提示和重试按钮,使用 GlassContainer 保持视觉一致性 - **下拉精灵头像动画后未打开工具中心**:`home_refresh_indicator.dart` 的 `_onPullEnd()` 中 `_animateReset()` 触发 setState 后立即调用 `onToolCenter`,导致 context 状态冲突。改为先缓存回调引用,执行 reset 动画后通过 `Future.microtask` 延迟调用 onToolCenter,确保状态安全 - **拾光栏sheet高度与句子详情sheet不一致**:`home_page.dart` 的 `_showDateConfigSheet` 从 `showCustom` 改为 `showHalf`,与句子详情sheet使用相同的半屏吸附配置(snapping: [0.4, 0.7, 1.0], initialSnap: 0.7)。`date_config_sheet.dart` maxHeight 从 0.75 调整为 0.85 适配半屏高度 *** ## [v14.69.0] - 2026-05-21 ### 修复 — MeshGradientBackground initState中调用inherited widget导致崩溃 - **根因**:`mesh_gradient_background.dart` 的 `initState()` 中调用 `_initBlobs()` → `_blobColors` getter → `AppTheme.ext(context)` → `Theme.of(context)`,而 `initState()` 阶段 widget 尚未插入树,`context` 不可用于 inherited widget 查找 - **修复**:将 `_initBlobs()` 从 `initState()` 移至 `didChangeDependencies()`(Flutter 推荐的访问 inherited widget 的生命周期方法),新增 `_blobsInitialized` 标志位,`build()` 中未初始化时降级为静态渐变 - **举一反三**:排查项目中所有 `initState()` 内调用 `Theme.of(context)` / `AppTheme.ext(context)` 的情况,确认仅此一处存在问题,其余均在 `build()` 或 `addPostFrameCallback` 中安全调用 *** ## [v14.68.0] - 2026-05-21 ### 新增 — 引导页交互增强(8项优化) - **协议内容动态加载**:`agreement_page.dart` 替换硬编码文本为 `AgreementData.getContent()` 获取真实协议内容,显示更新日期 - **个性化设置持久化**:`personalization_page.dart` 字体大小/毛玻璃强度/动画强度/圆角风格修改时同步调用 `themeSettingsProvider` 持久化,新增6个映射辅助方法 - **设置页重新打开引导页入口**:`general_settings_sections.dart` 显示设置分组新增"重新打开引导页"项,`general_settings_page.dart` _onAction 新增对应 case - **Lottie页面切换动画**:`onboarding_page.dart` 页面切换时播放 `star.json` Lottie动画(1.5秒淡出) - **撒花庆祝效果**:`personalization_page.dart` 完成引导时播放 `ConfettiWidget` 爆炸式撒花(5色30粒子) - **卡片滑动式导航**:`onboarding_page.dart` PageView 改为 `ClampingScrollPhysics()` 允许手势滑动,协议页未同意时自动弹回 - **角色表情动画**:`onboarding_page.dart` 新增 `AppBarCharacterSprite` 猫咪角色,表情随页面变化(欢迎→微笑/协议→思考/个性化→爱心) *** ### 新增 — 分享Sheet社交平台分享增强 + 保存到相册 - **微信/QQ分享增强**:`share_sheet.dart` 微信好友、朋友圈、QQ 分享从仅显示Toast提示改为截取卡片图片+系统分享面板(share_plus),用户可在系统面板中选择微信/QQ等应用;无卡片图片时降级为纯文字分享 - **微博分享增强**:新增 `_shareToWeibo()` 方法,优先尝试 `sinaweibo://` URL Scheme 打开微博App,失败则降级为系统分享 - **保存到相册**:`share_target.dart` 新增 `ShareTargetType.saveToGallery` 枚举值和默认项(🖼️ emoji),`share_sheet.dart` 新增 `_saveToGallery()` 方法使用 gal 库将卡片截图保存到系统相册,仅在有卡片样式时显示 - **ShareResultType扩展**:新增 `savedToGallery` 枚举值及对应label「保存到相册」 - **sortOrder调整**:saveCardImage=4, saveToGallery=5, wechatFriend=6, wechatMoments=7, qq=8, weibo=9, addNote=10 *** ## [v14.66.0] - 2026-05-21 ### 重构 — 首页每日推荐卡片消除约200行重复代码 - **提取 `_CardContentConfig` 数据类**:封装 `_buildSwipableCard` 与 `_buildSingleCard` 之间的差异参数(rotation/cardIndexLabel/showLoading/heroTag/maxLines/wrapInExpanded/showFeedInfo/authorSpacing/authorOverflow) - **提取 `_buildCardContent` 公共方法**:统一处理 isCustom 和默认两种卡片风格,内部通过 `buildTrailing()`/`buildHeaderRow()`/`buildTextContent()`/`buildAuthorRow()`/`buildContentColumn()`/`buildCustomCard()`/`buildDefaultCard()` 七个局部函数组织逻辑 - **`_buildSwipableCard` 薄包装层**:仅构造 `_CardContentConfig(rotation, cardIndexLabel, heroTag, maxLines:3, wrapInExpanded:true, showFeedInfo:true, authorOverflow:ellipsis)` 后调用 `_buildCardContent` - **`_buildSingleCard` 薄包装层**:仅构造 `_CardContentConfig(showLoading, heroTag:'daily-sentence-text', authorSpacing:md)` 后调用 `_buildCardContent` - **文件行数**:从 1125 行减少到 926 行,净减约 200 行 *** ## [v14.64.0] - 2026-05-21 ### 新增 — 下拉回弹动画 + 刷新完成庆祝动画 + SpriteLoading过渡动画 - **下拉松手回弹动画**:`home_refresh_indicator.dart` 新增 `_resetController`(300ms, Curves.easeOutCubic),松手时进度从当前值平滑过渡到0而非直接归零。新增 `_displayProgress` getter 在回弹动画期间返回动画值。用户新下拉时自动停止正在进行的回弹动画。非顶部滚动也触发平滑回弹 - **刷新完成庆祝动画**:新增 `_isComplete` 状态 + `_completeController`(1200ms),刷新完成后播放庆祝动画:精灵弹跳(sin衰减曲线3次弹跳)+ 12个粒子飘散特效(`_CelebrationParticlePainter` CustomPainter)+ 整体渐隐。表情切换为 smile,文字显示"刷新完成 ✓",动画结束后自动重置状态 - **SpriteLoadingIndicator过渡动画**:`sprite_loading_indicator.dart` 从 StatelessWidget 重构为 StatefulWidget,进度条宽度用 `TweenAnimationBuilder` 从旧值平滑过渡到新值(200ms),精灵尺寸变化用 `TweenAnimationBuilder`(250ms),透明度用 `AnimatedOpacity`(200ms),标签文字用 `AnimatedSwitcher`(200ms淡入淡出)。`didUpdateWidget` 中缓存旧值作为 Tween 的 begin *** ## [v14.65.0] - 2026-05-21 ### 新增 — 引导页完整功能模块(iOS 26 液态玻璃方案A) - **onboarding_constants.dart**:引导页常量定义,含核心功能列表(每日拾句/壁纸制作/文件传输)、协议标签页(隐私政策/用户协议/权限说明)、支持语言列表、SVG资源路径 - **onboarding_provider.dart**:Riverpod状态管理,OnboardingState包含currentPage/selectedLocale/privacyAgreed/termsAgreed/permissionRead/showOnNextLaunch/isCompleting/agreementTabIndex/shakeEnabled/soundEnabled,OnboardingNotifier提供nextPage/previousPage/setPage/toggle*/setLocale/completeOnboarding方法,completeOnboarding调用KvStorage持久化 - **mesh_gradient_background.dart**:流动渐变背景组件,5色块(紫/青/红/橙/品红)使用AnimationController+Timer驱动位置漂移,BackdropFilter blur 60模糊,低端设备降级为静态渐变 - **page_nav_header.dart**:页面导航头组件,左侧毛玻璃胶囊返回按钮+右侧accent色圆图标,GlassContainer包裹 - **welcome_page.dart**:第1页欢迎与指引,PageNavHeader+右对齐标题+核心功能列表(GlassContainer+SVG图标)+权限入口(appPush跳转)+语言芯片选择+底部"开始使用"/"跳过引导"按钮 - **agreement_page.dart**:第2页软件协议,3标签页(隐私政策/用户协议/权限说明)+GlassContainer可滚动内容+AgreementType关联+两个勾选+"同意并继续"按钮 - **personalization_page.dart**:第3页个性化设置,实时预览卡片+外观(主题模式/强调色/字体大小)+效果(毛玻璃/动画/圆角)+功能(摇一摇/音效/引导页开关)+themeSettingsProvider联动 - **onboarding_page.dart**:主引导页,ConsumerStatefulWidget+PageController+MeshGradientBackground+Step Dots指示器,完成引导后appGo跳转首页 ### 变更 — 权限管理增强 - **KvStorage**:新增 `onboardingCompleted`/`showOnboarding` 键名及便捷方法 - **app_router**:新增 `/onboarding` 路由,首次启动或 `shouldShowOnboarding` 为 true 时跳转引导页 - **permission_service**:AppPermission枚举移除废弃的storage权限,新增isRequired/usageScenes字段,所有权限增加详细说明和使用场景 - **permission_management_page**:_PermissionCard重写,展示图标+名称+必要/可选标签+详细说明+使用场景列表 *** ## [v14.63.0] - 2026-05-21 ### 变更 — 二段式下拉刷新 + 精灵Loading + 发现页优化 + 主题名称 - **主页二段式下拉刷新**:`home_refresh_indicator.dart` 重构为二段式下拉交互,从 `ConsumerWidget` 改为 `ConsumerStatefulWidget`。下拉进度 0~1.0 为一段刷新区域(松手触发 onRefresh),1.0~2.0 为二段工具中心区域(松手触发 onToolCenter)。角色表情随进度变化:一段 idle→surprise→pout,二段 surprise→think→love,刷新中 think,完成 smile。二段区域显示进度条+提示文字。`home_page.dart` 新增 `onToolCenter` 回调连接 `_showToolCenter` - **精灵头像通用Loading组件**:新增 `sprite_loading_indicator.dart`,封装 `SpriteLoadingIndicator` 组件和 `SpriteLoadingStage` 枚举(idle/refreshing/stage2/complete),支持进度/阶段/自定义文字/尺寸参数,供下拉刷新、发现页等场景复用。表情映射:idle按进度切换idle/surprise/pout,refreshing固定think,stage2按进度切换surprise/think/love,complete固定smile - **发现页下拉loading替换为精灵头像**:`discover_page.dart` 加载状态从纯骨架屏改为精灵头像Loading(`SpriteLoadingIndicator` + 2行骨架屏辅助),下拉交互区域新增精灵头像指示器(`_buildPullDownIndicator`),下拉时角色表情随进度变化,整体布局改为 Stack+Transform.translate 支持下拉偏移 - **句子广场频道标签线条重新设计**:`home_type_chip.dart` 未选中状态添加 `Border.all(color: textHint.withValues(alpha: 0.15), width: 0.5)` 细边框,选中状态显式 `width: 1.0`,视觉层次更清晰。`home_square_header.dart` SizedBox 高度从36调整为40 - **主题个性化名称更换**:`theme_settings_provider.dart` 主题名称从"夸张"→"拾光"、"含蓄"→"拾光·含蓄"、"猫咪"→"喵喵"、"狗狗"→"汪汪"。`theme_sections_style.dart` TabExpressionStyleSection 标题从"Tab 表情风格"改为"拾光" *** ## [v14.62.0] - 2026-05-21 ### 变更 — 天气诗词和今日诗词缓存优先加载策略 - **WeatherProvider 缓存优先**:`weather_provider.dart` 重构加载策略,`build()` 先从 Hive `feedCache` 读取缓存数据,有缓存则立即显示旧数据并后台刷新,无缓存才显示骨架屏。新增 `isRefreshing` 状态区分首次加载与后台刷新,新增 `hasData` getter 判断是否有可用数据,新增 `_loadFromCache()`/`_saveToCache()` 方法实现完整序列化(WeatherData/WeatherPoetryMood/WeatherPoetrySession/matchedPoems),`loadWeather()` 有数据时设 `isRefreshing: true` 而非 `isLoading: true`,`copyWith()` 新增 `clearError` 参数避免刷新时残留旧错误 - **PoetryProvider 缓存优先**:`poetry_provider.dart` 同样重构,新增 `isRefreshing`/`hasData`/`clearError`,`build()` 先读缓存再后台刷新,新增 `_poetryToMap()`/`_poetryFromMap()`/`_userInfoToMap()`/`_userInfoFromMap()` 序列化辅助方法,`loadPoetry()` 有数据时设 `isRefreshing: true` - **WeatherPage 适配**:`weather_page.dart` 加载判断从 `isLoading ? skeleton : content` 改为 `isLoading && !hasData ? skeleton : content`,有数据时即使加载中也显示内容;新增 `_buildRefreshingBar()` 顶部"正在更新..."指示条(CupertinoActivityIndicator + 文字) - **PoetryPage 适配**:`poetry_page.dart` 同样适配,新增 `_buildRefreshingBar()` 刷新指示条,输入栏在有数据时始终显示 *** ## [v14.61.0] - 2026-05-21 ### 变更 — 合并学习打卡至成就中心双Tab页面 - **成就中心页面合并学习打卡**:`achievement_page.dart` 重构为双Tab页面,使用 `CupertinoSlidingSegmentedControl` 切换"🏆成就中心"和"✅学习打卡"两个Tab。成就中心Tab保留原有 _ProfileSummary + _TitleProgress + _AchievementSection 内容;学习打卡Tab嵌入原 CheckinPage 的全部核心功能(_CheckinHeader + _CheckinTypeGrid + 打卡记录列表 + 连击效果 + 光晕动画)。页面标题改为"🏆 成就",两个Tab均支持下拉刷新,ConfettiController 同时服务于成就领取和打卡成功 - **移除快捷入口中的学习打卡**:`quick_action_grid.dart` 中删除"学习打卡"条目(已合并至成就中心页面),快捷入口从14个减少为13个 - **新增状态管理**:`_AchievementPageState` 添加 `_selectedTab`(当前Tab索引)、`_comboCount`(连击计数)、`_glowController`(光晕动画控制器),initState 同时初始化 achievementProvider 和 checkinProvider *** ## [v14.60.0] - 2026-05-21 ### 修复 — 每日推荐卡片滑动裁剪问题 - **修复卡片滑动时被裁剪**:`home_daily_card.dart` 中 `CardSwiper` 被 `SizedBox(height: 240)` 约束且外层 `Tilt.base` 默认 `Clip.antiAlias` 裁剪,导致卡片滑出容器时被截断看不到完整轨迹。修复方案:1) 在 `SizedBox` 内添加 `OverflowBox(maxWidth/Height: double.infinity)` 允许卡片溢出渲染;2) 将 `Tilt.base` 从外层整体包裹移入 `cardBuilder` 内部,每张卡片独立享受倾斜效果,外层不再裁剪;3) 非 CardSwiper 场景(单卡/加载中)保留外层 `Tilt.base` *** ## [v14.59.0] - 2026-05-21 ### 修复 — 拾光栏空壳数据 + 交互增强 - **修复拾光栏硬编码数据**:`date_config_sheet.dart` 中 `device: 'iPhone'` 改为根据 `Platform.isIOS/isAndroid` 动态显示 iOS/Android;`battery: '85%'` 改为从 `BatteryInfoService.instance.currentLevel` 获取真实电量 - **修复AppBar拾光栏设备标识**:`appbar_date_display.dart` 中 `case DateDisplayItemKey.device:` 从硬编码 `'iPhone'` 改为根据平台动态显示 iOS/Android/📱 - **拾光配置Sheet点击空白收起**:`home_page.dart` 中 `_showDateConfigSheet` 添加 `barrierColor: Colors.black.withValues(alpha: 0.3)`,点击半透明背景可关闭Sheet - **摇一摇弹出气泡**:`_onShake` 方法新增调用 `characterTipsProvider.notifier.generateTip(characterId)`,摇一摇时自动弹出角色Tips气泡 - **拾光栏开关达3项自动替换+Toast**:`date_display_provider.dart` 的 `toggleItem` 方法,当已启用3项且尝试开启新项时,自动移除最早启用项并替换为新项,同时通过 `replacedItemKey` 通知UI层显示Toast提示"已达3项上限,已自动替换「xxx」" *** ## [v14.58.0] - 2026-05-21 ### 变更 — 学习中心与学习进度页面合并 - **学习中心+学习进度合并为双Tab页面**:`learning_center_page.dart` 重构为 `CupertinoSlidingSegmentedControl` 双Tab模式,Tab1=📚学习中心(保留原有仪表盘/每日推荐/热力图/趋势图/统计),Tab2=📊学习进度(嵌入原 `LearningProgressPage` 的目标环形图/7天趋势/分类柱状图/目标设置),页面标题改为"📚 学习" - **移除快捷入口中的"学习进度"**:`quick_action_grid.dart` 删除学习进度条目(已合并至学习中心Tab2,无需独立入口) - **双Tab均支持下拉刷新**:学习中心Tab刷新 dashboardProvider,学习进度Tab刷新 learningProgressProvider - **initState 同时初始化两个 Provider**:确保切换Tab时数据已就绪 *** ## [v14.57.0] - 2026-05-21 ### 变更 — 气泡位置调整 + 扫码登录入口迁移 - **气泡消息移至精灵头像下方**:`home_page.dart` 中 `Positioned` 的 `bottom: 52` 改为 `top: 52`,气泡从头像上方移至下方;`character_tip_bubble.dart` 中 `AnimatedSlide` 的 `offset` 从 `Offset(0, 0.3)` 改为 `Offset(0, -0.3)`,滑入方向从上方滑入改为从下方滑入 - **扫码登录迁移至扫一扫菜单**:从 `quick_action_grid.dart` 快捷入口网格中移除"扫码登录"条目;`profile_page.dart` 右上角加号"扫一扫"选项改为弹出二级选择菜单,包含"扫码登录"(跳转 qrcodeLogin 页面)和"扫描二维码"(通用扫码,开发中)两个选项 *** ## [v14.56.0] - 2026-05-20 ### 新增 — 文件传输二维码分享功能实现 - **二维码分享设备**:`_shareDeviceViaQr` 方法原先仅显示 Toast "二维码分享功能开发中...",现已完整实现。使用 `QrPairingService.generateQrPayload()` 生成包含设备 IP、端口、别名、指纹、配对方式的 JSON 载荷,通过 `QrImageView` 渲染二维码,在 CupertinoAlertDialog 中展示 - **复制配对信息**:弹窗新增"复制配对信息"按钮,将设备名称/IP/端口/指纹以可读格式复制到剪贴板,方便无法扫码时手动配对 - **二维码有效期提示**:弹窗内显示二维码有效期(5分钟),与 `QrPairingService.qrExpiry` 保持一致 - **深色模式适配**:二维码背景始终为白色确保可扫描性,前景色根据深色/浅色主题自动切换 *** ## [v14.55.0] - 2026-05-20 ### 修复 — 传输设置页面低优先级问题清理 - **调试模式开关**:原先硬编码 `value: false, onChanged: (v) {}`,开关无法切换。现连接 `TransferSettings.debugMode` provider,开启后自动导航到调试面板页面(`_DebugPanelPage`,复用 `FileTransferDebugPanel` mixin) - **加密算法选择器**:原先只有 `AES-256-CBC` 一个选项却弹出单选弹窗,形同虚设。现改为静态展示(Row 布局显示当前算法名),删除 `_showEncryptionAlgorithmPicker` 方法 - **信令服务器状态**:原先硬编码 `wss://tools.wktyl.com:9443` 和 `状态: 已连接`。现从 `signalingService.isConnected` 动态读取连接状态,显示 🟢 已连接 / 🔴 未连接;服务器地址也从 `settings.signalingServerUrl` 读取 - **TransferDevice.fromJsonWithDefaults**:与 `fromJson` 几乎完全重复且缺少 `isFavorite`/`userId`/`ipCity`/`ipRange`/`accountAlias` 字段。已删除,项目中无其他调用点 *** ## [v14.54.1] - 2026-05-20 ### 变更 - sensors_plus 从远程依赖 `^6.0.0` 改为本地鸿蒙适配版本 `6.1.0-ohos.1` - 新增本地包 `packages/sensors_plus`(来源:gitcode.com/openharmony-sig/flutter_plus_plugins br_sensors_plus-v6.1.0_ohos 分支) - 新增本地包 `packages/sensors_plus_ohos`(鸿蒙平台传感器实现 v1.0.1) - 新增本地包 `packages/sensors_plus_platform_interface`(平台接口 v2.0.0) - sensors_plus pubspec.yaml 添加 ohos 平台声明 `default_package: sensors_plus_ohos` - pubspec.yaml dependency_overrides 新增 sensors_plus 和 sensors_plus_platform_interface 本地路径覆写 *** ## [v14.54.0] - 2026-05-20 ### 修复 — 主页扩展功能审计修复(P0/P1/P2) **P0 严重修复** - 互动通知情绪系统链路断裂:`HomeInteractionMixin` 的 `toggleLike`/`toggleFavorite` 未通知 `characterMoodProvider`,角色情绪永远不会因互动变化。现添加 `ref.read(characterMoodProvider.notifier).recordAction()` 调用 - 每日通知调度逻辑缺失:`setDailyNotification(true)` 仅更新状态值未调用 `DailyNotifyService.scheduleDailyNotification()`,用户开启提醒后不会收到通知。现接入 `DailyNotifyService`,设置时间和开关均触发实际调度/取消 - 音效文件缺失:`assets/sounds/sfx/` 目录下无 mp3 文件,所有9种音效静默失败。推荐从 Pixabay/Mixkit/JSFXR 下载免费商用音效(详见审计报告) **P1 逻辑修复** - Tips未关联情绪:`_generateTimeSlotTip()` 仅基于时段,不读取 `characterMoodProvider`。现根据 mood 调整文案(happy→"今天心情不错呢~", bored→"好无聊,来读点什么吧", sleepy→"困了...但还是想陪你") - 电池显示硬编码:`appbar_date_display.dart` 电池项固定显示 `🔋85%`,现接入 `BatteryInfoService.instance.currentLevel` 和 `isCharging` 状态 - NFC可用性未初始化:`NfcShareService.instance.isAvailable` 默认 `false` 且从未调用 `checkAvailability()`,NFC分享按钮永远不显示。现于 `home_page.dart` initState 中调用初始化 **P2 体验优化** - 角色说话动画缺失:`CharacterExpression` 枚举新增 `speaking`,嘴巴做开合动画(`_expressionController.repeat(reverse:true)`),TTS 播放时角色同步说话表情,停止后微笑 - 屏幕常亮阅读模式未实现:mode=1(阅读时)原先与 mode=2(始终)行为相同。现添加滚动检测:滚动停止5秒后启用 wakelock,滚动恢复时禁用 - mounted 字段失效:`_mounted` 为 `final bool _mounted = true` 永远为 true,`if (!mounted) return` 永远不触发。现改为可变字段 + `markDisposed()` 方法,`HomeNotifier._onDispose` 中调用 *** ## [v14.53.3] - 2026-05-20 ### 修复 - 文件传输发现设备Tab双数据源问题:`buildDevicesTab` 中设备列表来自 `deviceDiscoveryProvider.discoveredDevices`,但配对状态检查使用 `transferProvider.isPairedWith/isPairing/peerStatuses`,两个 Provider 各自维护设备列表可能不同步。现以 `transferProvider.discoveredDevices` 为主数据源,合并 `discoveryProvider` 中独有设备,确保设备列表展示与配对状态检查来自同一数据源 ### 修复 - 消息重复插入风险:`_localSendMessageSub` 和 `_nearbyMessageSub` 两个监听器可能收到同一条消息并重复插入 `state.messages`,现新增 `_addMessageDedup` 方法基于 `messageId` 去重,重复消息跳过插入并记录警告日志 - 收藏功能未实现:`_setDeviceFavorite` 原先仅更新 `PeerStatus.connectionState` 为 `paired`,并未真正切换 `isFavorite` 字段。现新增 `TransferNotifier.toggleDeviceFavorite` 方法,正确切换设备 `isFavorite` 状态,同步更新内存(`discoveredDevices`/`myDevices`)和数据库,Toast 提示与实际行为一致 - 数据库层补全:`TransferDatabase._rowToDevice` 缺少 `isFavorite` 字段读取,`insertDevice` 缺少 `isFavorite` 写入,`updateDevice` 缺少 `isFavorite` 参数,均已补全 *** ## [v14.53.2] - 2026-05-20 ### 修复 - 传输设置页"传输记录"交互逻辑错误:点击后误调用 `_clearTransferRecords()`(清除记录),改为导航到文件传输页面的记录Tab(`FileTransferPage(initialTab: 2)`),长按保留清除记录功能 - `_buildNavigationTile` 新增 `onLongPress` 可选参数支持长按交互 - `FileTransferPage` 新增 `initialTab` 参数,支持从外部直接跳转到指定Tab *** ## [v14.53.1] - 2026-05-20 ### 修复 - 文件传输设备操作:`_sendFileToMyDevice` 方法原先传入空路径 `filePath: ''`,现改为先调用 `FilePicker.platform.pickFiles()` 让用户选择文件,用户取消或路径无效则不执行发送 - 传输聊天页面:`prevMsgs.firstWhere((m) => m.id == msg.id)` 无 `orElse`,列表中找不到匹配项时会抛出 `StateError`,现改用 `firstWhereOrNull` 并添加 `null` 检查 *** ## [v14.53.0] - 2026-05-20 ### 新增 - 拾光角色桌面小组件(dailyWithCharacter): - `WidgetType` 枚举新增 `dailyWithCharacter`,标题"拾光每日一句",副标题"拾光角色+每日推荐句子" - 平台标识:Android=`DailyWithCharacterProvider`,iOS=`DailyWithCharacterWidget`,鸿蒙=`dailyWithCharacter` - 优先级 P1(推荐小部件),图标 `CupertinoIcons.sparkles`,deepLink 跳转首页 - `HomeWidgetService` 新增4个数据键:content/author/id/mood,新增 `updateDailyWithCharacter()` 方法 - `HomeWidgetService` 后台回调新增 `open_daily_with_character` 处理 - `HomeWidgetService.debugGetAllData()` 新增拾光角色小组件数据读取 - `HomeFeedMixin` 新增 `_syncDailyWithCharacterWidget()` 辅助方法 - 每日推荐句子加载成功后(fetchDailySentence/refreshDailySentences/fetchDailySentenceFallback)自动同步推送到拾光角色小组件 - 推送时读取角色情绪值(character_mood_value)转换为 mood 字符串 *** ## [v14.52.0] - 2026-05-20 ### 新增 - F12: 屏幕常亮设置: - `DisplaySettingsState` 新增 `screenAlwaysOn` 字段(0=关闭, 1=阅读时, 2=始终,默认0),持久化到 KvStorage - `GeneralSettingsNotifier` 新增 `setScreenAlwaysOn` 方法 + `screenAlwaysOn` 便捷 getter - 通用设置页"显示设置"分组新增"💡 屏幕常亮"选择器(CupertinoPicker 三档选择) - HomePage 监听 `screenAlwaysOn` 设置变化,通过 `wakelock_plus` 控制屏幕常亮 - HomePage dispose 时自动关闭 wakelock - F13: 电池低提醒: - 新增 `lib/core/services/device/battery_info_service.dart`:电池状态监听服务 - 基于 `battery_plus` 监听电池状态变化 + 5分钟轮询电量 - 提供 `onBatteryChanged` Stream 广播 `BatteryInfo`(含 isLow/isCritical 判断) - `CharacterExpression` 枚举新增 `worried` 担忧表情: - 眉头皱起(两条短弧线下弯) - 嘴巴微张(椭圆) - 眼睛略缩(0.9倍) - 2秒后自动恢复 - `CharacterTipsNotifier` 新增 `showTip(category, content)` 方法,支持外部触发气泡提示 - HomePage initState 中初始化 BatteryInfoService 并监听低电量事件 - 低电量时角色显示 worried 表情 + 弹出拾光Tips气泡提醒充电 *** ## [v14.51.0] - 2026-05-20 ### 新增 - 字体对比模式:左右分屏对比两种字体的渲染效果(FontComparisonPage) - 支持字号滑块调节(12-48px) - 支持自定义预览文本输入 - 中英文+数字多维度对比预览 - FontActiveCard 增加"对比"按钮,点击后弹出字体选择器选择第二个字体 - FontLocalSection 增加左滑"对比"操作,选择对比目标字体后跳转对比页面 - 字体切换音效:setActiveFont 成功后播放 font_switch.mp3 音效(静默失败,不影响功能) *** ## [v14.50.0] - 2026-05-20 ### 新增 - 在线字体数据动态化(Supabase):FontSyncService 从远程获取字体列表,离线 fallback 到本地硬编码数据 - Google Fonts 集成:在线字体区增加 Google Fonts 入口,支持输入字体名加载 1500+ 在线字体 - FontInfo 模型增加 category(字体分类)和 iconEmoji(图标emoji)字段 - 在线字体项改用 font.iconEmoji 替代 onlineFontData[index] 索引访问,避免 Supabase 数据越界 ### 修复 - 在线字体列表 Supabase 远程数据与本地 fallback 兼容处理 - FontOnlineItemWidget emoji 显示不再依赖硬编码索引,支持动态数据源 *** ## [v14.50.0] - 2026-05-20 ### 新增 - F15: 本地通知提醒: - 新增 `lib/core/services/notification/daily_notify_service.dart`:每日定时通知服务 - 单例模式,委托 `LocalNotificationService` 调度通知,避免重复初始化 - `scheduleDailyNotification(hour, minute, title, body)` 调度每日通知 - `cancelAll()` 取消所有通知 - `GeneralFieldsState` 新增 `dailyNotification`(默认false) / `notifyTimeHour`(默认8) / `notifyTimeMinute`(默认0) 字段,持久化到 KvStorage - `GeneralSettingsNotifier` 新增 `setDailyNotification` / `setNotifyTimeHour` / `setNotifyTimeMinute` 方法 - 通用设置页"通知设置"分组新增"🔔 每日提醒"开关 + "⏰ 提醒时间"选择器 - 开关开启时调度每日通知(标题"拾光为你选了一句"),关闭时取消 - 提醒时间选择器支持9个时段:06:00/07:00/08:00/09:00/10:00/12:00/18:00/20:00/22:00 - F17: Shader特效: - 新增 `assets/shaders/fluid.frag`:Fragment Shader流体渐变效果 - 三层噪声叠加产生流体动画 - 触摸涟漪交互(u_touch uniform) - 蓝/紫/青三色混合,0.6透明度 - 新增 `lib/shared/widgets/shader_card_background.dart`:Shader卡片背景组件 - `ShaderCardBackground` StatefulWidget + Ticker 驱动动画 - 加载失败降级为 LinearGradient 静态渐变 - `_ShaderPainter` CustomPainter 绑定 FragmentProgram + 5个 uniform - `GeneralFieldsState` 新增 `shaderBackground`(默认false) 字段,持久化到 KvStorage - `GeneralSettingsNotifier` 新增 `setShaderBackground` 方法 - 通用设置页"显示设置"分组新增"✨ 特效背景"开关 - `SentenceCard` 根据 `shaderBackground` 设置切换背景:开启时使用 ShaderCardBackground,关闭时使用原有渐变 - pubspec.yaml 新增 `assets/shaders/` 资源目录 *** ## [v14.49.0] - 2026-05-20 ### 新增 - 字体预览大图 Sheet(半屏面板+自定义预览文本+字号滑块+中英文预览) - 字体卡片滑动删除(AppSlidable,替代原有删除按钮) - 字体搜索/筛选(支持拼音首字母匹配+名称/字体族匹配) - 滚动定位到在线字体区(点击"在线字体"按钮自动滚动) - 下拉刷新字体列表(CustomRefreshIndicator) - 列表项入场动画(flutter_animate fadeIn+slideY 瀑布效果) - 字体切换 Hero 过渡动画(heroine) - 字体列表骨架屏加载(SkeletonBox+ListItemSkeleton) - 并发下载控制(最多3个同时下载) - 下载重试机制(失败后显示重试按钮) - 下载进度圆环(CircularProgressIndicator 替代线性进度条) - 字体收藏持久化(Hive KV存储+收藏置顶显示+滑动收藏操作) - 删除后字体残留处理(记录已删除列表,重启时不加载已删除字体) ### 修复 - 自定义字体通过 customFontFamily 传递给全局主题系统,确保全局生效 - 字体序列化改用 JSON,兼容旧 | 分隔符格式自动迁移 - 鸿蒙端字体功能适配(移除 isOhos 限制,统一字体目录获取) ### 重构 - 内置字体映射动态化(builtInFontConfigs 替代硬编码 idMap) - _builtInFonts getter 改为基于 builtInFontConfigs 动态生成 *** ## [v14.48.0] - 2026-05-20 ### 新增 - F9: Lottie动画过渡: - 频道切换时显示 `spin.json` Lottie加载动画,600ms后自动消失 - `_onChannelSwitch` 方法:防重入守卫 + setState切换状态 + 延迟重置 - `_swipeToNextCategory`/`_swipeToPrevCategory` 滑动切换也走 `_onChannelSwitch` - 空状态区域使用 `star.json` Lottie动画替代静态emoji,errorBuilder降级显示📭 - 空状态新增"下拉刷新试试"副标题 - F11: 摇一摇换句: - 新增 `lib/core/services/device/shake_detector.dart`:摇一摇检测器单例 - 监听加速度传感器,阈值25.0,最小间隔1500ms防抖 - start/stop/dispose 生命周期管理 - pubspec.yaml 新增 `sensors_plus: ^6.0.0` 依赖 - `GeneralFieldsState` 新增 `shakeToSwitch` 字段(默认false),持久化到 KvStorage - `GeneralSettingsNotifier` 新增 `setShakeToSwitch` 方法 - 通用设置页"交互设置"分组新增"🤝 摇一摇换句"开关 - 开关开启时启动 ShakeDetector,关闭时停止 - HomePage initState 中根据设置自动启动摇一摇监听 - 摇一摇回调:刷新每日推荐 + 角色dizzy晕眩表情 + 摇铃音效 - HomePage dispose 中停止 ShakeDetector - AppBarCharacterSprite 新增 `dizzy` 晕眩表情: - 眼睛绘制为旋转X形(螺旋眼),使用 expressionProgress 驱动旋转角度 - 嘴巴绘制为波浪曲线,使用 expressionProgress 驱动波动幅度 - 耳朵抖动(repeat) + 脸颊微红 + 整体弹跳(repeat),2秒后自动恢复 - 新增 `triggerExpression` 公开方法,供外部触发任意表情 *** ## [v14.47.0] - 2026-05-20 ### 新增 - F5: 自定义下拉刷新(拾光角色): - 新增 `home_refresh_indicator.dart`:拾光角色下拉刷新动画组件 - 使用 `custom_refresh_indicator` 包实现自定义刷新指示器 - 角色表情随下拉进度变化:idle(好奇) → surprise(惊讶) → pout(紧张) → blink(决心) - 刷新中显示 think(思考) 表情 + "刷新中...",完成后 smile(开心) + "刷新完成 ✓" - 48x48 角色精灵 + 进度文字,透明度随拖拽值渐变 - AppBarCharacterSprite 新增 `expression` 参数: - 外部可强制指定角色表情,`didUpdateWidget` 时自动触发表情切换 - 新增 `think` 表情:微眯双眼 + 侧弯嘴巴 + 鼻子微皱 + 脸颊微红 - `_getBlinkFactor` 新增 thinkBlink(0.3 * expressionProgress) 实现思考时微眯眼 - HomePage 句子列表外层包裹 HomeRefreshIndicator,支持下拉刷新 ### 新增 - F8: 3D倾斜卡片: - `home_daily_card.dart` 每日推荐卡片外层包裹 `Tilt.base()` 组件 - 使用 `flutter_tilt` 包实现 3D 倾斜交互效果 - TiltConfig: angle=8, enableReverse=true, moveDuration=200ms - LightConfig: maxIntensity=0.06 微光效果 - ShadowBaseConfig: 黑色阴影, maxIntensity=0.15, offsetInitial=(0,8) *** ## [v14.46.0] - 2026-05-20 ### 新增 - 字体预览大图 Sheet 组件(FontPreviewSheet): - 新增 `lib/features/settings/presentation/font/font_preview_sheet.dart` - 半屏面板展示字体大图预览,支持拖拽到不同高度(40%/70%/100%) - 自定义预览文本输入框:用户可输入任意文本实时预览 - 字号滑块:12-48sp 可调,实时更新预览 - 预览区域:自定义文本 + 中文经典(天地玄黄) + 英文(quick brown fox) + 数字符号 - 字体信息展示:字体族、文件大小、类型(内置/自定义) - 使用 AppBottomSheet.showHalf 弹出,iOS 26 液态玻璃风格 ### 变更 - FontItemWidget:单击改为弹出字体预览Sheet,长按激活字体 - FontOnlineItemWidget:info图标改为预览图标(CupertinoIcons.textformat_size),点击弹出预览Sheet - 移除 FontOnlineItemWidget 中已废弃的 _showFontDetail 方法和 _detailRow 辅助方法 - 移除 font_widgets.dart 中不再使用的 services.dart 导入 *** ## [v14.45.0] - 2026-05-20 ### 新增 - TTS语音朗读公共类(TtsService): - 新增 `lib/core/services/audio/tts_service.dart`:统一TTS语音朗读管理,单例模式 - TtsState枚举:idle/speaking/paused/loading 四种状态 - 跨平台兼容:iOS端配置setSharedInstance + IosAudioCategory,Android/其他平台自动适配 - 语音参数持久化:speed/pitch/volume 通过 AppKVStore(Hive) 存储 - 状态流:onStateChanged (Stream) + onProgress (Stream<(start, end, word)>) - 核心方法:speak/stop/pause/setSpeed/setPitch/setVolume/getAvailableVoices - TTS朗读播放条组件(TtsPlayerBar): - 新增 `lib/shared/widgets/tts_player_bar.dart`:句子详情Sheet中的朗读控制条 - 播放/暂停按钮(圆形主题色按钮 + CupertinoIcons) - 进度条(LinearProgressIndicator + 主题色) - 状态文字:正在朗读.../已暂停/点击播放 - 停止按钮(播放中或暂停时显示) - 首页角色点击朗读: - 单击角色:生成Tip + 如果TTS可用且当前有每日推荐,朗读每日推荐句子 - 双击角色:生成Tip + 如果正在朗读则停止 - 句子详情Sheet朗读功能: - 二级操作栏新增"🔊 朗读"按钮(TTS可用时显示) - 点击朗读按钮:显示TtsPlayerBar + 开始朗读句子 - TtsPlayerBar 位于Sheet底部危险操作栏下方 *** ## [v14.44.0] - 2026-05-20 ### 新增 - 主页工具中心面板(HomeToolCenter): - 新增 `home_tool_center.dart`:下拉快捷工具面板,2行3列网格布局 - 6个快捷入口:📷扫一扫、📡传输助手、🔊朗读模式、🌙深色模式、🤝摇一摇、⚙️更多设置 - 深色模式切换实际调用 `themeSettingsProvider.setThemeMode()`,可即时切换日/夜模式 - 传输助手/更多设置点击后关闭Sheet并跳转对应路由页面 - 扫一扫/朗读模式/摇一摇为预留入口,点击提示"开发中" - 句子广场Header新增工具中心入口按钮(CupertinoIcons.grid 图标) - `SquareHeaderContent` 新增 `onToolCenter` 回调参数 - `HomePage` 新增 `_showToolCenter()` 方法,通过 `AppBottomSheet.showCustom` 弹出工具中心面板 *** ## [v14.43.0] - 2026-05-20 ### 新增 - 角色拾光情绪系统(CharacterMood): - 新增 `character_mood_provider.dart`:管理角色情绪状态、经验值、等级 - 6种情绪枚举:happy/neutral/bored/sleepy/excited/worried,各有 emoji 和能量值 - `CharacterMoodState` 数据类:含 moodValue(0.0~1.0)、exp、level、levelProgress - `CharacterMoodNotifier`:recordAction 记录交互(like/favorite/read/share/create/daily_checkin),decayMood 情绪衰减,_checkTimeBasedMood 夜间自动困倦 - 数据持久化到 AppKVStore (Hive) - AppBarCharacterSprite 支持 mood 参数: - idle 状态下根据 mood 调整嘴巴曲线(happy微笑/excited大笑/bored微撇/worried皱嘴/sleepy微张) - idle 状态下根据 mood 调整眼睛开合度(excited大眼/bored半闭/sleepy闭眼) - sleepy 情绪自动增加眨眼因子 - shouldRepaint 新增 mood 比较 - HomePage 传递 mood 到角色精灵:`ref.watch(characterMoodProvider.select((s) => s.mood))` - DateConfigSheet 角色介绍卡片增强: - 角色名右侧新增 "Lv.X" 等级标签(主题色背景) - 介绍文案下方新增经验进度条 + EXP 数值显示 *** ## [v14.42.0] - 2026-05-20 ### 重构 - 字体管理页面从单文件(1663行)拆分为4个文件: - `font_models.dart`(~120行): FontInfo/FontManagementState/在线字体数据/工具函数 - `font_management_notifier.dart`(~480行): FontManagementNotifier 业务逻辑 - `font_widgets.dart`(~700行): 所有 UI 组件(私有改公开) - `font_management_page.dart`(~65行): 主页面入口 ### 修复 - 增强字体管理页面动态主题响应: - 主页面增加 `ref.watch(themeSettingsProvider)` 双保险监听主题变化 - 所有子组件从 `AppTheme.ext(context)` 获取主题(而非构造函数参数传入) - 弹窗内部使用 `AppTheme.ext(ctx)` 获取新 context 的主题 - 替换硬编码 `CupertinoColors.systemGreen` 为 `ext.successColor`,深色/AMOLED 模式下颜色一致 - CupertinoTextField 增加 `placeholderStyle`/`style` 跟随主题色 *** ## [v14.41.0] - 2026-05-20 ### 修复 - 修复 `DateConfigSheet` 自定义文案输入框被输入法遮挡: - 根因:Sheet 底部 SizedBox 仅考虑 `viewPadding.bottom`,未处理 `viewInsets.bottom`(键盘高度) - 在底部 SizedBox 中加入 `MediaQuery.of(context).viewInsets.bottom`,键盘弹出时自动推高内容 - 添加 `keyboard_safe_sheet.dart` 导入,为后续更细粒度键盘适配预留 - 加强 `AppBarCharacterSprite` 角色头部阴影效果: - `_paintShadow` 模糊半径从 `2` 增大到 `4.5`,阴影更柔和扩散 - `_paintShadow` alpha 从 `0.12` 增加到 `0.25`,阴影更深更明显 - 新增 `_paintGroundShadow` 底部投影椭圆,模拟地面投影效果,增强角色立体感 *** ## [v14.40.0] - 2026-05-20 ### 修复 - 修复 `analysis_options.yaml` 中 `include: package:riverpod_lint/analysis_options.yaml` 无效问题: - 根因:`riverpod_lint` 3.x 不再提供供外部 include 的 `analysis_options.yaml`,该文件仅用于包内部开发 - 3.x 版本的 lint 规则完全通过 `custom_lint` 插件机制提供(已在 `plugins` 中配置) - 移除无效 include 指令,添加说明注释 - 修复 Dart 分析器 AOT 编译失败(Windows 中文用户名路径问题): - 根因:Dart AOT 编译器无法处理路径中的非 ASCII 字符(`C:\Users\无书\...`) - 新增 `scripts/analyze.ps1`:设置 `LOCALAPPDATA` 到非中文路径后运行分析 - 新增 `scripts/fix_dart_aot_path.ps1`:永久修复脚本(创建目录联接) *** ## [v14.39.0] - 2026-05-20 ### 修复 - 修复 Web 端 `MissingPluginException: No implementation found for method getApplicationDocumentsDirectory`: - 根因:`path_provider` 的 `getApplicationDocumentsDirectory()` 在 Web 端无原生实现,直接调用会抛出 `MissingPluginException` - 新增 `platform_utils.dart` 安全路径获取方法 `safeAppDirPath` / `safeTempDirPath`(Web 端返回 null) - 新增 `path_provider_stub.dart`(Web 端空实现)和 `path_provider_native.dart`(原生端实现,含 try-catch) - `font_management_page.dart`:5 个方法增加 `pu.isWeb` 守卫(扫描/下载/导入/URL下载/删除) - `cache_service.dart`:7 处 `getApplicationDocumentsDirectory()` 替换为 `_safeAppDirPath()` - `backup_service.dart`:`backupDirPath` 改用 `pu.safeAppDirPath`,Web 端抛出 `UnsupportedError` - `data_management_page.dart`:`_exportFullData` 改用 `pu.safeAppDirPath`,Web 端提示不支持 - 修复 `Catcher2: Zone mismatch` 警告: - 根因:`WidgetsFlutterBinding.ensureInitialized()` 在 `runZonedGuarded` 外部调用,而 `runApp` 在内部调用,Zone 不一致 - `main.dart`:将 `ensureInitialized()` 移入 `runZonedGuarded` 内部,确保 bindings 初始化和 runApp 在同一 Zone - 修复 `SharingReceiverService` 在 Web 端未守卫的问题: - `main.dart`:`SharingReceiverService.init()` 增加 `!pu.isWeb` 守卫 *** ## [v14.38.0] - 2026-05-20 ### 新增 - 首页 AppBar 集成角色动画和日期栏: - `home_page.dart`:AppBar 从 `🏠 闲言` + 日期文本 替换为 角色精灵 + 闲言/拾光标题 + 日期栏 + 搜索按钮 三段式布局 - 左侧:`AppBarCharacterSprite` 角色精灵,跟随 `themeSettingsProvider.tabCharacterStyleId` 切换造型 - 标题区:主标题"闲言"(title1) + 副标题"拾光"(caption2 主题色),点击触发角色 `lookAtTitle()` 动画 - 中间:`AppBarDateDisplay` 日期栏,点击弹出 `DateConfigSheet` 配置弹窗 - 右侧:保留搜索按钮(BounceButton + Heroine) - 角色命名体系"拾光": - `lib/core/constants/character_name.dart`:角色名常量 — givenName="拾光", fullName="闲言拾光", renameHint="暂不支持改名" - `DateConfigSheet` 顶部新增角色介绍卡片:56x56角色精灵 + 名字 + 全称 + 介绍文案 + "暂不支持改名"标签 - AppBar 标题副标题显示"拾光"(主题色) *** ## [v14.37.0] - 2026-05-20 ### 新增 - AppBar 角色动画系统(方案A — 增强 CustomPainter): - 设计文档: `docs/superpowers/specs/2026-05-20-appbar-character-animation-design.md` - 归档文档: `docs/superpowers/specs/2026-05-20-appbar-character-animation-archive.md` - 新增 `lib/shared/widgets/appbar_character_sprite.dart`:AppBar角色动画精灵组件 - 替换 AppBar 左侧 `🏠 闲言` 为互动角色 + 标题,角色跟随 Tab 栏造型设置 - 4种角色(猫/狗/男孩/女孩)× 7种部件动画(耳/鼻/脸/眼/嘴/须/整体) - 6种手势交互(单击/双击/长按/点击闲言/手指跟随/空闲自动) - 动画强度联动 `themeSettingsProvider.animationIntensity`(4档) - 3D质感渲染(径向渐变+投影阴影+双高光+环境光) - 日期栏扩展功能: - 点击日期弹出配置 Sheet(天气/设备/IP/自定义文案/显示项配置) - 最多3项显示,自定义文案14字限制 - 超过10字自动轮播(可开关) - 公共类提取: - `WeatherInfoService` 提取到 `core/services/weather/` - `IpLocationService` 合并到 `core/services/network/` - 新增 `WeatherBriefInfo` 轻量数据模型(`core/services/weather/weather_info_models.dart`),含 `empty()` 和 `fromWeatherData()` 工厂方法 - 新增 `WeatherInfoService` 公共查询服务(`core/services/weather/weather_info_service.dart`),含30分钟内存缓存、`mapWeatherIcon()`、`mapAqiLevel()` 公共方法 - 新增 `WeatherInfoNotifier` + `weatherInfoProvider`(`core/services/weather/weather_info_provider.dart`),Riverpod 状态管理,供首页/日期栏等轻量场景消费 *** ## [v14.36.0] - 2026-05-20 ### 修复 - 修复鸿蒙端本地IP显示字节序反转的问题: - 根因:鸿蒙端 `network_info_plus` 的 `getWifiIP()` 返回网络字节序(big-endian)IP,未正确转换为宿主字节序,导致安卓端显示 1.2.3.4 而鸿蒙端显示 4.3.2.1 - `localsend_service.dart`:`getLocalIp()` 新增 `_fixReversedIp()` 方法,检测反转IP(反转后属于私有IP范围而原始不属于),自动修正 - `localsend_service.dart`:`getLocalIp()` 新增 `NetworkInterface.list()` 备选方案,当 `getWifiIP()` 失败时遍历网络接口获取IPv4地址 - 修复鸿蒙端无法打开多语言设置界面的问题: - 根因:`AppRoutes` 缺少 `languageSettings` 常量,`ohos_nav_bridge.dart` 无语言设置页路由映射,鸿蒙端 `OhosNavBridge.push()` 找不到匹配页面 - `app_router.dart`:`AppRoutes` 新增 `languageSettings = '/settings/language'` 常量,GoRoute 路由定义改用常量引用 - `ohos_nav_bridge.dart`:`_routeMap` 新增 `AppRoutes.languageSettings` → `LanguageSettingsPage` 映射 - `general_settings_page.dart`:语言导航从硬编码 `'/settings/language'` 改为 `AppRoutes.languageSettings` - `profile_page.dart`:语言导航从硬编码 `'/settings/language'` 改为 `AppRoutes.languageSettings` - 修复从发现页扫描/配对码进入聊天页面看不到消息的问题: - 根因:`_collectPeerIds` 从 `state.discoveredDevices`/`myDevices`/`pairedDevices` 收集 peerIds,但扫描发现或配对码创建的 `TransferDevice` 未注册到这些列表中,导致消息过滤时 `sessionIds` 不包含对方设备ID,消息不显示 - `transfer_notifier.dart`:新增 `ensureDeviceKnown(TransferDevice device)` 方法,将设备添加到 `discoveredDevices`(如果不存在于任何设备列表中) - `transfer_chat_page.dart`:`initState` 的 `addPostFrameCallback` 中在 `setCurrentSession` 之前调用 `ensureDeviceKnown(widget.peerDevice)`,确保设备在状态中可被查找 *** ## [v14.35.0] - 2026-05-20 ### 修复 - 修复屏幕共享页面观看端找不到结束按钮的问题: - 根因1:观看端(isViewing)没有底部控制栏,只有热区图例,无法直观结束观看 - 根因2:导航栏"结束"按钮点击区域过小(padding仅sm+xs),在紧凑空间中难以点击 - `screen_share_page.dart`:新增 `_buildViewingControls()` 方法,为观看端提供醒目的红色"结束观看"按钮(CupertinoButton全宽样式) - `screen_share_page.dart`:`_buildActiveView()` 中为观看端添加底部控制栏 - `screen_share_page.dart`:导航栏"结束"按钮增加 `behavior: HitTestBehavior.opaque`、`ConstrainedBox(minWidth: 44, minHeight: 44)` 最小点击区域,padding从sm+xs增大到md+sm ### 新增 - 信令服务器综合测试脚本 `docs/toolsapi/scripts/test_signaling_comprehensive.js`: - 11个测试模块:Health Check / Registration & Discovery / Pairing Code / Text Message & File Meta / Screen Share / Canvas / Direct Pairing / Radar / WsRelay / Heartbeat / DeviceModel - 54+测试断言覆盖所有信令协议 - 使用 `sendAndWait` / `sendAndWaitBoth` 解决消息时序竞态问题 - 本地逻辑测试脚本 `Scripts/test_local_logic.js`: - 10个测试模块:配对码生成 / 设备名称显示 / 画布样式渲染顺序 / 画布样式模型 / 屏幕共享状态 / 热区碰撞检测 / 帧数据编解码 / 画布笔画模型 / 配对码验证 / 计时器格式化 - 79个测试断言全部通过 - Node.js部署脚本 `docs/toolsapi/scripts/deploy_signaling.js`:替代Python上传脚本,使用node-ssh上传index.js并重启PM2 *** ## [v14.30.0] - 2026-05-20 ### 修复 - 修复编辑器画布样式(圆角/边框/阴影/叠层/外边距)设置不生效的问题(方案重构): - 根因:ProImageEditorState没有didUpdateWidget,导致wrapBody回调在configs变更后不会更新,之前通过wrapBody包裹的_CanvasStyleWrapper方案无法响应样式变化 - 新增`CanvasStyleMiddleware`独立组件(`canvas_style_middleware.dart`):在父级直接包裹ProImageEditor,通过setState驱动重建,确保样式始终跟随_canvasStyle - 渲染层级:outerMargin → stackLayers → shadow → clipRadius → border → child - `pro_editor_page.dart`:build方法中用CanvasStyleMiddleware包裹ProImageEditor,移除buildConfigs中的canvasStyle参数 - `pro_editor_bridge.dart`:移除wrapBody回调和_CanvasStyleWrapper类,移除canvasStyle参数和dotted_border导入 - 导出阶段`ExportService.applyCanvasStyle()`保持不变,编辑时预览+导出后处理双路径生效 *** ## [v14.29.0] - 2026-05-20 ### 修复 - 修复翻译助手页面布局溢出报错及点击卡死问题: - 根因1:`_buildLangChipBar` 使用固定 `height: 44` 但内部 Chip 实际高度超出,导致布局溢出 - 根因2:`_buildLangPairBar` 和 `_buildLangChipBar` 各自独立 `ref.watch(translateProvider)`,与 `build()` 中的 watch 形成重复订阅,provider 异步初始化时触发连锁状态更新导致无限重建卡死 - 根因3:`CupertinoNavigationBar` trailing 区域两个 32x32 按钮 + 8px 间距在小屏设备溢出 - 根因4:`_buildInputBar` 底部 padding 硬编码 `AppSpacing.lg`,未适配设备安全区域 - `translate_page.dart`:`_buildLangPairBar` / `_buildLangChipBar` 改为接收 `TranslateState` 参数,消除重复 `ref.watch` - `translate_page.dart`:`_buildLangChipBar` 固定高度改为 `BoxConstraints(minHeight: 40, maxHeight: 48)` + 内部 `SizedBox(height: 36)` 约束 ListView - `translate_page.dart`:`_buildLangChip` 垂直 padding 从 6 减至 4,水平 padding 从 12 减至 10 - `translate_page.dart`:导航栏 trailing 按钮从 32x32 缩小至 28x28,间距从 sm 减至 xs - `translate_page.dart`:`_buildInputBar` 底部 padding 改为 `AppSpacing.sm + MediaQuery.viewPaddingOf(context).bottom` 适配安全区域 - `translate_page.dart`:`TextField` 替换为 `CupertinoTextField`,修复 CupertinoPageScaffold 下无 Material 祖先导致崩溃 - `translate_page.dart`:`SelectableText` 包裹 `Material(color: transparent)`,修复无 Material 祖先报错 *** ### 已归档版本 14.25.1(鸿蒙小组件跳转修复) / 14.25.0(鸿蒙端数据库+存储迭代修复) / 14.24.0(诗词设置页面) / 14.23.0(翻译助手) / 14.22.0(画布样式) / 14.20.0(屏幕共享WebRTC) / 14.19.0(画布协作) / 14.18.0(离线队列) / 14.17.0(USB传输) / 14.16.0(云端暂存) / 14.15.0(送达回执) / 14.14.0(断点续传) / 14.13.0(文件分流) / 14.12.0(信令服务器) / 14.11.0(配对码机制) / 14.10.0(雷达扫描) / 14.9.0(屏幕共享信令) / 14.8.0(画布同步) / 14.7.0(全流程E2E) / 14.6.0(翻译服务) / 14.5.0(诗词页面) / 14.4.0(天气诗词) / 14.3.0(编辑器增强) / 14.2.0(画布圆角) / 14.1.0(编辑器样式) / 14.0.0(传输架构重构) / 13.9.0(多语言) / 13.8.0(主题系统) / 13.7.0(设置重构) / 13.6.1(数据库修复) / 13.6.0(存储优化) / 13.4.0(本地化) / 13.3.0(HTTP明文) / 13.2.0(信令协议) / 6.4.1-6.4.5(鸿蒙端数据库+存储迭代修复) / 5.13.0(local_auth_ohos合并) / 5.10.0(SDK升级oh-3.41.9) / 12.4.0(Tab栏个性交互) / 12.3.0(搜索三大问题修复) / 12.2.0(收藏双向同步) / 12.1.1(快捷按钮导航) / 12.1.0(USB OTG传输) / 6.3.2(登录加载闪烁修复) / 6.3.1(TextPainter异常修复) / 6.2.0(协作画布) / 6.2.1(剪贴板同步) / 11.2.0(云端暂存) / 5.33.0(智能推荐+标签云+智能模式) / 5.32.0(离线浏览缓存) / 5.31.0(通知设置) / 5.30.0(二维码登录) / 5.29.0(表单校验+本地通知) / 5.28.0(文件传输助手+我的设备) / 5.27.0(用户中心接口同步) / 5.26.0(文件传输核心架构) / 5.22.0(聊天多媒体+视觉增强) / 4.21.0(聊天会话流) / 5.11.0(通用设置重构) / 5.10.0(关于页面+图标统一) / 3.9.9(画布样式编辑) / 3.9.8(拖拽描边/文本回写/壁纸无限加载) / 3.9.7(画布圆角+导出修复) / 3.9.6(画布圆角/文字按钮卡死) / 3.9.5(Bug回归修复) / 3.9.4(本地化/HTTP明文) / 3.9.3(画布圆角/壁纸卡死) / 3.9.2(画布圆角/文字按钮/壁纸) / 3.9.1(历史卡死/同步丢失) / 3.9.0(编辑器增强) / 3.8.0 / 2.58.0(六大Bug修复) / 2.57.0(开发计划) / 2.56.0(README更新) / 2.55.1(代码质量清理) / 1.55.0(灵感页面重构) / 1.54.0(个人中心+签到Bug) / 1.53.0(分类列表+骨架屏) / 1.52.0(句子卡片不更新) / 1.51.0(句子循环重复) / 1.50.0(频道同步延迟) / 1.49.0(刷新无响应+分类同步) / 1.48.0(句子广场无限循环) / 1.47.0(API类型转换崩溃) / 1.46.0(句子来源页面) / 1.45.0(笔记自动保存) / 1.44.2(笔记Bug修复) / 1.44.1(笔记删除Bug) / 1.44.0(API集成补全) / 1.40.0(用户安全接口) / 1.39.0(卡片震动/分类切换) / 1.31.0(API功能全面接入) / 1.30.0(传统色页面重构) / 1.23.0(偷工减料修复) / 1.22.0(句子广场交互) / 1.21.0(数据管理卡死/Tab抖动) — 更早版本详见 git history