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