Files
xianyan/CHANGELOG.md
Developer df1f127a12 chore: 批量完成2026-05-24版本迭代更新
本次提交涵盖多项功能优化与重构:
1. 重构pro_image_editor依赖为官方托管版本,移除本地包引用
2. 拆分角色表情枚举至独立文件,优化代码复用性
3. 新增壁纸收藏、预加载、健康检测服务与本地存储支持
4. 完善API响应类型安全检查与排行榜服务能力
5. 新增应用锁设置路由与页面支持
6. 优化路由跳转使用常量路径替代硬编码字符串
7. 新增阅读报告分享功能与设置变更日志服务
8. 修复多处类型转换与空指针风险问题
9. 调整API超时时间优化网络请求表现
10. 统一文件头格式与部分UI组件样式
2026-05-24 04:00:49 +08:00

149 KiB
Raw Blame History

Changelog

所有重要变更均记录于此文件。格式基于 Keep a Changelog


[v16.7.0] - 2026-05-24

新增 — 进度分享卡片 + 气泡样式个性化

进度分享卡片

  • 🆕 progress_page.dart: 新增 _shareProgressCard 方法,生成文本进度报告并通过 SharePlus 分享到社交平台
  • 🆕 progress_page.dart: 设置Sheet中新增"分享进度卡片"选项share图标点击生成报告并调用系统分享
  • 🎨 分享文本包含:📊闲言进度报告标题、总进度百分比、进行中/已完成统计、前5项进度条(█░)、日期签名
  • ✏️ 新增 share_pluslogger 导入

气泡样式个性化

  • 🆕 theme_settings_provider.dart: 新增 BubbleStyleOption 类,包含 id/label/icon/userBgAlpha/systemBgAlpha/showTail/shadowElevation 字段
  • 🆕 theme_settings_provider.dart: 新增 bubbleStyleOptions 常量列表提供4种样式标准/极简/毛玻璃/阴影
  • 🆕 theme_settings_provider.dart: ThemeSettingsState 新增 bubbleStyleId 字段(默认'standard')和 bubbleStyle getter
  • 🆕 theme_settings_provider.dart: ThemeSettingsNotifier 新增 setBubbleStyle 方法,支持 KV 持久化存储
  • 🆕 theme_settings_provider.dart: _loadFromStorage 加载 bubble_style、resetAll 重置为 standard
  • 🆕 theme_sections_style.dart: 新增 BubbleStyleSection 组件4个选项卡片式选择器图标+标签+选中态动画)
  • 🔥 theme_settings_page.dart: 在 TabCharacterStyleSection 之后插入 BubbleStyleSection

[v16.6.0] - 2026-05-24

新增 — 源健康检测/小部件预览/设置搜索增强/设置变更日志

功能12: 壁纸源健康检测

  • 🆕 wallpaper_health_service.dart: 新增 WallpaperHealthService 服务,定期检测各壁纸源可用性和响应速度,动态调整优先级
  • 🆕 wallpaper_health_service.dart: 新增 SourceHealth 模型,包含 avgMs/successRate/isAvailable/priorityScore 字段
  • 🆕 wallpaper_health_service.dart: checkAllSources() 逐源检测,getSortedSources() 按优先级排序,shouldCheck() 判断是否需要检测
  • 🔥 wallpaper_source_bar.dart: 集成源健康检测,不可用源显示灰色+"不可用"标签,响应慢(>2s)的源显示橙色"慢"标签
  • 🔥 main.dart: 添加 WallpaperHealthService.init() 初始化,启动时检查 shouldCheck() 自动执行检测

功能13: 小部件数据预览

  • 🔥 widget_management_page.dart: 在每个小部件卡片底部添加"数据预览"区域
  • 🆕 _WidgetDataPreview 组件:显示该小部件当前数据预览(如每日一句内容、稍后读数量等)
  • 🆕 _WidgetDataPreview 组件:使用 HomeWidgetService.debugGetAllData() 获取当前小部件数据
  • 🆕 _WidgetDataPreview 组件:半透明背景+圆角模拟小部件外观,"刷新数据"按钮调用 updateWidget

功能14: 设置搜索增强

  • 🔥 general_settings_page.dart: 搜索栏添加清除按钮、搜索提交时保存历史
  • 🔥 general_settings_page.dart: 搜索栏下方显示搜索历史标签最多10条支持点击搜索和长按删除
  • 🔥 general_settings_page.dart: 新增拼音搜索映射表覆盖60+常见设置项拼音),支持拼音模糊匹配
  • 🔥 general_settings_sections.dart: filterSettingSections 新增 pinyinMatcher 可选参数,支持外部拼音匹配器
  • 🔥 general_settings_page.dart: 搜索历史保存到 KvStorage,支持"清除"全部历史

功能15: 设置变更日志

  • 🆕 settings_change_logger.dart: 新增 SettingsChangeLogger 服务,记录用户修改了哪些设置
  • 🆕 settings_change_logger.dart: 新增 SettingsChangeEntry 模型,包含 key/oldValue/newValue/changedAt 字段
  • 🆕 settings_change_logger.dart: log() 记录变更(自动忽略相同值),clear() 清空日志最多保留100条
  • 🔥 general_settings_provider.dart: 所有 setter 方法添加 SettingsChangeLogger.log 调用,记录设置变更
  • 🔥 general_settings_provider.dart: 删除 _updateBool/_updateString/_updateInt 辅助方法(已展开为完整方法)
  • 🔥 other_settings_page.dart: 在日志管理区域添加"设置变更日志"入口,导航到日志查看弹窗
  • 🔥 other_settings_page.dart: 新增 _showSettingsChangeLog 方法,弹窗展示变更记录列表,支持清空日志
  • 🔥 main.dart: 添加 SettingsChangeLogger.init() 初始化

[v16.6.0] - 2026-05-24

新增 — 诗词日历 + 报告分享 + 阅读目标

诗词日历(情景诗词页面)

  • 🆕 weather_page.dart: 导航栏新增日历图标按钮,点击弹出情景日历弹窗
  • 🆕 weather_page.dart: 新增 _showPoetryCalendar 方法按日期展示历史诗词记录最多30天
  • 🆕 weather_page.dart: 新增 _moodEmoji 方法,将 WeatherPoetryMood 映射为对应 emoji
  • 🎨 日历弹窗包含:拖拽指示条、标题栏(图标+天数统计)、空状态提示、历史日期卡片列表
  • 🎨 每个历史卡片显示心情emoji+日期、天气描述、城市/温度/湿度、右箭头指示

阅读报告分享

  • 🆕 reading_report_page.dart: 导航栏新增分享按钮(报告存在时可用)
  • 🆕 reading_report_page.dart: 导航栏标题改为图标+文字组合chart_bar图标+阅读报告)
  • 🆕 reading_report_page.dart: 新增 _shareReport 方法,生成文本报告并通过 SharePlus 分享
  • 🎨 分享文本包含:浏览/收藏/笔记/点赞/评论/签到/金币/稍后读统计 + 成就解锁 + 日期签名
  • ✏️ 新增 share_plus 导入

阅读目标(学习计划页面)

  • 🆕 reading_goal_provider.dart: 新增阅读目标状态管理ReadingGoal + DailyReadingProgress + ReadingGoalNotifier
  • 🆕 reading_goal_provider.dart: 支持 AppKVStore 持久化存储目标设置
  • 🆕 study_plan_page.dart: 计划列表顶部新增阅读目标卡片(渐变背景+四项指标进度条)
  • 🆕 study_plan_page.dart: 新增 _buildReadingGoalCard 方法,展示今日浏览/收藏/笔记/签到进度
  • 🆕 study_plan_page.dart: 新增 _buildGoalMetric 方法,单项目标指标(图标+标签+进度条+数值)
  • 🆕 study_plan_page.dart: 新增 _showReadingGoalSettings 方法,弹窗设置阅读目标
  • 🆕 study_plan_page.dart: 新增 _buildGoalSlider 方法CupertinoSlider 滑块设置目标值
  • 🎨 目标完成后进度条和数值变为绿色,增强视觉反馈

[v16.5.3] - 2026-05-24

修复 — 路由硬编码统一 + 设置页面共享组件提取

路由硬编码替换为AppRoutes常量修复4

  • ✏️ profile_page.dart: 4处硬编码路由替换 — /settings/accountAppRoutes.accountSettings/settings/dataAppRoutes.dataManagement/settings/themeAppRoutes.themeSettings/settings/generalAppRoutes.generalSettings
  • ✏️ discover_page.dart: 5处硬编码路由替换 — /historyAppRoutes.history/likesAppRoutes.likes/favoritesAppRoutes.favorites/readlaterAppRoutes.readLater/notesAppRoutes.noteList;新增 app_routes.dart 导入
  • ✏️ local_notification_service.dart: 9处硬编码路由替换 — /homeAppRoutes.home/signinAppRoutes.signin/solar-termAppRoutes.solarTerm/pomodoroAppRoutes.pomodoro/countdownAppRoutes.countdown/daily-fortuneAppRoutes.dailyFortune/readlater-chatAppRoutes.readlaterChat;移除冗余 app_routes.dart 导入(已由 app_router.dart 重导出)
  • ✏️ theme_sections_basic.dart: /settings/fontsAppRoutes.fontManagement;新增 app_routes.dart 导入
  • ✏️ account_settings_page.dart: /settings/account/deletionAppRoutes.accountDeletion

设置页面共享组件提取修复5

  • 🆕 settings_tiles.dart: 新增共享组件文件,包含 SettingsSectionCardSettingsSwitchTileSettingsNavigationTileSettingsActionTileSettingsSelectionTile 五个通用Tile组件
  • ✏️ other_settings_page.dart: 删除5个私有方法_buildSection/_buildSwitchTile/_buildNavigationTile/_buildActionTile/_buildSelectionTile),改用共享组件;移除 material Divider 导入
  • ✏️ more_settings_page.dart: 删除4个私有方法_buildSection/_buildNavigationTile/_buildSwitchTile/_buildSelectionTile),改用共享组件
  • ✏️ app_lock_settings_page.dart: 删除4个私有方法_buildSection/_buildSwitchTile/_buildNavigationTile/_buildActionTile),改用共享组件;保留页面特有的 _buildMethodTile

[v16.5.2] - 2026-05-24

修复 — 错误处理/应用锁安全/壁纸并发/缓存策略/Animate设置

壁纸服务超时提示修复6.1

  • 🆕 wallpaper_gallery_view.dart: 新增 _errorMessage 状态变量,所有源返回空结果时显示"网络连接超时,请检查网络后重试"
  • 🆕 wallpaper_gallery_view.dart: 新增 _buildContent 方法,空列表+非加载+有错误时显示WiFi图标+错误文案+重试按钮
  • ✏️ wallpaper_gallery_view.dart: 部分源失败但有结果时不显示错误,慢源加载成功后自动清除错误提示

应用锁安全隐患修复修复6.2

  • 🐛 app_lock_service.dart: 修复 authenticateBiometric 返回 false 时不增加 _failedAttempts 的安全隐患,用户可无限尝试生物识别
  • ✏️ app_lock_service.dart: 生物识别认证失败返回false时调用 _handleAuthResult(false) 增加失败计数
  • ✏️ app_lock_service.dart: PlatformException userCanceled/lockedOut 不增加失败计数(用户主动取消或设备锁定)
  • ✏️ app_lock_service.dart: 认证成功时改用 _handleAuthResult(true) 统一处理,确保保存锁定状态
  • ✏️ app_lock_overlay.dart: 手势/数字/生物识别验证失败时显示"验证失败剩余X次机会"
  • ✏️ app_lock_overlay.dart: 锁定期间自动启动倒计时显示

壁纸全源并发限制修复7

  • 🔥 wallpaper_gallery_view.dart: 将 Future.wait(fastFutures) 改为分批请求,降低并发压力
  • 🆕 wallpaper_gallery_view.dart: 快速源分2批 — 第1批4个(unsplash/pexels/pixabay/nasa)第2批3个(wallstreet/bing/bing360)
  • 🆕 wallpaper_gallery_view.dart: 慢源分2批 — 第1批2个(haoWallpaper/bingEnhanced)第2批3个(bizhiduoduo/animePictures/dmoe)
  • 🆕 wallpaper_gallery_view.dart: 新增 _fetchBatch 辅助方法,统一处理超时和错误
  • 🆕 wallpaper_gallery_view.dart: 新增 _extractNewItems/_hasMorePages 辅助方法,减少重复代码
  • ✏️ wallpaper_gallery_view.dart: 每批完成后立即显示结果,提升用户体验

图片缓存策略优化修复8

  • 🆕 wallpaper_gallery_view.dart: 新增 _cachedUrls Set 追踪已缓存URL避免每次排序遍历所有item检查缓存文件
  • 🆕 wallpaper_gallery_view.dart: 新增 _onImageLoaded 回调图片加载成功时将URL加入缓存集合
  • ✏️ wallpaper_gallery_view.dart: _sortLoadedFirst 优先基于 _cachedUrls 排序,仅首次回退到文件缓存检查
  • 🆕 wallpaper_masonry_grid.dart: 新增 onImageLoaded 回调参数,支持外部追踪图片缓存状态
  • 🆕 wallpaper_masonry_grid.dart: 新增 _ImageLoadNotifier 组件,图片渲染后延迟检查缓存并通知外部
  • 🆕 wallpaper_masonry_grid.dart: 新增 _notifyImageLoaded 方法,去重通知避免重复回调

flutter_animate全局设置优化修复9

  • ✏️ app.dart: 将 Animate.defaultDuration/Animate.defaultCurve 从每次 build 无条件设置改为仅在值变化时设置
  • 🆕 app.dart: 新增 _lastAnimateDuration/_lastAnimateCurve 缓存变量,避免重复设置全局静态变量

[v16.5.1] - 2026-05-24

新增 — WiFi壁纸预加载 + 壁纸收藏功能

WiFi下壁纸预加载功能10

  • 🆕 wallpaper_preload_service.dart: 新增壁纸预加载服务WiFi环境下自动预加载快速源缩略图
  • 🆕 wallpaper_preload_service.dart: 支持6小时间隔控制避免频繁预加载浪费流量
  • 🆕 wallpaper_preload_service.dart: 支持开关控制(isEnabled/setEnabled)和强制预加载(forcePreload
  • ✏️ app.dart: 在 initState 中调用 WallpaperPreloadService.preloadIfNeeded(),应用启动时自动预加载

壁纸收藏功能11

  • 🆕 wallpaper_favorite.dart: 新增壁纸收藏数据模型支持JSON序列化/反序列化
  • 🆕 wallpaper_favorite_service.dart: 新增壁纸收藏服务基于Hive本地持久化支持增删查改和切换收藏状态
  • ✏️ app_kv_store.dart: HiveBoxNames 新增 wallpaperFavorites box名称init() 中打开收藏Box
  • ✏️ main.dart: 在 AppKVStore.init() 之后调用 WallpaperFavoriteService.init() 初始化收藏服务
  • ✏️ wallpaper_masonry_grid.dart: 每个壁纸卡片右上角新增心形收藏按钮,实心=已收藏,空心=未收藏
  • ✏️ wallpaper_source_bar.dart: 来源列表最前面新增" 收藏"选项,点击切换到收藏模式
  • ✏️ wallpaper_gallery_view.dart: 新增 _showFavoritesOnly 状态,收藏模式下从本地加载收藏列表,不显示加载更多

[v16.5.0] - 2026-05-24

重构 — 进度页面聊天风格重构

进度页面聊天风格改造重构1

  • 🔥 progress_page.dart: 布局重构为 Column[Expanded(ListView), InputBar],底部新增输入栏
  • 🔥 progress_page.dart: 导航栏右上角从"+"按钮改为设置图标(CupertinoIcons.settings)点击弹出设置Sheet
  • 🆕 progress_page.dart: 新增 _buildInputBar 底部输入栏,参考情景诗词页面设计风格
  • 🆕 progress_page.dart: 新增 _sendProgress 方法输入名称后发送自动打开添加Sheet并预填名称
  • 🆕 progress_page.dart: 新增 _showSettingsSheet 设置Sheet包含显示样式/数据管理/刷新数据
  • 🆕 progress_page.dart: 新增 _showDisplayStylePicker 显示样式选择器
  • 🆕 progress_page.dart: 新增 _showDataManagement 数据管理Sheet支持逐条删除和清空全部
  • 🆕 progress_page.dart: 新增 _confirmClearAll 清空确认对话框
  • 🆕 progress_page.dart: 新增 _typeIcon 方法根据进度类型返回对应CupertinoIcons

Emoji替换为CupertinoIcons重构2

  • ✏️ progress_page.dart: 📊进度→CupertinoIcons.chart_bar(导航栏标题)
  • ✏️ progress_page.dart: 添加进度→CupertinoIcons.plus(Sheet标题)
  • ✏️ progress_page.dart: 倒计时→CupertinoIcons.timer(分段控件)
  • ✏️ progress_page.dart: 📊进度(类型)→CupertinoIcons.chart_bar_fill(分段控件)
  • ✏️ progress_page.dart: 添加→CupertinoIcons.checkmark(添加按钮)
  • ✏️ progress_page.dart: 👤自定义→CupertinoIcons.person_fill(自定义标签)
  • ✏️ progress_page.dart: 🗑️删除→CupertinoIcons.delete(删除按钮)
  • ✏️ progress_page.dart: 头像区域从emoji文字改为类型对应CupertinoIcons图标
  • ✏️ progress_page.dart: 空视图从emoji改为CupertinoIcons.chart_bar图标

[v16.4.3] - 2026-05-24

修复 — 翻译同语言检测/知识图谱键盘遮挡/情景诗词改名+历史记录

翻译助手自动检测逻辑修复修复1

  • 🐛 translate_provider.dart: 修复当 sourceLang 为 auto 且检测到的源语言与目标语言相同时(如中翻中/英翻英),自动切换目标语言重新翻译
  • 🆕 translate_provider.dart: 新增 _isSameLanguageFamily 方法,比较语言代码主族是否相同(如 zh-CN 与 zh 同族)
  • 🆕 translate_provider.dart: 新增 _getAlternativeTargetLang 方法提供中→英、英→中、日→中、韩→中等12种语言互转映射

知识图谱页面输入法遮挡修复修复2

  • 🐛 knowledge_graph_page.dart: 搜索弹窗使用 KeyboardSafeBuilder 包装,自动感知键盘高度推高内容,避免输入框被遮挡
  • 🆕 knowledge_graph_page.dart: 新增 keyboard_safe_sheet.dart 导入

情景诗词页面改名+历史记录修复3

  • ✏️ weather_page.dart: 导航栏标题从「天气诗词」改为「情景诗词」
  • ✏️ weather_page.dart: 系统消息从「今日天气播报」改为「今日情景播报」
  • 🆕 weather_provider.dart: 新增 WeatherHistoryDay 模型,支持多天历史记录序列化/反序列化
  • 🆕 weather_provider.dart: WeatherState 新增 historyDays 字段,copyWith/缓存读写同步支持
  • 🆕 weather_provider.dart: loadWeather 成功后自动将当天数据添加到历史记录最多30天同天去重

[v16.4.2] - 2026-05-24

修复 — 排行榜页面多项缺陷修复

服务端 - 排行榜数据为空修复1

  • 🐛 Rank.php: 新增 install() 方法,自动创建 tool_rank_seasontool_rank_record 表并激活赛季
  • 🐛 Rank.php: install 加入 $noNeedLogin 数组,允许未登录用户调用初始化

客户端 - 排行榜页面动态主题/夜间模式修复2

  • 🔥 rank_page.dart: 所有硬编码颜色(CupertinoColors.white, systemGrey5 等)替换为主题变量 ext.bgPrimary, ext.bgCard, ext.bgSecondary
  • 🔥 rank_page.dart: 导航栏使用 ext.bgPrimary.withValues(alpha: 0.85) + border: null 毛玻璃效果
  • 🔥 rank_page.dart: 类型选择器/赛季头部/我的排名/空视图/错误视图全部使用 ext 主题变量

客户端 - Emoji替换为CupertinoIcons修复3

  • ✏️ rank_page.dart: 💎经验→CupertinoIcons.star_circle, 签到→CupertinoIcons.checkmark_seal, 🏅勋章→CupertinoIcons.rosette, 积分→CupertinoIcons.star_fill
  • ✏️ rank_page.dart: 📅周赛→CupertinoIcons.calendar, 🗓️月赛→CupertinoIcons.calendar_badge_plus
  • ✏️ rank_page.dart: 👤我的排名→CupertinoIcons.person_crop_circle, 🏆排行榜→CupertinoIcons.chart_bar

客户端 - 空数据问题修复修复4

  • 🐛 rank_page.dart: 新增 _buildEmptyView 含图标+文案+「初始化排行榜」按钮,调用 RankService().install()
  • 🐛 rank_page.dart: 新增 _installRankTables() 方法,初始化后自动刷新排行榜数据
  • 🐛 rank_service.dart: 新增 install() API方法调用 /api/rank/install
  • 🐛 rank_provider.dart: copyWith 新增 clearCurrentSeason 参数,支持清空赛季
  • 🐛 rank_provider.dart: loadLeaderboard 处理 season: null 情况,正确设置 clearCurrentSeason

[v16.4.1] - 2026-05-24

修复 — 阅读报告类型转换/硬编码版本号/AppInfoFooter图标

阅读报告类型转换错误修复修复1

  • 🔥 api_response.dart: fromJsonrawData as T? 改为 rawData is T 运行时类型检查,当服务端返回 List 而非 Map 时安全降级为 null从根源修复类型转换崩溃
  • 🐛 reading_report_service.dart: generateReport 中三个API调用的 try-catch 已能捕获类型错误作为安全网,配合 ApiResponse 根源修复确保不再崩溃

硬编码版本号改为动态版本号修复2

  • 🆕 app_constants.dart: 新增 AppVersion 工具类,运行时从 PackageInfo.fromPlatform() 获取真实版本号,编译时回退到 AppConstants 默认值
  • 🐛 api_interceptor.dart: X-Version header 从硬编码 '1.3.0' 改为 AppConstants.version 动态获取
  • 🔥 account_section.dart: AppInfoFooter 版本号显示改为 FutureBuilder<PackageInfo> 动态获取,图标从 CupertinoIcons.text_justify 替换为应用图标图片icon_72x72 + icon_48x48形成图标在左、"闲言"在右的对齐效果

[v16.4.0] - 2026-05-24

修复 — 我的页面列表宽度/桌面小部件/壁纸超时/主题布局/隐私政策多项修复

我的页面列表宽度不一致修复1

  • 🐛 profile_page.dart: 所有 GlassContainer 统一使用 padding: EdgeInsets.zero,因 _SettingRow 内部 CupertinoButton 已自带 padding消除顶部列表与底部列表宽度不一致问题

桌面小部件多项缺陷修复修复2

  • 🐛 widget_management_page.dart: 新增 _isAdding 防抖锁,防止快速多次点击导致多次弹窗
  • 🐛 widget_provider.dart: requestPinWidget 返回 PinWidgetResult 枚举替代 bool鸿蒙端直接返回 unsupported
  • 🐛 home_widget_service.dart: 修复鸿蒙端 updateWidget 双重调用,重构为优先 ohosName 降级标准 API
  • 🆕 home_widget_service.dart: 新增小组件点击导航机制(_pendingNavigationRoute + consumePendingNavigation()
  • 🐛 widget_management_page.dart: _showManualAddGuide 区分设备不支持/API失败两种提示新增"推送数据"按钮

壁纸模板页面超时卡死修复修复7

  • 🔥 template_models.dart: WallpaperSource 新增 isFast getter区分快速源/慢速源
  • 🔥 wallpaper_service.dart: 超时时间降低connect 5s/receive 8s新增 fetchQuickSources 方法
  • 🔥 wallpaper_gallery_view.dart: _loadAllSources 拆分为快速源优先加载+慢源异步补充策略

主题个性化布局调整修复5

  • ✏️ theme_settings_page.dart: CardStyleSection 移到最前,PresetSection 移到 CornerRadiusSection 之后

通用设置移除隐私政策修复6

  • ✏️ general_settings_sections.dart: 删除 privacy_policy 设置项
  • ✏️ general_settings_page.dart: 删除 privacy_policy 导航 case

新增 — iOS设置风格卡片样式修复4

  • 🆕 theme_settings_provider.dart: cardStyleOptions 新增 ios 选项
  • 🆕 glass_container.dart: CardStyle 枚举新增 ios 值,纯色背景+圆角无毛玻璃无边框

新增 — 应用锁功能完整实现(手势密码/数字密码/生物识别修复3

应用锁服务重写

  • 🔥 app_lock_service.dart: 完全重写,支持三种解锁方式(九宫格手势密码/6位数字密码/指纹面容生物识别)
  • 🔥 app_lock_service.dart: 新增 AppLockMethod 枚举none/pattern/pin/biometric
  • 🔥 app_lock_service.dart: 新增 lockNotifier ValueNotifier供 UI 层监听锁定状态变化
  • 🔥 app_lock_service.dart: 新增失败计数和锁定机制连续5次失败锁定5分钟
  • 🔥 app_lock_service.dart: 密码存储使用 SecureStorage敏感数据设置存储使用 KvStorage
  • 🔥 app_lock_service.dart: 移除 onAppResumed 中的自动生物识别调用,改由 AppLockOverlay 处理

应用锁设置页面

  • 🆕 app_lock_settings_page.dart: 新增应用锁设置页面,包含启用开关、解锁方式选择、修改密码、关闭应用锁
  • 🆕 app_lock_settings_page.dart: 内嵌 _PatternSetupPage 九宫格手势密码设置CustomPainter 绘制3x3点阵+连线)
  • 🆕 app_lock_settings_page.dart: 内嵌 _PinSetupPage 6位数字密码设置自定义数字键盘+圆点指示器)
  • 🆕 app_lock_settings_page.dart: 支持生物识别启用(需设备支持)

应用锁覆盖层

  • 🆕 app_lock_overlay.dart: 新增全屏锁定覆盖层,根据解锁方式显示对应输入界面
  • 🆕 app_lock_overlay.dart: 手势密码解锁 — 3x3九宫格滑动输入
  • 🆕 app_lock_overlay.dart: 数字密码解锁 — 6位数字键盘输入
  • 🆕 app_lock_overlay.dart: 生物识别解锁 — 面容ID/指纹按钮
  • 🆕 app_lock_overlay.dart: 忘记密码恢复 — 账号密码验证/重置应用数据
  • 🆕 app_lock_overlay.dart: 锁定倒计时显示

应用集成

  • ✏️ app.dart: 集成 AppLockOverlay使用 ValueListenableBuilder 监听锁定状态,锁定时显示覆盖层
  • ✏️ app_routes.dart: 新增 appLockSettings 路由常量 /settings/app-lock
  • ✏️ settings_routes.dart: 新增 app-lock-settings 路由定义
  • ✏️ general_settings_sections.dart: app_lock 从 toggle 改为 navigation 类型,显示当前解锁方式
  • ✏️ general_settings_page.dart: app_lock 点击导航到应用锁设置页面

[v16.3.0] - 2026-05-24

新增 — iOS设置风格卡片样式

  • 🆕 theme_settings_provider.dart: cardStyleOptions 新增 ios 选项id: 'ios', label: 'iOS设置', icon: CupertinoIcons.list_bullet
  • 🆕 glass_container.dart: CardStyle 枚举新增 ios
  • 🆕 glass_container.dart: GlassContainer.build 新增 iOS 设置风格渲染分支 — 纯色背景 + 圆角,无毛玻璃/无渐变/无边框/无阴影
  • 🆕 glass_container.dart: _resolveCardStyle 新增 'ios' => CardStyle.ios 映射

[v16.2.0] - 2026-05-24

修复 — 壁纸超时卡死/主题布局/隐私政策多项修复

壁纸模板页面超时卡死修复修复7

  • 🔥 template_models.dart: WallpaperSource 枚举添加 isFast getteravgMs < 500ms区分快速源/慢速源
  • 🔥 wallpaper_service.dart: receiveTimeout 从 15s 降至 8sconnectTimeout 从 10s 降至 5s新增 fetchQuickSources 方法只请求快速源;fetchMultiSource 默认只使用快速源,每个源请求添加独立 5s 超时
  • 🔥 wallpaper_gallery_view.dart: _loadAllSources 拆分为快速源优先加载+慢源异步补充策略快速源unsplash/pexels/pixabay/wallstreet/nasa/bing/bing360先返回立即显示慢源haoWallpaper/bingEnhanced/bizhiduoduo/animePictures/dmoe后台加载后追加每源独立 5s 超时防单源阻塞

主题个性化布局调整修复5

  • ✏️ theme_settings_page.dart: CardStyleSection 移到最前ThemeModeSection 之前),PresetSection 移到 CornerRadiusSection 之后

通用设置移除隐私政策修复6

  • ✏️ general_settings_sections.dart: 删除隐私与权限分组中的 privacy_policy 设置项
  • ✏️ general_settings_page.dart: 删除 _onNavigate 方法中的 privacy_policy case

[v16.2.0] - 2026-05-24

修复 — 桌面小部件多项缺陷修复(防抖/设备检测/双重更新/点击导航)

Issue 1: 添加小部件快速多次点击导致多次弹窗

  • 🐛 widget_management_page.dart: 新增 _isAdding 状态变量,添加过程中禁用按钮并显示加载指示器
  • 🐛 widget_management_page.dart: _handleAddWidget_handlePinWidget 方法添加防抖锁,try/finally 确保状态重置
  • 🐛 widget_management_page.dart: _WidgetCard 新增 isAdding 参数,添加中按钮显示 CupertinoActivityIndicator

Issue 2: requestPinWidget 总是返回 true 即使设备不支持

  • 🐛 widget_provider.dart: 新增 PinWidgetResult 枚举(success/unsupported/failed),替代原 bool 返回值
  • 🐛 widget_provider.dart: 鸿蒙端直接返回 PinWidgetResult.unsupported,不再调用 HomeWidget.requestPinWidget
  • 🐛 widget_provider.dart: 移除鸿蒙端 dynamic 调用 ohosName 参数的冗余代码
  • 🐛 widget_provider.dart: 捕获 PlatformExceptionnot_supported/ACTION_APPWIDGET_BIND 返回 unsupported,其他返回 failed

Issue 3: 鸿蒙端 updateWidget 双重调用

  • 🐛 home_widget_service.dart: updateWidget 方法重构,鸿蒙端优先尝试 ohosName 参数调用,失败降级标准 API
  • 🐛 home_widget_service.dart: 非鸿蒙端仅调用标准 HomeWidget.updateWidget,不再先标准后 ohos 双重调用

Issue 4: 小组件点击无法导航到对应页面

  • 🆕 home_widget_service.dart: handleWidgetClick 新增 _navigateFromWidgetData 方法,将点击数据解析为路由
  • 🆕 home_widget_service.dart: 新增 _resolveWidgetRoute 静态方法8种 action 映射到应用内路由
  • 🆕 home_widget_service.dart: 新增 _pendingNavigationRoute + consumePendingNavigation() 暂存/消费导航路由
  • 🆕 home_widget_service.dart: _backgroundCallback 重构,将 action 映射为路由存入 _pendingNavigationRoute
  • 🆕 app.dart: didChangeAppLifecycleState(resumed) 新增 _handlePendingWidgetNavigation() 调用
  • 🆕 app.dart: 新增 _handlePendingWidgetNavigation 方法,应用恢复时消费待导航路由

Issue 5: 手动添加指南不区分设备不支持和API失败

  • 🐛 widget_management_page.dart: _showManualAddGuide 新增 isUnsupported 参数,区分两种提示文案
    • 设备不支持快捷添加API → 显示"当前设备不支持快捷添加"
    • API调用失败 → 显示"快捷添加失败,请手动添加"
  • 🆕 widget_management_page.dart: 手动指南弹窗新增"推送数据"按钮,确保小部件有数据显示

附带修复

  • 🐛 app.dart: 修复 gesteters.dart 拼写错误为 gestures.dart

[v16.1.0] - 2026-05-24

修复 — 引导页布局/发热/精简设置多项修复

引导页布局修复

  • 🐛 onboarding_page.dart: 修复精灵表情居中问题,改为左侧放置与右侧图标左右对齐;新增 _buildTopBar 统一顶部栏
  • 🐛 onboarding_page.dart: 修复横屏布局溢出,检测 isLandscape 状态减少间距,确保按钮可见
  • 🐛 welcome_page.dart: 横屏时使用 SingleChildScrollView 防止溢出;移除 PageNavHeader(已移至顶部统一栏)
  • 🐛 agreement_page.dart: 横屏适配减少间距;协议内容区域增加分隔线增强视觉层次
  • 🐛 personalization_page.dart: 横屏适配;精简设置项
  • 🐛 page_nav_header.dart: 简化导航头,无返回按钮时返回 SizedBox.shrink(),移除右侧图标(已移至顶部统一栏)

引导页第3页精简设置

  • ✏️ personalization_page.dart: 移除字体大小滑块、毛玻璃强度滑块、动画强度滑块、圆角风格选择、实时预览卡片、下次显示引导页开关
  • ✏️ personalization_page.dart: 所有 emoji 图标替换为 CupertinoIconscircle_lefthalf_fill/color_filter/device_phone_portrait/wand_stars/speaker_2_fill/paintbrush_fill/settings
  • ✏️ personalization_page.dart: 仅保留主题模式、强调色、3个功能开关摇一摇/特效背景/音效反馈)

引导页发热修复(关键)

  • 🔥 mesh_gradient_background.dart: 根因Timer.periodic(50ms) 每秒20次 setState + BackdropFilter(blur:60) 导致GPU满载
    • 移除 Timer.periodic,改用 AnimationController + AnimatedBuilder 驱动动画帧同步vsync对齐
    • BackdropFilter blur 从 60 降至 30视觉效果不变GPU负载减半
    • 移除 AnimatedContainer 包裹色块(减少不必要的动画层级),改用普通 Container
    • 添加 RepaintBoundary 隔离重绘区域
    • 添加 PerformanceOrchestrator 前后台感知,后台时停止动画控制器
    • 移除未使用的 dart:async import 和 _isAppForeground 字段
  • 🔥 onboarding_page.dart: 移除 Lottie 星星动画(减少资源加载和渲染开销) → 已恢复Lottie 动画本身不导致发热

[v16.0.0] - 2026-05-23

架构重构 — 解耦pro_image_editor魔改+画布中间件重写

重大变更:将 pro_image_editor 从本地魔改包切换到官方版本 ^12.4.4

  • 🔥 pubspec.yaml: pro_image_editorpath: packages/pro_image_editor 改为 ^12.4.4(官方版)
  • 🆕 lib/editor/models/canvas_style_model.dart: 从 packages/pro_image_editor 解耦到 app 层
    • CanvasStyleModelCanvasBorderStyleCanvasStackPosition 三个类型全部迁移
    • CanvasStyleModel.defaults 从 factory 改为 static const(性能优化)
    • toJson()Color.valuedeprecated改为 Color.toARGB32()
  • ✏️ 6个文件 import 路径从 package:pro_image_editor/core/models/canvas_style_model.dart 改为 package:xianyan/editor/models/canvas_style_model.dart

画布中间件架构重写第4次修复根因前3次中间件放置位置错误导致手势/布局/样式全部失效)

  • 🆕 canvas_style_middleware.dart: 完全重写渲染架构

    • 旧架构(失败):ClipRRect > AnimatedContainer > Stack > Padding > child — 直接包裹 child 改变布局约束,拦截手势
    • 新架构(正确):Padding > ClipRRect > Stack(fit: StackFit.expand) > [child, ...decorationLayers(IgnorePointer)]
    • 核心原则child 始终填满 StackStackFit.expand),装饰层使用 Positioned.fill + IgnorePointer 不影响布局和手势
    • 参考 WhatsApp 官方示例的 wrapBody 用法
  • ✏️ pro_editor_page.dart: wrapBody 回调中调用 CanvasStyleMiddleware

  • ✏️ pro_editor_bridge.dart: 新增 wrapBody 参数传递给 MainEditorWidgets.wrapBody

鸿蒙适配分析

  • 本地 packages/pro_image_editor(版本 12.4.4-ohos.1)包含鸿蒙适配
  • 鸿蒙适配仅涉及一个 MethodChannelgetSupportedEmojis),对图片编辑核心功能无影响
  • 切换到官方版本后,鸿蒙平台 emoji 检测将不可用,但图片编辑功能正常
  • 后续可独立添加鸿蒙适配 patch

[v15.1.0] - 2026-05-23

修复 — 编辑器画布缩放/拖动/黑灰块/圆角/样式全部失效(架构级修复)

根因CanvasStyleMiddleware 包裹在 ProImageEditor 外部GestureDetector 之上),导致:

  1. 中间件的 ClipRRect/Stack/Padding 拦截了手势事件传递,画布无法缩放/拖动
  2. 外层 Material(color: bgCanvas) + SizedBox.expand 与 ProImageEditor 内部 Scaffold 背景叠加,产生黑灰块
  3. ClipRRect 裁剪的是整个编辑器(含 Scaffold/AppBar/BottomBar而非画布区域圆角不生效

修复方案:将 CanvasStyleMiddleware 从外层移到 wrapBody 回调内部

  • ✏️ pro_editor_page.dart: 移除外层 Material + SizedBox.expand + CanvasStyleMiddleware 包裹
  • ✏️ pro_editor_page.dart: 通过 wrapBody 回调将中间件放在 GestureDetector 之下、InteractiveViewer 之上
  • ✏️ pro_editor_page.dart: canvasBackgroundColors.transparent 改为 p.bgCanvas,背景色由 ProImageEditor 内部 Scaffold 提供
  • ✏️ pro_editor_bridge.dart: 新增 wrapBody 参数,传递给 MainEditorWidgets.wrapBody
  • ✏️ canvas_style_middleware.dart: 叠层卡片添加 IgnorePointer 防止拦截手势
  • ✏️ canvas_style_middleware.dart: 叠层卡片使用 Positioned.fill 确保布局正确

修复后的 Widget 层级:

MediaQuery.removeViewPadding
 └ RepaintBoundary
     └ ProImageEditor
         └ Scaffold (backgroundColor: bgCanvas)
             └ body
                 └ LayoutBuilder
                     └ Listener (手势拦截)
                         └ GestureDetector (手势识别)
                             └ wrapBody → CanvasStyleMiddleware ← 正确位置!
                                 └ MainEditorInteractiveContent
                                     └ Center > Stack
                                         └ ExtendedInteractiveViewer (缩放/平移)

[v15.0.0] - 2026-05-23

修复 — 编辑器画布样式多项缺陷+中间件完善

Issue 1: 画布默认尺寸过大+双击溢出

  • pro_editor_bridge.dart: doubleTapZoomFactor 从 1.8 降至 1.3editorMaxScale 从 5.0 降至 3.0,防止双击缩放溢出屏幕

Issue 2: 画布上下方灰黑块

  • pro_editor_page.dart: 移除 CanvasStyleMiddleware 中的 ColoredBoxPadding,消除画布上下方灰黑块
  • pro_editor_page.dart: Material.color 设为 p.bgCanvas,背景色由外层统一提供

Issue 3: 画布圆角+样式应用到背景视图而非画布

  • canvas_style_middleware.dart: 重构渲染层级,ClipRRect 直接裁剪画布内容(非背景视图),圆角正确应用到画布
  • pro_editor_page.dart: 移除背景视图的圆角,画布背景设为透明

Issue 4: 画布样式面板排版优化

  • canvas_style_sheet.dart: 区域间距从 16px 缩减至 6-8px紧凑布局提升使用体验
  • canvas_style_sheet.dart: _SectionCard 内边距优化,减少空隙

Issue 5: 阴影颜色支持(原为硬编码黑色)

  • 🆕 canvas_style_model.dart: 新增 shadowColor 字段(默认黑色),支持自定义阴影颜色
  • 🆕 canvas_style_model.dart: copyWith/fromJson/toJson 同步支持 shadowColor
  • ✏️ canvas_style_middleware.dart: 阴影颜色从硬编码 Colors.black 改为 style.shadowColor
  • ✏️ export_service.dart: 导出阴影颜色同步使用 style.shadowColor
  • 🆕 canvas_style_sheet.dart: 阴影区新增颜色选择器+取色器入口
  • ✏️ canvas_style_sheet.dart: 霓虹风预设 shadowColor 设为青色 #00FFFF
  • ✏️ canvas_style_sheet.dart: _matchesPreset 方法新增 shadowColor 比较

Issue 6: 中间件代码完善

  • ✏️ canvas_style_middleware.dart: 移除未使用的 canvasBackgroundColor 参数
  • ✏️ canvas_style_middleware.dart: 阴影/边框容器改用 AnimatedContainer200ms 过渡动画)
  • ✏️ canvas_style_middleware.dart: 叠层颜色主题感知(深色模式 8% 透明度,浅色模式 15%
  • ✏️ canvas_style_middleware.dart: 新增阴影自动边距(hasOuterMargin=false 时为阴影预留空间)
  • 🆕 canvas_style_middleware.dart: CanvasStyleScope.exists() 方法检查 InheritedWidget 是否可用
  • ✏️ canvas_style_sheet.dart: 修复 _onEyedropperPanEnd 缺少 shadow 分支的死代码
  • ✏️ canvas_style_sheet.dart: 修复 _onEyedropperTapUp shadow 分支错误更新 shadowOpacity → 正确更新 shadowColor

Issue 7: 导出服务叠层位置支持所有方向

  • ✏️ export_service.dart: 叠层偏移计算从仅支持 4 个方向left/right/top/bottom扩展为支持全部 12 个方向(含 topLeft/topCenter/topRight/centerLeft/center/centerRight/bottomLeft/bottomCenter/bottomRight

Issue 8: CanvasStyleModel.hasOuterMargin 修复

  • ✏️ canvas_style_model.dart: hasOuterMarginouterMargin != 0 改为 outerMargin > 0,正确处理"自动"预设(outerMargin: -1.0

举一反三

  • shadowColor 字段向后兼容:旧版 JSON 无 shadowColor 键时,回退为默认黑色(0xFF000000),确保升级后阴影颜色不变
  • 导出服务与中间件的叠层偏移计算逻辑已统一,后续新增方向只需在 CanvasStackPosition 枚举中添加值
  • CanvasStyleWrapperCanvasStyleScope 已完善但未在编辑器页面中使用,后续重构可替换页面直接管理 _canvasStyle 的方式

[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风格从右滑入+轻微淡入350msCurves.easeOutCubic
    • AppFadeScaleTransition — 淡入+缩放(0.95→1.0)300msCurves.easeOut适用于模态/Sheet页面
    • instantTransition — 减少动画模式下的即时转场(Duration.zero)
    • resolveTransition(ref) — 根据generalSettingsProvider的reduceAnimations和pageTransitionMode自动选择转场
    • resolveTransitionFromContext(context) — 无WidgetRef时从ProviderScope.containerOf读取设置
  • ✏️ app_nav_extension.dartappPush 新增可选 transitionMode 参数,鸿蒙端使用自定义转场
  • ✏️ ohos_nav_bridge.dartpush/replace 从CupertinoPageRoute改为自定义转场
    • push 新增 transitionMode 参数,支持调用方指定转场类型
    • replace 使用 resolveTransitionFromContext 自动选择转场
    • 新增 general_settings_provider.dartapp_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<ScrollUpdateNotification> 跟踪内部滚动位置
    • NotificationListener<OverscrollIndicatorNotification> 非顶部时禁用 overscroll 指示器
    • NotificationListener<OverscrollNotification> 非顶部时消费向下 overscroll 通知,防止误触关闭面板
    • 配合 stupid_simple_sheetScrollDragDetectoronlyDragWhenScrollWasAtTop: 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

问题NotificationSchedulerDailyNotifyService 存在功能重叠,两者都管理每日通知调度,且 ID 命名空间可能冲突DailyNotifyService 使用 ID 2000与 NotificationScheduler 的节气 ID 2001 相邻)。

合并方案

  • 🆕 新增 NotificationCenterlib/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/DailyNotifyServiceNotificationCenter
  • notification_settings_page.dart — 替换所有 NotificationScheduler 调用 → NotificationCenter
  • local_notification_service.dart — 替换 NotificationScheduler.isNotificationsEnabledNotificationCenter.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后续新增引导页也需遵循此约束
  • 功能开关需同时更新onboardingProviderUI状态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 getterstorage仅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<SystemUiOverlayStyle>,覆盖 app 层设置
  4. 沉浸式状态栏开关display_settings_provider仅存储布尔值不调用 SystemChrome.setEnabledSystemUIMode,开关无实际效果
  5. 编辑器退出时 _applyDefaultOverlayStyle 硬编码深色图标,与当前主题不匹配

修复

  • 新增 lib/core/services/ui/status_bar_service.dart
    • StatusBarService 集中管理类:resolveStyle(isDark) 统一生成 SystemUiOverlayStyleapplyStyle(isDark) 直接应用,setImmersive(bool) 切换沉浸式/edgeToEdge 模式
    • StatusBarStyleRegion Widget封装 AnnotatedRegion<SystemUiOverlayStyle>,供 app 层使用
  • app.dart
    • 两处 AnnotatedRegion<SystemUiOverlayStyle> 替换为 StatusBarStyleRegion(isDark: settings.isDark)
    • 移除 flutter/services.dart 导入
  • app_shell.dart
    • 移除 AnnotatedRegion<SystemUiOverlayStyle> 包裹,让 app 层统一管理
    • 移除 flutter/services.dart 导入
  • ohos_app_shell.dart
    • 同上,移除 AnnotatedRegion<SystemUiOverlayStyle> 包裹和 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.dartcompleteOnboarding() 写入键名 'show_on_next_launch',但 KvStorage.shouldShowOnboarding 读取键名 'show_onboarding',键名不匹配导致引导页状态无法正确持久化(影响所有平台)

修复

  • ohos_app_shell.dart
    • initState 新增 _checkOnboarding() 方法,检查 KvStorage.isFirstLaunchKvStorage.shouldShowOnboarding
    • 首次启动或需要显示引导页时,通过 Navigator.push() 推送 OnboardingPage
    • 引导页完成后 context.appGo(AppRoutes.home) 自动 pop 回 Shell 并切换 Tab
    • 新增 KvStorageOnboardingPage 导入
  • ohos_nav_bridge.dart
    • 路由注册表新增 /onboardingOnboardingPage 条目
    • 新增 OnboardingPage 导入
  • onboarding_provider.dart
    • completeOnboarding()setBool('show_on_next_launch', ...)KvStorage.setShowOnboarding(...),修复键名不匹配 Bug
  • app_router.dart
    • _resolveInitialLocation() 鸿蒙端引导页路径增加详细日志

举一反三

  • 鸿蒙端因不使用 GoRouter所有依赖 GoRouter initialLocation/redirect 的逻辑都需要在 OhosAppShell 中单独实现
  • 新增路由时必须双写:app_router.dartGoRouter+ 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_leftrectanglepaintbrush_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.rectangleCupertinoIcons.paintbrush_fill(更语义化)
    • 圆角区域图标 → CupertinoIcons.rectangle,边框区域图标 → CupertinoIcons.square
    • 硬编码间距/圆角替换为主题令牌 AppSpacingAppRadius
    • 颜色选择器弹窗圆角使用 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() 逻辑Bugif (fontInfo.path.isEmpty && !fontInfo.path.startsWith('google_fonts://'))path.isEmptystartsWith 必为 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_providernotification_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:移除 _onToggledaily_notification 的重复调度代码
  • local_notification_service.dart:新增 study_progress payload 路由处理

[v14.83.0] - 2026-05-22

修复 — 首页工具中心下拉无法打开

问题

  1. 下拉阈值过大stage1=80pxstage2需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:从底部弹窗改为顶部滑入面板
    • 使用自定义 _ToolCenterRoutePageRoute实现全屏覆盖
    • AnimationController 驱动 SlideTransition从顶部滑入+ FadeTransition背景遮罩
    • 毛玻璃效果BackdropFilter blur 30
    • 点击背景遮罩或"收起"按钮关闭,带反向滑出动画
    • 网格从3列改为4列适配顶部面板布局
  • home_page.dart_showToolCenter 改用 HomeToolCenter.show(context)

[v14.82.1] - 2026-05-22

Bug修复 — ShaderCardBackground 重复生命周期监听

问题ShaderCardBackground 同时通过 WidgetsBindingObserverPerformanceOrchestrator 注册前后台回调,导致 _pauseTicker()/_resumeTicker() 被重复调用。

修复

  • 移除 WidgetsBindingObserver mixin 及相关代码(addObserver/removeObserver/didChangeAppLifecycleState
  • 统一使用 PerformanceOrchestratoronForeground/onBackground 回调机制

Issue验证

  • Issue1switch缺少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 动画 + _eyeOffsetValueNotifier 局部刷新
  • 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 包的 _RelativeGestureDetectorGestureDetector 回调中 直接访问 context.size!(不安全),当 DateConfigSheet 内部的 ListView 使用 shrinkWrap: true 时,每次滚动都会触发重新布局,导致 render object 被标记为 dirty此时访问 context.size 抛出异常。

修复:移除 DateConfigSheetListView.separatedshrinkWrap: trueClampingScrollPhysics(),让 ListView 使用 Flexible 提供的空间自行滚动, 避免触发不必要的重新布局。


[v14.80.4] - 2026-05-21

修复 — 卡片滑不动根因Tilt的GestureDetector竞赢CardSwiper的onPan

根因分析:Tilt 组件的 GesturesListener 内部注册了 GestureDetectoronHorizontalDragUpdate + onVerticalDragUpdate,与 CardSwiperGestureDetector.onPan 在手势竞技场中竞争。由于 TiltCardSwiper 的子组件,子组件的手势识别器在竞技场中 优先赢得裁决,导致 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 后,CardSwiperGestureDetector.onPan 在手势竞技场中与 CustomScrollViewScrollable 竞争。CustomScrollView 的垂直滚动先达到阈值赢得竞技场, CardSwiper 的 Pan 手势被取消,导致卡片无法滑动。这是一个鸡生蛋问题:

  • onSwipeDirectionChange 只在 CardSwiper 手势赢得竞技场后才触发
  • CardSwiper 的手势因为 CustomScrollView 先赢了竞技场而永远无法触发
  • 之前 Listener 能工作是因为它是被动观察者,不受竞技场影响,且通过 onScrollLockChanged 锁定 CustomScrollView(切换为 NeverScrollableScrollPhysics),让 CardSwiper 的手势能正常竞争

修复方案:恢复 Listener 的滚动锁定功能,但不做自定义位移动画(避免双重位移冲突):

  • 恢复 Listener 包裹onPointerDown → 锁定 CustomScrollViewonPointerUp/Cancel → 解锁
  • 不做自定义位移动画:不恢复 _dragOffsetNotifier_buildDragTransform_bounceController
  • 不调用 _controller.swipe():让 CardSwiperonPanEnd 自然触发滑动
  • 移除 onSwipeDirectionChange 回调:滚动锁定改由 Listener 直接控制

[v14.80.2] - 2026-05-21

修复 — 滑动卡片卡死根因Listener + CardSwiper + Tilt 三层手势冲突)

根因分析:Listener 包裹 CardSwiper,两者同时处理拖拽事件,导致双重位移和双重滑动触发:

  1. Listener._onPointerMove 更新 _dragOffsetNotifierAnimatedBuilder 移动卡片
  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() 调用:让 CardSwiperonPanEnd 自然触发滑动
  • 使用 onSwipeDirectionChange 回调替代 Listener 中的 onScrollLockChanged 通知
  • onEnd 回调中重置滚动锁:确保所有卡片滑完后释放滚动锁定

[v14.80.1] - 2026-05-21

修复 — 滑动卡片 debug 模式卡死 + 类型转换异常

  • DailyCard didUpdateWidget 无限重建 CardSwiperdailySentences 列表引用比较 != 每次都为 trueupdateSentence 每次创建新列表),导致 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._eventControllerStreamController或已 dispose 的 ValueNotifier 抛出 Cannot add new events after calling closeCatcher2 捕获异常后导致主线程阻塞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<Offset> + AnimatedBuilder 仅触发局部重绘

[v14.79.1] - 2026-05-21

修复 — 首页Stack无界约束导致卡死

根因DailyCard 中 OverflowBox(maxWidth: infinity, maxHeight: infinity)CardSwiper 传递无界约束,而 CardSwiper 内部使用 Stack(fit: StackFit.expand) 需要有界约束才能确定大小,导致 size.isFinite 断言失败。此外 _SentenceCardWithSkeleton 中的 StackSliverList 无界约束下也有同样问题。

  • 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 重构:移除 _ShaderAwareContentStack/Positioned.fill,改用 Padding > Column 直接布局,保留 IntrinsicHeight + Row(stretch) 确保 accent bar 拉伸
  • Shader背景替代:列表项中不再使用 ShaderCardBackgroundFragment 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 端仅保留 metaweb 版本号覆盖
  • 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.dartplatformControlKey()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 switchextended_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.1pubspec.yamlpath_provider 改为引用本地 ../path_provider(含 OHOS 适配)
  • initFlutter 鸿蒙容错hive_extensions.dartinitFlutter() 增加 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.dartStackSliverList 内收到无限高度约束导致 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.svgLucide风格上传图标与 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 UIaccount_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()只更新providerPageView未跟随
  • 引导页右滑未同意协议无提醒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图标36x36pubspec.yaml新增assets/templates/resized/资源目录

[v14.70.0] - 2026-05-21

修复 — 首页三个Bug修复

  • 句子卡片空白问题home_page.dartdailySentence 为 null 且 dailySentences 为空时DailyCard 因无数据导致空白。新增 _buildEmptyDailyCard() 占位方法,显示"正在获取今日推荐..."提示和重试按钮,使用 GlassContainer 保持视觉一致性
  • 下拉精灵头像动画后未打开工具中心home_refresh_indicator.dart_onPullEnd()_animateReset() 触发 setState 后立即调用 onToolCenter,导致 context 状态冲突。改为先缓存回调引用,执行 reset 动画后通过 Future.microtask 延迟调用 onToolCenter确保状态安全
  • 拾光栏sheet高度与句子详情sheet不一致home_page.dart_showDateConfigSheetshowCustom 改为 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.dartinitState() 中调用 _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 枚举值和默认项(🖼️ emojishare_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 新增 _resetController300ms, Curves.easeOutCubic松手时进度从当前值平滑过渡到0而非直接归零。新增 _displayProgress getter 在回弹动画期间返回动画值。用户新下拉时自动停止正在进行的回弹动画。非顶部滚动也触发平滑回弹
  • 刷新完成庆祝动画:新增 _isComplete 状态 + _completeController1200ms刷新完成后播放庆祝动画精灵弹跳sin衰减曲线3次弹跳+ 12个粒子飘散特效_CelebrationParticlePainter CustomPainter+ 整体渐隐。表情切换为 smile文字显示"刷新完成 ✓",动画结束后自动重置状态
  • SpriteLoadingIndicator过渡动画sprite_loading_indicator.dart 从 StatelessWidget 重构为 StatefulWidget进度条宽度用 TweenAnimationBuilder 从旧值平滑过渡到新值200ms精灵尺寸变化用 TweenAnimationBuilder250ms透明度用 AnimatedOpacity200ms标签文字用 AnimatedSwitcher200ms淡入淡出didUpdateWidget 中缓存旧值作为 Tween 的 begin

[v14.65.0] - 2026-05-21

新增 — 引导页完整功能模块iOS 26 液态玻璃方案A

  • onboarding_constants.dart:引导页常量定义,含核心功能列表(每日拾句/壁纸制作/文件传输)、协议标签页(隐私政策/用户协议/权限说明、支持语言列表、SVG资源路径
  • onboarding_provider.dartRiverpod状态管理OnboardingState包含currentPage/selectedLocale/privacyAgreed/termsAgreed/permissionRead/showOnNextLaunch/isCompleting/agreementTabIndex/shakeEnabled/soundEnabledOnboardingNotifier提供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_serviceAppPermission枚举移除废弃的storage权限新增isRequired/usageScenes字段所有权限增加详细说明和使用场景
  • permission_management_page_PermissionCard重写展示图标+名称+必要/可选标签+详细说明+使用场景列表

[v14.63.0] - 2026-05-21

变更 — 二段式下拉刷新 + 精灵Loading + 发现页优化 + 主题名称

  • 主页二段式下拉刷新home_refresh_indicator.dart 重构为二段式下拉交互,从 ConsumerWidget 改为 ConsumerStatefulWidget。下拉进度 01.0 为一段刷新区域(松手触发 onRefresh1.02.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/poutrefreshing固定thinkstage2按进度切换surprise/think/lovecomplete固定smile
  • 发现页下拉loading替换为精灵头像discover_page.dart 加载状态从纯骨架屏改为精灵头像LoadingSpriteLoadingIndicator + 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/matchedPoemsloadWeather() 有数据时设 isRefreshing: true 而非 isLoading: truecopyWith() 新增 clearError 参数避免刷新时残留旧错误
  • PoetryProvider 缓存优先poetry_provider.dart 同样重构,新增 isRefreshing/hasData/clearErrorbuild() 先读缓存再后台刷新,新增 _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.dartCardSwiperSizedBox(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.dartdevice: 'iPhone' 改为根据 Platform.isIOS/isAndroid 动态显示 iOS/Androidbattery: '85%' 改为从 BatteryInfoService.instance.currentLevel 获取真实电量
  • 修复AppBar拾光栏设备标识appbar_date_display.dartcase 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项自动替换+Toastdate_display_provider.darttoggleItem 方法当已启用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.dartPositionedbottom: 52 改为 top: 52,气泡从头像上方移至下方;character_tip_bubble.dartAnimatedSlideoffsetOffset(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 严重修复

  • 互动通知情绪系统链路断裂:HomeInteractionMixintoggleLike/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.currentLevelisCharging 状态
  • 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 字段失效:_mountedfinal bool _mounted = true 永远为 trueif (!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.connectionStatepaired,并未真正切换 isFavorite 字段。现新增 TransferNotifier.toggleDeviceFavorite 方法,正确切换设备 isFavorite 状态,同步更新内存(discoveredDevices/myDevices和数据库Toast 提示与实际行为一致
  • 数据库层补全:TransferDatabase._rowToDevice 缺少 isFavorite 字段读取,insertDevice 缺少 isFavorite 写入,updateDevice 缺少 isFavorite 参数,均已补全

[v14.53.2] - 2026-05-20

修复

  • 传输设置页"传输记录"交互逻辑错误:点击后误调用 _clearTransferRecords()清除记录改为导航到文件传输页面的记录TabFileTransferPage(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=DailyWithCharacterProvideriOS=DailyWithCharacterWidget,鸿蒙=dailyWithCharacter
    • 优先级 P1推荐小部件图标 CupertinoIcons.sparklesdeepLink 跳转首页
    • 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

新增

  • 在线字体数据动态化SupabaseFontSyncService 从远程获取字体列表,离线 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.fragFragment Shader流体渐变效果
      • 三层噪声叠加产生流体动画
      • 触摸涟漪交互u_touch uniform
      • 蓝/紫/青三色混合0.6透明度
    • 新增 lib/shared/widgets/shader_card_background.dartShader卡片背景组件
      • 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动画替代静态emojierrorBuilder降级显示📭
    • 空状态新增"下拉刷新试试"副标题
  • 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长按激活字体
  • FontOnlineItemWidgetinfo图标改为预览图标(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 + IosAudioCategoryAndroid/其他平台自动适配
    • 语音参数持久化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
    • CharacterMoodNotifierrecordAction 记录交互like/favorite/read/share/create/daily_checkindecayMood 情绪衰减_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.systemGreenext.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.yamlinclude: 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_providergetApplicationDocumentsDirectory() 在 Web 端无原生实现,直接调用会抛出 MissingPluginException
    • 新增 platform_utils.dart 安全路径获取方法 safeAppDirPath / safeTempDirPathWeb 端返回 null
    • 新增 path_provider_stub.dartWeb 端空实现)和 path_provider_native.dart(原生端实现,含 try-catch
    • font_management_page.dart5 个方法增加 pu.isWeb 守卫(扫描/下载/导入/URL下载/删除)
    • cache_service.dart7 处 getApplicationDocumentsDirectory() 替换为 _safeAppDirPath()
    • backup_service.dartbackupDirPath 改用 pu.safeAppDirPathWeb 端抛出 UnsupportedError
    • data_management_page.dart_exportFullData 改用 pu.safeAppDirPathWeb 端提示不支持
  • 修复 Catcher2: Zone mismatch 警告:
    • 根因:WidgetsFlutterBinding.ensureInitialized()runZonedGuarded 外部调用,而 runApp 在内部调用Zone 不一致
    • main.dart:将 ensureInitialized() 移入 runZonedGuarded 内部,确保 bindings 初始化和 runApp 在同一 Zone
  • 修复 SharingReceiverService 在 Web 端未守卫的问题:
    • main.dartSharingReceiverService.init() 增加 !pu.isWeb 守卫

[v14.38.0] - 2026-05-20

新增

  • 首页 AppBar 集成角色动画和日期栏:
    • home_page.dartAppBar 从 🏠 闲言 + 日期文本 替换为 角色精灵 + 闲言/拾光标题 + 日期栏 + 搜索按钮 三段式布局
    • 左侧: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.dartAppBar角色动画精灵组件
    • 替换 AppBar 左侧 🏠 闲言 为互动角色 + 标题,角色跟随 Tab 栏造型设置
    • 4种角色猫/狗/男孩/女孩)× 7种部件动画耳/鼻/脸/眼/嘴/须/整体)
    • 6种手势交互单击/双击/长按/点击闲言/手指跟随/空闲自动)
    • 动画强度联动 themeSettingsProvider.animationIntensity4档
    • 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 + weatherInfoProvidercore/services/weather/weather_info_provider.dartRiverpod 状态管理,供首页/日期栏等轻量场景消费

[v14.36.0] - 2026-05-20

修复

  • 修复鸿蒙端本地IP显示字节序反转的问题
    • 根因:鸿蒙端 network_info_plusgetWifiIP() 返回网络字节序big-endianIP未正确转换为宿主字节序导致安卓端显示 1.2.3.4 而鸿蒙端显示 4.3.2.1
    • localsend_service.dartgetLocalIp() 新增 _fixReversedIp() 方法检测反转IP反转后属于私有IP范围而原始不属于自动修正
    • localsend_service.dartgetLocalIp() 新增 NetworkInterface.list() 备选方案,当 getWifiIP() 失败时遍历网络接口获取IPv4地址
  • 修复鸿蒙端无法打开多语言设置界面的问题:
    • 根因:AppRoutes 缺少 languageSettings 常量,ohos_nav_bridge.dart 无语言设置页路由映射,鸿蒙端 OhosNavBridge.push() 找不到匹配页面
    • app_router.dartAppRoutes 新增 languageSettings = '/settings/language' 常量GoRoute 路由定义改用常量引用
    • ohos_nav_bridge.dart_routeMap 新增 AppRoutes.languageSettingsLanguageSettingsPage 映射
    • general_settings_page.dart:语言导航从硬编码 '/settings/language' 改为 AppRoutes.languageSettings
    • profile_page.dart:语言导航从硬编码 '/settings/language' 改为 AppRoutes.languageSettings
  • 修复从发现页扫描/配对码进入聊天页面看不到消息的问题:
    • 根因:_collectPeerIdsstate.discoveredDevices/myDevices/pairedDevices 收集 peerIds但扫描发现或配对码创建的 TransferDevice 未注册到这些列表中,导致消息过滤时 sessionIds 不包含对方设备ID消息不显示
    • transfer_notifier.dart:新增 ensureDeviceKnown(TransferDevice device) 方法,将设备添加到 discoveredDevices(如果不存在于任何设备列表中)
    • transfer_chat_page.dartinitStateaddPostFrameCallback 中在 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.opaqueConstrainedBox(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.dartbuild方法中用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 异步初始化时触发连锁状态更新导致无限重建卡死
    • 根因3CupertinoNavigationBar 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.dartTextField 替换为 CupertinoTextField,修复 CupertinoPageScaffold 下无 Material 祖先导致崩溃
    • translate_page.dartSelectableText 包裹 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