# Changelog 所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。 *** ## [v6.61.0] - 2026-06-12 ### 🚩 Feature Flag 后台动态配置 #### 新增 | 变更 | 说明 | |---|---| | tool_feature_flag 数据表 | 新增功能标志配置表,支持后台CRUD管理 | | 后台 FeatureFlag 管理模块 | admin/controller + model + lang,支持增删改查、安装、同步状态文本 | | API FeatureFlag 从数据库读取 | /api/feature_flag/list 和 /check 优先从数据库读取,数据库不可用时降级到硬编码(最多2条) | | status_text 动态标签字段 | 后端新增 status_text 字段,客户端直接使用后端返回的标签文本,不再硬编码"开发中/测试中/预览中/已发布" | | FeatureFlagItem.statusText | Flutter 模型新增 statusText 字段和 statusLabel getter | | install 接口 | /api/feature_flag/install 自动建表并插入默认数据 | | sync_status_text 接口 | 后台根据 status 自动同步 status_text 标签文本 | #### 修改 | 变更 | 说明 | |---|---| | FeatureFlag API 控制器 | 从硬编码改为数据库驱动,保留2条硬编码作为降级兜底 | | experimental_features_page.dart | _buildStatusTag 使用 flag.statusLabel 替代硬编码标签文本 | | feature_flag_service.dart | FeatureFlagItem 新增 statusText 字段,fromJson/toJson 同步更新 | #### 修改文件 | 文件 | 变更 | |---|---| | `docs/toolsapi/application/api/controller/FeatureFlag.php` | 重构为数据库驱动 + 2条降级兜底 + install接口 | | `docs/toolsapi/application/admin/controller/FeatureFlag.php` | 新增后台管理控制器 | | `docs/toolsapi/application/admin/model/FeatureFlag.php` | 新增后台模型 | | `docs/toolsapi/application/admin/lang/zh-cn/feature_flag.php` | 新增后台语言包 | | `docs/toolsapi/docs/API_ADMIN_DOC.md` | 新增第32节功能标志管理文档 | | `docs/toolsapi/scripts/deploy_feature_flag.py` | 新增部署脚本 | | `docs/toolsapi/scripts/test_feature_flag_api.py` | 新增测试脚本 | | `docs/toolsapi/scripts/register_feature_flag_menu.py` | 新增菜单注册脚本 | | `lib/core/services/feature/feature_flag_service.dart` | 新增 statusText/statusLabel | | `lib/features/settings/presentation/experimental_features_page.dart` | 使用 flag.statusLabel | *** ## [v6.60.1] - 2026-06-12 ### 🔔 通知统计对接 & 预览通知修复 #### 新增 | 变更 | 说明 | |---|---| | NotificationCenter 推送计数器 | 每次调度通知时 incrementPushCount +1,持久化到 KvStorage | | NotificationCenter 点击计数器 | 通知被点击时 incrementClickCount +1,payload→type 映射 | | NotificationCenter.resetAllCounts | 重置所有计数器方法 | | notificationStatsProvider 对接 | 从 NotificationCenter 计数器实时读取数据 | #### 修复 | 变更 | 说明 | |---|---| | 预览通知 id 冲突 | 从固定 id=999 改为时间戳取模,避免与正式通知 id 冲突 | #### 修改文件 | 文件 | 变更 | |---|---| | `core/services/notification/notification_center.dart` | 新增12个计数器存储键 + getter + incrementPushCount/incrementClickCount/resetAllCounts | | `core/services/notification/local_notification_service.dart` | _onNotificationTapped 中调用 _trackClickCount 递增点击计数 | | `features/settings/presentation/notification_settings_page.dart` | notificationStatsProvider 对接 NotificationCenter;预览 id 改为时间戳 | *** ## [v6.60.0] - 2026-06-12 ### 🔔 通知设置增强 — 权限检测/时间选择器/预览/统计/核心开关拆分 #### 新增 | 变更 | 说明 | |---|---| | anyCoreEnabled | NotificationSettingsState 新增 anyCoreEnabled getter(不含营销推送),通用设置页面使用此值判断推送通知开关状态 | | 通知权限检测 | 进入页面时检查系统通知权限,权限未开启时顶部显示红色警告卡片 + "前往设置"按钮 | | 长按预览通知 | 每个通知项长按触发 LocalNotificationService.showInstant 展示示例通知 | | 通知统计卡片 | 页面底部新增统计卡片,展示推送次数/点击次数/CTR(预留后端接口对接) | | NotificationStatsState | 通知统计状态类,含各类型推送/点击计数和点击率计算 | #### 修复 | 变更 | 说明 | |---|---| | CupertinoTimerPicker → CupertinoDatePicker | 时间选择器从计时器模式改为原生时间选择器,更符合 iOS 体验 | | minimumSize 弃用修复 | CupertinoButton 的 minSize 改为 minimumSize: Size.zero | #### 变更 | 变更 | 说明 | |---|---| | notificationEnabledProvider | 改用 anyCoreEnabled 判断,营销推送不影响通用设置页面的推送通知开关状态 | | _buildToggleRow | 新增 onLongPress 可选参数,支持长按预览 | | 多语言新增8键 | permissionDenied/permissionDeniedContent/goToSettings/previewNotification/notificationStats/pushCount/clickCount/noStats | #### 修改文件 | 文件 | 变更 | |---|---| | `features/settings/providers/notification_settings_provider.dart` | 新增 anyCoreEnabled getter | | `features/settings/providers/general_settings_provider.dart` | notificationEnabledProvider 使用 anyCoreEnabled | | `features/settings/presentation/notification_settings_page.dart` | 权限检测/CupertinoDatePicker/长按预览/统计卡片 | | `l10n/types/t_settings_notification.dart` | 新增8个翻译键 | | `l10n/languages/zh_cn.dart` ~ `bn.dart` | 14种语言新增8个翻译键 | *** ## [v6.59.0] - 2026-06-12 ### 🔔 通知设置页面重构 — 多语言/动态主题/重复图标修复/营销推送 #### 新增 | 变更 | 说明 | |---|---| | TSettingsNotification | 通知设置页面多语言翻译类型,覆盖30+翻译键 | | notification_settings_provider.dart | 从页面文件提取Provider到独立文件,避免循环依赖 | | NotificationSettingsState.anyEnabled | 状态类新增anyEnabled getter,统一判断是否有通知开启 | | 营销推送开关 | 新增"接收App营销信息"开关(默认关闭),前台接收闲言团队营销推送 | | NotificationCenter营销推送 | 新增isMarketingPushEnabled/setMarketingPushEnabled存储 | #### 修复 | 变更 | 说明 | |---|---| | 推送通知状态实时显示 | notificationEnabledProvider现在watch notificationSettingsProvider,通知设置页面的开关变更实时反映到通用设置页面 | | 通知设置页面重复图标 | _buildToggleRow移除emoji参数,标题不再拼接emoji,只保留左侧Icon图标 | | poetry_settings_page重复图标 | _buildSwitchRow移除emoji参数,修复4处调用 | | weather_settings_page重复图标 | _buildSwitchRow和_buildSegmentedRow移除emoji参数,修复5处调用 | | 通知设置页面导航栏 | 移除导航栏标题旁多余的bell图标,保持简洁 | #### 变更 | 变更 | 说明 | |---|---| | "推送通知管理"→"管理个性化推送" | 通知设置页面头部标题更名 | | 通知设置页面多语言 | 所有硬编码中文替换为i18n翻译调用,支持14种语言 | | 通知设置页面动态主题 | 所有颜色/样式使用AppThemeExtension,支持深浅色切换 | | 时间选择器多语言 | 取消/确定按钮使用t.common.cancel/confirm | | 提示卡片图标 | 💡emoji替换为CupertinoIcons.lightbulb_fill,跟随主题色 | #### 修改文件 | 文件 | 变更 | |---|---| | `l10n/types/t_settings_notification.dart` | 新建,通知设置翻译类型 | | `features/settings/providers/notification_settings_provider.dart` | 新建,提取Provider+State+Notifier | | `features/settings/presentation/notification_settings_page.dart` | 重构:多语言/动态主题/移除emoji/新增营销推送 | | `features/settings/providers/general_settings_provider.dart` | notificationEnabledProvider改为watch notificationSettingsProvider | | `core/services/notification/notification_center.dart` | 新增营销推送存储键和getter/setter | | `l10n/types/t_settings.dart` | 新增notificationSettings子类型 | | `l10n/types/t.dart` | 导出t_settings_notification.dart | | `l10n/languages/zh_cn.dart` | 新增notificationSettings翻译 | | `l10n/languages/en.dart` | 新增notificationSettings翻译 | | `l10n/languages/zh_tw.dart` | 新增notificationSettings翻译 | | `l10n/languages/ja.dart` ~ `bn.dart` | 11种语言新增notificationSettings翻译 | | `features/poetry/presentation/poetry_settings_page.dart` | 移除emoji参数,修复重复图标 | | `features/weather/presentation/weather_settings_page.dart` | 移除emoji参数,修复重复图标 | *** ## [v6.58.0] - 2026-06-12 ### 🔧 图标系统完善 — 设置UI/小尺寸优化/全局注入 #### 新增 | 变更 | 说明 | |---|---| | IconModeSection | 主题设置页面新增"图标风格"选择器(混合/仅系统/仅SVG),带描述文字 | | AppIconModeScope | InheritedWidget全局注入图标模式,App顶层包裹,无需每个AppIcon手动传iconMode | | WeatherIcon小尺寸回退 | size < 16 自动回退CupertinoIcons,避免CustomPainter细节丢失 | #### 变更 | 变更 | 说明 | |---|---| | AppIconMode枚举合并 | 从general_settings_provider迁移至app_icon.dart,统一为单一来源,新增label/id/fromId | | app.dart | 顶层包裹AppIconModeScope,从generalSettings.iconMode读取 | | weather_icon.dart | 移除material.dart冗余import,小尺寸分支使用CupertinoIcons | #### 修改文件 | 文件 | 变更 | |---|---| | `shared/widgets/display/app_icon.dart` | AppIconMode新增label/id/fromId字段,新增AppIconModeScope InheritedWidget | | `shared/widgets/display/weather_icon.dart` | 新增_fallbackIcon方法,build中size<16回退CupertinoIcons | | `features/settings/providers/general_settings_provider.dart` | 移除重复AppIconMode枚举,改为import app_icon.dart | | `features/settings/providers/sub/display_settings_provider.dart` | 新增import app_icon.dart | | `features/settings/presentation/theme/theme_sections_basic.dart` | 新增IconModeSection组件 | | `features/settings/presentation/theme/theme_settings_page.dart` | 添加IconModeSection到主题设置列表 | | `app/app.dart` | 顶层包裹AppIconModeScope,import app_icon.dart | *** ## [v6.57.0] - 2026-06-12 ### 🎨 图标系统增强 — 动画/语义/深浅色变体/天气自绘/图标模式 #### 新增 | 变更 | 说明 | |---|---| | AppIcon动画支持 | 新增animate/animationType/animationDuration/animationDelay参数,支持scaleIn/fadeIn/rotateIn/bounceIn/slideUp 5种入场动画(基于flutter_animate) | | AppIconStyle语义扩展 | 新增success/warning/error/info 4种语义样式,映射到ext.successColor/warningColor/errorColor/infoColor | | AppIcon无障碍增强 | 新增semanticLabel参数,Semantics包裹支持VoiceOver/TalkBack | | AppIcon深浅色变体 | 新增cupertinoIconDark参数,深色模式自动切换图标变体(如线框→填充) | | AppIconMode图标模式 | 新增AppIconMode枚举(mixed/cupertinoOnly/svgOnly),支持图标源优先级切换 | | WeatherIcon天气自绘 | CustomPainter自绘7种天气图标(sunny/cloudy/rainy/thunder/snowy/foggy/windy),支持动画效果(光线旋转/雨滴下落/雪花飘落/闪电闪烁等) | | 图标模式设置 | DisplaySettingsState新增iconModeId字段,支持用户在设置中切换图标渲染模式 | | ShareTarget.iconData | ShareTarget类新增iconData字段,11个默认分享目标全部映射CupertinoIcons | #### 变更 | 变更 | 说明 | |---|---| | weather_page.dart | 天气emoji替换为WeatherIcon自绘组件,支持动画和主题色适配 | | overview_dashboard.dart | AppIcon添加入场动画(scaleIn/bounceIn)和语义标签 | | home_sentence_card.dart | AppIcon添加语义标签(点赞数/收藏数/评论数/浏览量) | | share_sheet.dart | 使用ShareTarget.iconData替代手动映射,AppIcon添加语义标签 | | translate_page.dart | 空状态图标添加bounceIn动画,AppIcon添加语义标签 | | share_target.dart | load()方法从defaults匹配恢复iconData | #### 修改文件 | 文件 | 变更 | |---|---| | `shared/widgets/display/app_icon.dart` | 重写:新增6个参数(animate/animationType/animationDuration/animationDelay/semanticLabel/cupertinoIconDark/iconMode),AppIconStyle新增4种语义样式 | | `shared/widgets/display/weather_icon.dart` | 新建:7种天气CustomPainter + 动画 + 主题色适配 | | `features/share/share_target.dart` | 新增iconData字段,defaults全部映射CupertinoIcons | | `features/settings/providers/general_settings_provider.dart` | 新增AppIconMode枚举和setIconMode setter | | `features/settings/providers/sub/display_settings_provider.dart` | 新增iconModeId字段和getter/setter | | `core/constants/default_settings.dart` | 新增iconModeId默认值 | *** ## [v6.56.0] - 2026-06-12 ### 🎨 Emoji图标替换为CupertinoIcons,支持动态主题 #### 变更 | 变更 | 说明 | |---|---| | weather_page.dart | UI操作emoji(💧🌬️💨🤍📤📖😔)替换为CupertinoIcons(drop/compass/wind/heart/share/book/exclamationmark_triangle),天气类型emoji保留 | | home_sentence_card.dart | 统计emoji(👁👍⭐💬)替换为AppIcon+CupertinoIcons(eye/hand_thumbsup/star/chat_bubble),内容分类emoji保留 | | overview_dashboard.dart | 全部UI emoji替换为CupertinoIcons(search/star/book/clock/checkmark_seal/chart_bar/cloud_sun/settings/bolt/flame等),问候语emoji替换为sun_max/cloud_sun/sunset/moon/moon_stars | | share_sheet.dart | ShareScene枚举新增iconData字段,UI emoji(🔗✏️🗒️📝📋)替换为AppIcon+CupertinoIcons,Toast消息emoji保留 | | translate_page.dart | UI emoji(🌐📋⚙️🔊❌🔄🔍)替换为AppIcon+CupertinoIcons(globe/clock/settings/speaker_2/xmark_circle/refresh/search),国旗emoji保留 | #### 技术要点 | 要点 | 说明 | |---|---| | AppIcon组件 | 统一使用AppIcon组件,3级降级策略 CupertinoIcon→SVG→Emoji | | 动态主题 | 通过AppIconStyle(primary/secondary/disabled/accent)自动适配主题色 | | 保留策略 | 天气类型emoji、国旗emoji、内容分类emoji、Toast消息emoji保留原样 | *** ## [v6.55.0] - 2026-06-12 ### 📡 RSS阅读器功能增强 #### 新增 | 变更 | 说明 | |---|---| | OPML导入导出 | 订阅源首页更多菜单支持📤导出OPML(分享文件)和📥导入OPML(选择文件) | | 文章搜索 | 文章列表页顶部搜索栏,支持搜索标题/内容/作者,实时过滤 | | 阅读进度同步 | 文章详情滚动位置自动保存,再次打开恢复到上次阅读位置 | | 卡片式阅读模式 | 文章列表可切换为卡片滑动模式(flutter_card_swiper),左右滑切换文章 | | 阅读进度条 | 文章卡片底部显示阅读进度指示条 | #### 变更 | 变更 | 说明 | |---|---| | RssState扩展 | 新增searchQuery/searchResults/isSearching/readingProgress/isCardMode字段 | | RssNotifier扩展 | 新增searchArticles/clearSearch/saveReadingProgress/toggleCardMode/exportOpml/importOpml方法 | | RssService扩展 | 新增阅读进度持久化(saveReadingProgress/getReadingProgress/getAllReadingProgress) | | rss_widgets扩展 | 新增RssCardModeView/RssSearchBar/RssSearchResultsList组件 | *** ## [v6.54.0] - 2026-06-12 ### 💝 收藏过期提醒功能 #### 新增 | 变更 | 说明 | |---|---| | FavoriteReminderService | 新增收藏过期提醒服务,定期检查长期未访问的收藏,发送本地通知 | | 过期提醒横幅 | 收藏页面顶部新增可关闭的提醒横幅,显示过期收藏数量 | | 提醒设置弹窗 | 支持启用/禁用提醒、设置提醒天数(7/14/30/60/90天) | | 多语言支持 | 新增7个翻译键(expiredReminder/expiredReminderMessage/viewExpired/reminderSettings/reminderEnabled/reminderDays),覆盖14种语言 | #### 修改文件 | 文件 | 变更 | |---|---| | `core/services/notification/favorite_reminder_service.dart` | 新建:收藏过期提醒服务 | | `l10n/types/t_favorites.dart` | 新增7个翻译字段定义 | | `l10n/languages/*.dart` | 14个语言文件新增翻译 | | `features/home/presentation/favorite/favorite_ui_views_mixin.dart` | 新增 `buildExpiredReminderBanner` 方法 | | `features/home/presentation/favorite/favorite_dialogs_mixin.dart` | 新增 `showReminderSettings` 方法 | | `features/home/presentation/favorite/favorite_state_accessor.dart` | 新增 `showReminderSettings` 抽象方法 | | `features/home/presentation/favorite/favorite_page.dart` | 集成过期检查和提醒横幅 | *** ## [v6.53.0] - 2026-06-12 ### 🔍 个人中心收藏搜索 #### 新增 | 变更 | 说明 | |---|---| | 收藏搜索页面 | 新增 `FavoriteSearchPage`,从个人中心导航栏搜索图标进入,支持搜索收藏内容、标签、分组 | | 最近搜索持久化 | 搜索历史存储至 KvStorage (`user_center_recent_searches`),最多保留10条,支持单条删除和全部清除 | | 防抖搜索 | 输入时 250ms 防抖,首次搜索时缓存本地数据库数据,避免重复查询 | | 搜索结果分类展示 | 结果按分组📁、标签🏷️、收藏内容❤️ 三类分组展示,点击可跳转至对应页面 | | 快捷入口 | 搜索页空状态时显示「我的收藏」和「标签云」快捷入口卡片 | | 搜索入口 | 个人中心导航栏右侧新增搜索按钮(🔍),点击打开收藏搜索页面 | #### 变更 | 变更 | 说明 | |---|---| | 个人中心导航栏 | trailing 从单个洞察按钮改为搜索+洞察按钮组合 | *** ## [v6.52.0] - 2026-06-12 ### 🔧 RSS阅读器全面重构 #### 新增 | 变更 | 说明 | |---|---| | Riverpod状态管理 | RSS阅读器从setState迁移至Riverpod,新增`rss_provider.dart`,状态与UI解耦 | | 收藏/书签功能 | 文章详情页新增收藏按钮,收藏状态持久化至Hive | | Shimmer骨架屏 | 文章列表加载时使用`ShimmerPlaceholder.card()`替代转圈指示器 | | FullScreenPhotoView图片画廊 | 图片画廊点击全屏查看,支持缩放/捏合手势 | | 分页加载 | 文章列表每页20条,底部"加载更多"按钮 | | 网络异常标签 | V2EX等不可达源在AppBar下方显示红色网络异常提示条 | | 查看原文确认弹窗 | "在浏览器中打开"改为"查看原文",跳转前弹窗确认 | | PopScope返回修复 | 安卓侧滑返回不再跳过RSS列表页,正确逐级返回 | | 订阅源未读数 | 订阅源卡片显示红色未读数徽标 | | 文章卡片收藏按钮 | 文章卡片标题行新增收藏图标 | #### 修复 | 变更 | 说明 | |---|---| | 知乎日报空白 | 增加宽松XML解析+HTML fallback,修复非标准RSS源解析失败 | | 安卓返回手势 | 使用PopScope拦截返回,文章详情→文章列表→订阅源首页逐级返回 | #### 变更 | 变更 | 说明 | |---|---| | 移除爱范儿/阮一峰 | 从默认推荐订阅源中移除 | | "在浏览器中打开"→"查看原文" | 按钮文案和图标更新,增加确认弹窗 | | StatefulWidget→ConsumerStatefulWidget | 与项目Riverpod架构统一 | *** ## [v6.51.0] - 2026-06-12 ### ✨ 收藏卡片搜索高亮 + 扩展滑动操作 #### 新增 | 变更 | 说明 | |---|---| | 搜索高亮 | FavoriteListCard/FavoriteGridCard 新增 `searchQuery` 参数,搜索时高亮匹配文本(accent色+粗体) | | 归档滑动操作 | FavoriteListCard 左滑新增「归档」操作(移到默认分组) | | 标签滑动操作 | FavoriteListCard 右滑新增「标签」操作(快捷添加标签) | | archiveFavorite 方法 | FavoriteActionsMixin 新增归档方法,调用 `updateFavoriteGroup` 清空分组 | | 翻译键 | TFavorites 新增 `archive`/`archived` 翻译键(14种语言) | #### 变更 | 变更 | 说明 | |---|---| | FavoriteListCard 构造函数 | 新增 `onArchive`(必填) + `searchQuery`(可选) 参数 | | FavoriteGridCard 构造函数 | 新增 `searchQuery`(可选) 参数 | | FavoritePageStateAccessor | 新增 `archiveFavorite` 方法声明 | | 滑动操作布局 | 左滑:分享+归档;右滑:取消收藏+标签 | *** ## [v6.50.0] - 2026-06-12 ### 🔄 收藏标签与分组从KvStorage迁移至Drift数据库 #### 变更 | 变更 | 说明 | |---|---| | Favorites表新增列 | `groupName`(TextColumn, 默认'') + `tagsJson`(TextColumn, 默认'[]'),存储收藏分组和标签数据 | | 数据库版本 V18→V19 | 新增迁移逻辑:addColumn + 从KvStorage迁移fav_tags_*/fav_group_*数据 | | 收藏页面筛选改用Drift | `_applyFilters()` 中分组/标签筛选从 KvStorage 同步读取改为使用内存状态映射 `_groupMap`/`_tagMap` | | 排序改用Drift | `applySortAndSearch()` 中按标签/分组排序从 KvStorage 改为使用 `tagMap`/`groupMap` | | 标签编辑改用Drift | `showTagDialog()` 读取现有标签从 tagMap 获取,保存改为 `AppDatabase.instance.updateFavoriteTags()` | | 标签云改用Drift | `showTagCloud()` 收集所有标签从 tagMap.values 获取,不再遍历 KvStorage | | StateAccessor新增 | `groupMap`/`tagMap` 状态访问器 + `reloadTagAndGroupMaps()` 方法 | #### 新增数据库方法 | 方法 | 说明 | |---|---| | `migrateFavoriteTagsFromKvStorage()` | V19迁移:从Hive读取fav_tags_*/fav_group_*写入Drift | | `updateFavoriteGroup(sentenceId, groupName)` | 更新收藏分组 | | `updateFavoriteTags(sentenceId, tags)` | 更新收藏标签(JSON序列化) | | `getFavoriteGroup(sentenceId)` | 获取单个收藏分组 | | `getFavoriteTags(sentenceId)` | 获取单个收藏标签列表 | | `getAllFavoriteTags()` | 获取所有收藏标签映射(标签云用) | | `getAllFavoriteGroups()` | 获取所有收藏分组映射 | | `getFavoriteCountByGroup()` | 获取各分组收藏数量 | *** ## [v6.49.0] - 2026-06-12 ### ✨ TTS朗读功能扩展至4个核心页面 #### 新增 | 页面 | 集成方式 | 说明 | |---|---|---| | 诗词页 `poetry_page.dart` | 快捷操作栏添加🔊朗读按钮 | 拼接诗词内容+出处后调用TtsPlayerSheet | | 翻译助手 `translate_page.dart` | 替换原有占位_speak方法 | 逐条朗读翻译结果,调用TtsPlayerSheet | | 稍后读 `readlater_page.dart` | 条目左滑添加"朗读"操作 | Feed类型朗读正文,其他类型朗读标题+副标题 | | RSS阅读器 `rss_reader_page.dart` | 文章详情导航栏添加🔊按钮 | 优先朗读阅读模式全文,降级朗读标题+摘要 | #### 变更 | 变更 | 说明 | |---|---| | FeatureFlag.ttsRead 默认启用 | `_defaults` 中添加 `'tts_read': true`,朗读功能不再显示"开发中"提示 | | SlideActionType 新增 speak | `AppSlidable` 枚举新增 `speak` 类型,紫色主题+CupertinoIcons.speaker_2 | | ReadLaterPageStateAccessor 新增 speakEntry | 声明朗读条目方法,OpsMixin中实现 | *** ## [v6.48.0] - 2026-06-12 ### ✨ TTS插件页面重构与增强 #### 新增 | 功能 | 说明 | |---|---| | TTS播放状态Provider | 新增 `ttsPlaybackProvider`(core/providers/),聚合系统TTS和在线TTS的播放状态、进度、错误,驱动UI实时更新 | | 实时播放进度 | 预览区播放时进度条动态推进,显示播放百分比;系统TTS使用逐字进度回调,在线TTS模拟进度 | | 播放/停止切换 | 预览区按钮根据状态切换:空闲→播放、播放中→停止、加载中→旋转指示器 | | 健康检查loading | 刷新健康状态时显示 `CupertinoActivityIndicator` 旋转指示器 + "检查中..."文案,防止重复刷新 | | 记录重播 | 朗读记录Slidable新增"重播"操作(紫色),左滑可见"重播"+"删除"两个按钮 | | 反馈邮箱组件 | "提交意见"改为弹出 `ContactEmailSheet` 公共邮箱底部面板,替换原空壳弹窗 | #### 变更 | 变更 | 说明 | |---|---| | TTS插件页面分流 | 原1729行单文件拆分为3个文件:`tts_plugin_page.dart`(页面+逻辑)、`tts_plugin_sections.dart`(UI区块)、`tts_plugin_picklers.dart`(Picker弹窗+常量) | | Picker通用化 | 5个CupertinoPicker弹窗提取为 `TtsPickers` 静态工具类,抽取 `_PickerHeader`/`_PickerSheet` 通用组件减少重复代码 | | 常量公开 | `_keyTtsLanguage`→`kKeyTtsLanguage`,`_ttsLanguages`→`kTtsLanguages`,工具函数公开为顶层函数 | #### 文件结构 | 文件 | 说明 | |---|---| | `core/providers/tts_playback_provider.dart` | 新增 — TTS播放状态Provider | | `settings/presentation/plugin/tts_plugin_page.dart` | 重构 — 页面主体+逻辑 | | `settings/presentation/plugin/tts_plugin_sections.dart` | 新增 — UI区块组件 | | `settings/presentation/plugin/tts_plugin_picklers.dart` | 新增 — Picker弹窗+常量 | *** ## [v6.47.0] - 2026-06-12 ### ✨ 收藏页面全面增强 #### 新增 | 功能 | 说明 | |---|---| | 搜索防抖 | 新增 `Debouncer` 工具类,搜索输入延迟300ms再触发过滤,避免大量数据时卡顿 | | 排序模式扩展 | 新增按标题字母序(`titleAlpha`)、按标签(`tag`)、按分组(`group`)、手动排序(`manual`)四种排序模式 | | 瀑布流视图 | 新增 `FavViewMode.staggered`,使用 `MasonryGridView` 实现瀑布流布局 | | 分组筛选栏 | 主列表顶部新增横向滚动分组筛选标签,点击切换分组过滤 | | 标签云入口 | 导航栏新增标签按钮,弹出标签云面板,支持按标签筛选 | | 导出为文件 | 导出功能从仅复制剪贴板升级为写入临时文件+系统分享面板(`share_plus`),支持TXT/JSON/CSV格式 | | 长按预览 | 卡片长按触发触觉反馈+预览弹窗,显示完整内容+类型+来源+操作按钮 | | 拖拽排序 | 手动排序模式下使用 `ReorderableListView`,拖拽调整收藏顺序,顺序持久化到KvStorage | | 自定义下拉刷新 | 使用 `custom_refresh_indicator` 替换原生 `RefreshIndicator` | | Shimmer骨架屏 | 加载状态使用 `shimmer` 动画替换静态骨架屏 | | 来源标识国际化 | 卡片来源标识(本地/云端)和同步状态(同步中/已同步/冲突)全部走i18n翻译 | | i18n新增21个翻译键 | `sourceLocal`/`sourceCloud`/`syncStatusSyncing`/`syncStatusSynced`/`syncStatusConflict`/`sortByTitle`/`sortByTag`/`sortByGroup`/`filterByGroup`/`allGroups`/`tagCloud`/`noTags`/`tagCount`/`exportSaved`/`exportSaveFailed`/`swipeToUnfavorite`/`cardSwipeHint`/`manualSort`/`preview`/`offlineMode`/`offlineSyncHint` | #### 变更 | 变更 | 说明 | |---|---| | `FavSortMode` 枚举扩展 | 从3个值(`newest/oldest/type`)扩展到7个,新增`titleAlpha/tag/group/manual` | | `FavViewMode` 枚举扩展 | 从2个值(`list/grid`)扩展到3个,新增`staggered` | | 视图切换按钮升级 | 从2模式切换改为3模式循环(list→grid→staggered),图标随之变化 | | 导出功能升级 | 原剪贴板复制保留为备选,主流程改为写入文件+系统分享 | | 骨架屏升级 | 从静态 `FavoritePageSkeleton` 升级为 `shimmer` 动画骨架屏 | | 刷新组件升级 | 从 `RefreshIndicator` 升级为 `CustomRefreshIndicator` | #### 文件结构 | 文件 | 说明 | |---|---| | `core/utils/debouncer.dart` | 新增:回调式防抖器 | | `favorite/favorite_enums.dart` | 扩展:排序/视图枚举 | | `favorite/favorite_state_accessor.dart` | 扩展:新增分组筛选/标签筛选/导出/国际化抽象方法 | | `favorite/favorite_actions_mixin.dart` | 扩展:新增排序模式/导出文件/来源国际化/同步状态国际化 | | `favorite/favorite_ui_mixin.dart` | 扩展:新增分组筛选栏/自定义刷新/shimmer骨架屏/排序菜单扩展 | | `favorite/favorite_dialogs_mixin.dart` | 扩展:新增标签云弹窗 | | `favorite/favorite_card.dart` | 扩展:新增长按预览/来源标签国际化参数 | | `favorite/favorite_page.dart` | 重构:集成所有新功能 | *** ## [v6.46.2] - 2026-06-12 ### 💄 拾光Sheet显示项配置交互优化 #### 变更 | 变更 | 说明 | |---|---| | 显示项配置改为按钮交互 | 原"选择要在拾光栏显示的信息(最多3项)"文本+列表改为按钮,显示已选项摘要(如 📅 日期 · 🌤 天气 · 📍 城市)和计数标签(2/3),点击弹出子Sheet配置开关 | | 主Sheet布局精简 | 移除Expanded ListView,主Sheet不再需要滚动,内容更紧凑 | *** ## [v6.46.1] - 2026-06-12 ### 🐛 拾光Sheet markNeedsPaint断言修复 #### 修复 | 修复 | 说明 | |---|---| | Sheet弹出时markNeedsPaint断言崩溃 | `_ScaledGlassSheetRoute`中`SnapshotWidget`的`backgroundSnapshotController.allowSnapshotting`在paint阶段被修改,触发`'owner == null || !owner!.debugDoingPaint'`断言。移除`SnapshotWidget`,改用`RouteSnapshotMode.never`禁用快照,底层页面通过`RepaintBoundary`隔离动画重绘 | | AppBarDateDisplay Stream重建重置 | `Stream.periodic`在`build`中创建导致每次重建重置定时器,移到`initState`中创建为`late final`;`ref.watch`从`StreamBuilder.builder`内移到`build`顶层,避免Riverpod反模式 | | SheetAnimationNotifier死代码清理 | `home_page.dart`中`AnimatedBuilder(animation: ref.watch(sheetAnimationProvider))`的`updateLayer()`从未被调用,移除无效包装和未使用import | *** ## [v6.46.0] - 2026-06-12 ### 📱 局域网二维码增强 + 收藏同步状态显示 #### 新增 | 功能 | 说明 | |---|---| | 局域网二维码增加设备信息 | `FileTransferDiscoveryTab._buildLanQrPayload()` 生成JSON格式payload,包含type/alias/ip/port/ts字段;弹窗中展示设备名和IP地址 | | 扫码识别xianyan-transfer类型 | `QrCodeTab._processQrPayload()` 和 `QrcodeScannerPage._parseQrCode()` 优先识别JSON格式的`xianyan-transfer`二维码,解析设备信息后显示设备详情确认弹窗,用户确认后导航到传输页面 | | 通用扫码页面设备详情弹窗 | `QrcodeScannerPage` 新增 `QrCodeType.xianyanTransfer` 类型、`QrScanResult` 设备信息字段、`_buildTransferDeviceInfo()` 和 `_showDeviceDetailAndNavigate()` 方法 | | 收藏同步状态标识 | `FavoriteSyncStatus` 枚举(idle/syncing/synced/conflict),收藏列表来源标识旁显示同步状态标签(🔄同步中/✅已同步/⚠️冲突),网格视图仅显示图标 | | 同步进度条冲突状态 | `_buildSyncProgressBanner()` 增加 `conflict` 状态,使用橙色 + ⚠️图标 | #### 变更 | 变更 | 说明 | |---|---| | `SyncStatus` → `FavoriteSyncStatus` | 枚举重命名,值从`{idle, syncing, success, failed}`改为`{idle, syncing, synced, conflict}`,语义更清晰 | | 局域网二维码兼容旧格式 | 扫码仍支持纯HTTP URL格式(旧二维码),自动导航到传输页面 | | 收藏同步进度条冲突状态 | `_buildSyncProgressBanner()` 增加 `conflict` 状态,使用橙色 + ⚠️图标 | *** ## [v6.46.0] - 2026-06-12 ### ✨ 功能增强 | 变更 | 说明 | |---|---| | 快捷方式"搜索APP内功能"自动弹出搜索框 | 长按icon选择搜索快捷方式后,跳转"我的"页面并自动弹出SpotlightSearchOverlay(带动画),通过`ProfilePage.pendingSearch`机制实现 | | 注册步骤3账号信息卡片支持点击修改 | 账号卡片包裹GestureDetector,点击返回步骤1,右侧图标改为铅笔(编辑) | | 局域网二维码增加设备信息 | 二维码内容从纯HTTP URL改为JSON格式(`xianyan-transfer`),包含设备名、IP、端口;扫码后显示设备详情确认弹窗再导航 | | 收藏来源标识增加同步状态 | `FavoriteSyncStatus`枚举(idle/syncing/synced/conflict),收藏列表显示🔄同步中/✅已同步/⚠️冲突标签 | | 小部件支持点击交互 | 修正6个WidgetType的deepLinkRoute,`HomeWidgetService._widgetRouteMap`改为引用WidgetType.deepLinkRoute | | 配对码页面国际化 | 新增`TFileTransfer`翻译类型(34字段),pairing_code_tab.dart所有硬编码中文替换为翻译键,14语言全部添加 | | 统一错误处理 | 5个文件的`_showAlert`替换为`AppToast.showError/showWarning`,删除`_showAlert`方法 | | 补全AppRoutes路由常量 | 新增12个路由常量,route_registry.dart中14处字符串字面量替换为AppRoutes常量引用 | ### 📁 涉及文件 **核心修改**: - `quick_actions_service.dart` — action_search路由携带`?action=search`参数 - `profile_page.dart` — 新增`pendingSearch`静态变量,initState自动弹出搜索 - `app.dart` — 快捷方式回调解析search参数 - `register_step_password.dart` — 账号卡片GestureDetector+onBack回调 - `register_section.dart` — 传入onBack: () => _goToStep(1) - `file_transfer_discovery_tab.dart` — 二维码payload改为JSON+设备信息展示 - `qr_code_tab.dart` — 识别xianyan-transfer JSON+设备详情弹窗 - `qrcode_scanner_page.dart` — 新增xianyanTransfer类型+设备详情弹窗 - `favorite_provider.dart` — FavoriteSyncStatus枚举+synced/conflict状态 - `favorite_page.dart` — 同步状态标签(列表+网格视图) - `home_widget_service.dart` — _widgetRouteMap引用WidgetType.deepLinkRoute - `widget_type.dart` — 修正6个deepLinkRoute - `pairing_code_tab.dart` — 34处硬编码中文→翻译键 - `device_pairing_page.dart` — _showAlert→AppToast - `radar_scan_tab.dart` — _showAlert→AppToast - `article_edit_page.dart` — _showAlert→AppToast - `app_routes.dart` — 新增12个路由常量 - `route_registry.dart` — 14处字符串→AppRoutes常量 **国际化**: - 新增 `t_file_transfer.dart` — TFileTransfer翻译类型 - 修改 `t_root.dart` — T类添加fileTransfer字段 - 14个语言文件添加TFileTransfer翻译 *** ## [v6.45.0] - 2026-06-12 ### 🔧 多项Bug修复 + 交互优化 #### 修复 | 变更 | 说明 | |---|---| | 桌面长按icon快捷方式"通用设置"改为"搜索APP内功能" | `QuickActionsService` 第二个快捷方式type改为`action_search`,标题改为"搜索APP内功能",路由指向"我的"页面;Android `shortcuts.xml`/`strings.xml` 同步更新 | | 登录页面协议勾选框默认改为未勾选 | `_agreedToTerms` 初始值从 `true` 改为 `false`,用户需主动勾选才能登录 | | iOS端退出闲言选项不生效 | iOS端隐藏"关闭闲言结束后台运行"和"返回桌面"两个无效选项(iOS不允许APP自行退出/后台),仅保留"退出闲言账号";`moveToBackground()` 移除iOS端降级为`SystemNavigator.pop()`的错误逻辑 | | 文件传输助手配对码页面无appbar | `_navigateToQrScan` 改为导航到 `DevicePairingPage(initialTab: 1)` 而非直接导航 `QrCodeTab()`,确保有完整appbar | | 局域网二维码无法被闲言APP扫码识别 | `QrCodeTab._processQrPayload()` 增加对HTTP局域网URL(端口53317)和`xianyan://transfer` scheme的识别;`QrcodeScannerPage` 增加 `QrCodeType.xianyan` 类型 | | 收藏取消收藏后数据仍在列表 | `FavoriteRepository.toggleFavorite()` 同步更新本地数据库 `isFavorite` 标记;未登录时直接调用 `db.setFavoriteFlag()` | | 注册页面"用户名"改为"账户" | `zh_cn.dart` 中5处"用户名"相关翻译改为"账户" | #### 新增 | 功能 | 说明 | |---|---| | 注册步骤3显示已填写账号 | `RegisterStepPassword` 新增 `username`/`email` 参数,在密码输入前显示账号信息卡片 | | `DevicePairingPage.initialTab` | 支持从外部直接定位到指定Tab(0=配对码, 1=扫码, 2=雷达, 3=其他) | | 收藏来源标识 | `FavoriteItem` 新增 `source` 字段,收藏列表显示"☁️云端"/"📱本地"来源标签 | | `AppDatabase.setFavoriteFlag()` | 新增直接设置收藏状态的方法 | #### 变更 | 变更 | 说明 | |---|---| | 安卓端快捷方式icon | `shortcuts.xml` 中icon已使用 `@mipmap/ic_launcher`(闲言APP图标),非IDE默认图标 | | 配对码页面动态主题 | 已全部使用 `AppThemeExtension` 动态主题值,无硬编码颜色 | | 桌面小部件页面多语言 | 25处硬编码中文替换为翻译键,14语言全部添加 `TWidget` 翻译块 | *** ## [v6.44.0] - 2026-06-12 ### 🌐 桌面小部件 — 多语言国际化支持 #### 新增 | 功能 | 说明 | |---|---| | `TWidget` 翻译类型类 | 新增桌面小部件模块专用翻译类型,包含约50个翻译字段(页面标题、开发弹窗、优先级标签、添加引导步骤、推送数据、同步主题、平台兼容说明、小部件卡片、数据预览、小部件类型标题/副标题、预览文本、平台徽章) | | `T.root.widget` 字段 | `T` 根类新增 `widget` 字段,接入桌面小部件模块翻译 | | 14语言widget翻译 | zh_cn/en/zh_tw/ja/ko/de/it/es/fr/pt/ru/ar/bn/hi 全部添加 `widget: TWidget(...)` 翻译块 | | `WidgetType.localizedTitle()` | `WidgetTypeX` 新增多语言标题方法,接受 `TWidget` 参数返回本地化标题 | | `WidgetType.localizedSubtitle()` | `WidgetTypeX` 新增多语言副标题方法,接受 `TWidget` 参数返回本地化副标题 | #### 变更 | 变更 | 说明 | |---|---| | `widget_management_page.dart` 国际化 | 25处硬编码中文字符串替换为翻译键,包括:导航栏标题、开发弹窗内容/按钮、优先级标签、添加到桌面提示、手动添加引导步骤(鸿蒙/Android/iOS)、推送数据/主题相关、平台兼容说明、已安装/添加按钮、数据预览/刷新、小部件类型标题/副标题、平台徽章 | | `_PlatformCompatibilityCard` / `_WidgetCard` / `_PlatformBadges` / `_WidgetDataPreview` | 新增 `tw` 参数传递翻译实例 | | `_ThemeToggle` | 使用 `ref.watch(translationsProvider)` 获取翻译 | | `_priorityLabel` | 新增 `TWidget` 参数,使用翻译键替代硬编码 | *** ## [v6.43.0] - 2026-06-12 ### 📡 二维码/收藏 — 局域网扫码支持 + 取消收藏修复 #### 修复 | 变更 | 说明 | |---|---| | 局域网二维码无法识别 | `QrCodeTab._processQrPayload()` 增加对 `http://` 局域网传输URL(端口53317)和 `xianyan://transfer` scheme的识别,扫码后自动导航至文件传输页面 | | 通用扫码页不识别闲言URL | `QrcodeScannerPage` 增加 `QrCodeType.xianyan` 类型,识别 `xianyan://` scheme和局域网传输URL,支持应用内导航 | | 取消收藏后数据仍在列表 | `FavoriteRepository.toggleFavorite()` 现在同步更新本地数据库 `isFavorite` 标记,防止 `mergeWithLocalDb()` 将已取消收藏的项目重新合并回来 | | 未登录时取消收藏无效 | `_removeFavorite()` 和 `_deleteSelected()` 区分已登录/未登录状态,未登录时直接调用 `db.setFavoriteFlag()` 更新本地数据库 | #### 新增 | 功能 | 说明 | |---|---| | 收藏来源标识 | `FavoriteItem` 新增 `source` 字段(`'server'`/`'local'`),收藏列表卡片显示"☁️ 云端"/"📱 本地"来源标签 | | `AppDatabase.setFavoriteFlag()` | 新增直接设置收藏状态的方法,不依赖当前值,避免 `toggleFavorite()` 状态不一致风险 | | `FavoriteItem.copyWithSource()` | 新增便捷方法,用于修改来源标识 | *** ## [v6.42.0] - 2026-06-11 ### 📝 笔记仓库 — 数量限制/离线模式/搜索增强/版本对比/同步进度/键盘管理 #### 新增 | 功能 | 说明 | |---|---| | 笔记数量限制 | 每设备最多10个笔记,`addNote()` 增加上限校验,悬浮框显示剩余可创建数量,达到上限时弹窗提示 | | 离线模式 | 网络异常时操作自动加入离线队列,本地仍可正常使用;网络恢复后点击"重试"自动同步 | | 搜索范围选择 | 搜索栏增加"全部/钥匙/内容/标签"四个范围筛选按钮,支持精确搜索 | | 版本对比UI | 历史页面增加"对比"模式,选择任意2个版本进行可视化diff对比 | | 同步进度条 | 同步状态条增加进度百分比和进度条,同步中/成功/失败三种状态直观显示 | | 同步重试按钮 | 同步失败或离线队列有数据时显示"重试"按钮,空闲时显示"同步"按钮 | | 网格/时间线滑动操作 | 网格布局和时间线布局均支持右滑操作(星标/删除),与列表布局一致 | | KeyboardManager接入 | 编辑页/列表页/悬浮框均接入`KeyboardManager`,点击非输入区域自动收起键盘 | | FocusNode管理 | 所有输入框添加`FocusNode`,配合`KeyboardManager.markUserTapped`防止键盘意外弹出 | #### 变更 | 变更 | 说明 | |---|---| | `CtcNoteListState` 扩展 | 新增 `syncStatus`/`syncProgress`/`syncError`/`offlineQueue`/`maxNotes`/`isAtLimit`/`remainingSlots`/`hasOfflineActions` 字段 | | `addNote()` 离线容错 | 服务端写入失败时不再直接返回false,而是加入离线队列并本地保存 | | `deleteNote()` 离线容错 | 删除失败时同样加入离线队列,本地先删除 | | 设置页动态主题增强 | `CupertinoSwitch`添加`inactiveTrackColor`,`CupertinoSlidingSegmentedControl`添加`thumbColor` | | 自动同步修复 | `startAutoSync`参数从`notes`改为`notesProvider`回调,每次同步获取最新列表,不再使用闭包快照 | | 编辑页保存统一走同步服务 | `_saveContent()`改用`CtcSyncService.pushNote`,不再直接调用`api.writeNote`,确保历史快照保存+离线队列容错 | | 删除开发文档 | `CTC_DEV_CHECKLIST.md` 校验通过(36/36全部真实完成),已删除 | *** ## [v6.41.0] - 2026-06-11 ### 📝 笔记仓库 — 自动上传/悬浮输入/动态主题/滑动操作/会话置顶 #### 修复 | 变更 | 说明 | |---|---| | 笔记内容空白问题 | `_saveContent()` 不再依赖 `pushEnabled` 开关,始终自动上传到服务端,确保浏览器打开URL可见内容 | | 笔记加载自动拉取 | `_loadNote()` 本地为空时自动从服务端拉取;已有内容时静默检查远程变更并标记红点 | | 发现页会话不排序 | `_onSessionTap()` 新增 `updateSessionTime()` 调用,使用过的会话自动排到置顶下方最前 | #### 变更 | 变更 | 说明 | |---|---| | 添加笔记从sheet改为悬浮对话框 | `CtcAddNoteSheet` 改为居中悬浮框,支持毛玻璃效果+缩放动画,不再使用底部sheet | | 笔记列表使用AppSlidable统一组件 | `_buildSlidableItem` 替换原生 `Slidable` 为项目统一的 `AppSlidable`,风格一致 | | 动态主题替换硬编码颜色 | `CupertinoColors.systemRed` → `ext.errorColor`,`CupertinoColors.white` → `ext.textOnAccent` | | 设置页底部增加设备限制说明 | 新增 `_buildDeviceLimitNotice` 提示"每个设备最多支持10个笔记" | #### 变更说明 - 笔记内容空白根因:之前 `_saveContent()` 仅在 `pushEnabled=true` 时上传服务端,导致用户输入内容后浏览器打开URL仍为空白。现改为始终自动上传 - 悬浮输入框采用 `showCupertinoDialog` + `ScaleTransition`/`FadeTransition` 动画,配合 `BackdropFilter` 毛玻璃效果,更符合iOS风格 - 发现页会话流列表:点击任何会话时更新其 `lastTime`,`unpinnedSessions` 按 `lastTime` 降序排列,使用过的会话自动排到最前 *** ## [v6.40.2] - 2026-06-11 ### 🔇 日志 — 抑制 liquid_glass_widgets 高频日志 + 静默 VelocityTracker 时间戳乱序错误 #### 修复 | 变更 | 说明 | |---|---| | `main.dart` 新增 `_suppressLiquidGlassLogs()` | 将 `lgr` 根 Logger 级别设为 `WARNING`,抑制 FINER/FINE/INFO 级别高频日志 | | `FlutterError.onError` 新增 VelocityTracker 静默处理 | 静默 `IOSScrollViewFlingVelocityTracker` 时间戳乱序错误(Flutter 框架已知 bug) | #### 变更说明 - `liquid_glass_widgets` 包内部使用 `logging` 包的 `Logger('lgr.geometry')` 等记录器,在 debug 模式下每帧输出大量 FINER 级别日志(如 `Rebuilding geometry`、`Skipping geometry rebuild`),严重影响控制台可读性 - 通过启用 `hierarchicalLoggingEnabled = true` 并设置 `Logger('lgr').level = Level.WARNING`,仅保留 WARNING 及以上级别的 lgr 日志 - `IOSScrollViewFlingVelocityTracker.addPosition` 在 iOS 上偶尔收到时间戳乱序的触摸事件,触发断言错误(`smaller timestamp than predecessor`),这是 Flutter 框架已知 bug,不影响滚动功能,已静默处理 *** ## [v6.40.1] - 2026-06-11 ### 🛠 构建 — 修复 macOS Podfile 部署目标版本问题 #### 修复 | 变更 | 说明 | |---|---| | macOS Podfile post_install 钩子 | 新增 `MACOSX_DEPLOYMENT_TARGET` 最低版本校验,统一设为 13.0 | | record_macos 编译错误 | 修复 `auAudioUnit` API 要求 macOS 13.0+ 但 Pod 部署目标低于 13.0 导致编译失败 | #### 变更说明 - Xcode 27 不再支持 macOS 部署目标低于 12.0,多个 Pod(flutter_secure_storage、flutter_webrtc、sqflite_darwin 等)默认部署目标为 10.14/10.15/11.0 - record_macos 使用了 macOS 13.0+ 才有的 `auAudioUnit` API,因此将最低部署目标统一提升至 13.0 - iOS 构建正常,macOS 构建和运行均已验证通过 *** ## [v6.40.0] - 2026-06-11 ### 🔗 CTC模块 — 新增深度链接(Deep Link)支持 #### 新增功能 | 变更 | 说明 | |---|---| | CTC深度链接路由 | 支持 `https://ctc.s2ss.com/` 直接打开对应笔记编辑页 | | `DeepLinkResolver.resolveCtcDomain` | 新增CTC子域名专用解析方法,提取URL路径段作为key参数 | | iOS Universal Links | Runner.entitlements 添加 `applinks:ctc.s2ss.com` 关联域名 | | Android App Links | AndroidManifest.xml 添加 `ctc.s2ss.com` intent-filter(autoVerify) | | Android自定义Scheme | 添加 `xianyan://` scheme intent-filter,支持全部深度链接 | | Android s2ss.com App Links | 添加 `s2ss.com` https intent-filter(autoVerify) | #### 变更说明 - 用户点击 `https://ctc.s2ss.com/mykey` 链接时,App自动打开并导航到 `/ctc/notes/edit?key=mykey` - CTC笔记编辑路由新增 `deepLinkAliases`: `xianyan://ctc/notes/edit` 和 `https://ctc.s2ss.com/*` - `AppRouter.resolveDeepLinkUri` 新增 `ctc.s2ss.com` 域名判断,优先于 `s2ss.com` 匹配 - 无路径段时(如 `https://ctc.s2ss.com/`)回退到CTC笔记列表页 *** ## [v6.39.0] - 2026-06-11 ### 📝 笔记仓库(CTC)模块 — 新增撤销/重做功能 #### 新增功能 | 变更 | 说明 | |---|---| | 新增 `CtcUndoStack` | 撤销/重做历史管理器,支持push/undo/redo/clear/trimTo,默认最大100条历史 | | 编辑页集成撤销重做 | `_undo()`/`_redo()` 方法替换为基于 UndoStack 的完整实现,支持光标位置恢复 | #### 变更说明 - 编辑页工具栏「撤销」「重做」按钮现已可用,之前为简化实现(撤销仅删除选中文本,重做无操作) - 每次内容变更自动记录历史快照(含光标选区),撤销/重做时恢复文本和光标位置 - 相同内容不重复入栈,超出最大历史数自动移除最旧条目 *** ## [v6.38.0] - 2026-06-11 ### 📝 笔记仓库(CTC)模块 — 新增云端暂存功能 #### 新增功能 **1. 笔记仓库 — 核心模块** | 变更 | 说明 | |---|---| | 新增 `CtcNoteModel` | 笔记数据模型,支持key/content/size/mtime/isStarred/tags/hasRemoteChange | | 新增 `CtcHistoryModel` | 历史快照模型,仅存储在本地 | | 新增 `CtcTagModel` | 标签模型,仅存储在本地 | | 新增 `CtcApiClient` | API客户端,封装ctc.s2ss.com所有接口(read/write/info/check/delete) | | 新增 `CtcLocalStorage` | Hive本地存储,管理笔记/历史/标签/设置/最近访问 | | 新增 `CtcSyncService` | 同步服务,支持pull/push/merge + 三方合并算法 + 自动同步 | | 新增 `CtcNoteListNotifier` | Riverpod Notifier,管理笔记CRUD/同步/变更检查 | | 新增 `CtcSettingsNotifier` | 设置Provider,管理所有设置项+持久化 | | 新增 `CtcExportService` | 导入导出服务,支持Markdown/JSON/纯文本格式 | **2. 笔记仓库 — 页面** | 变更 | 说明 | |---|---| | 新增 `CtcNoteListPage` | 笔记仓库列表页,支持网格/列表/时间线三种布局 | | 新增 `CtcNoteEditPage` | 笔记编辑页,支持Markdown预览切换/自动保存/二维码/历史/导出 | | 新增 `CtcSettingsPage` | 设置页,包含同步/历史/排版/元数据/安全/显示/使用须知(10条) | | 新增 `CtcAddNoteSheet` | 添加笔记弹窗,URL预览+钥匙校验(2-16位数字字母) | | 新增 `CtcHistoryPage` | 版本历史页+历史详情页,支持查看/恢复/Diff对比 | | 新增 `CtcQrScanPage` | 扫码打开笔记页 | **3. 笔记仓库 — 组件** | 变更 | 说明 | |---|---| | 新增 `CtcMarkdownPreview` | Markdown渲染预览组件 | | 新增 `CtcQrSheet` | 二维码分享弹窗,支持复制链接/系统分享 | | 新增 `CtcDiffView` | Diff对比视图,行级diff算法高亮变更 | | 新增 `CtcConflictSheet` | 冲突解决弹窗,选择本地/服务端/合并 | | 新增 `CtcTagManager` | 标签管理组件,支持添加/删除/筛选 | **4. 笔记仓库 — 交互特性** | 变更 | 说明 | |---|---| | 右滑操作 | 列表模式下左滑显示:主要/分享/删除 | | 下拉刷新 | 检查远程变更,红点提示有变更的笔记 | | 变更红点 | 笔记有远程变更时显示红色脉冲圆点 | | 骨架屏 | 加载时显示Shimmer骨架屏 | | 屏幕常亮 | 编辑时可选保持屏幕不熄灭(wakelock_plus) | | Markdown预览 | 编辑页支持编辑/预览模式切换 | | 二维码分享 | 编辑页更多操作中显示二维码 | | 导出功能 | 支持Markdown/JSON/纯文本格式导出到剪贴板 | | 系统分享 | 列表页滑动/编辑页工具栏支持系统分享 | **5. 服务端增强** | 变更 | 说明 | |---|---| | 新增JSON API | info/check/delete接口,写入支持json参数返回结构化数据 | | 速率限制 | 每IP每分钟60次请求 | | 内容审核 | 关键词正则过滤 | | CORS支持 | 允许跨域请求 | **6. 发现页入口** | 变更 | 说明 | |---|---| | 新增 `SystemSessionIds.ctcNoteRepo` | 发现页会话列表新增笔记仓库入口 | | 新增 `sessionCtcNoteRepo` l10n | 14种语言翻译支持 | | 图标 `CupertinoIcons.doc_text_search` | 系统会话使用CupertinoIcons替代emoji | **7. 路由注册** | 变更 | 说明 | |---|---| | 新增 `/ctc/notes` | 笔记仓库列表页 | | 新增 `/ctc/notes/edit` | 笔记编辑页(key参数) | | 新增 `/ctc/settings` | 笔记设置页 | **8. 文档与脚本** | 变更 | 说明 | |---|---| | 新增 `API_DOC.md` | CTC API接口文档 | | 新增 `CTC_DEV_CHECKLIST.md` | 开发清单(5个Phase详细任务) | | 新增 `upload_ctc_code.py` | SFTP上传脚本 | | 新增 `test_ctc_api.py` | API测试脚本(12/12通过) | *** ## [v6.37.0] - 2026-06-11 ### 🔧 句子来源功能完善 + 拾光Sheet修复 #### 修复内容 **1. 句子来源页面 — 卡片来源与卡片混合模式Sheet分离** | 变更 | 说明 | |---|---| | 新增 `showHomeCardMixModeSheet()` | 卡片混合模式独立配置Sheet,与卡片来源Sheet功能分离 | | 修复按钮字体颜色 | "保存配置"和"保存"按钮使用 `ext.textOnAccent` 替代默认黑色,解决深色主题下看不见文字的问题 | **2. 导入来源页面 — 闲言示例URL + 分析业务提醒 + 频道数据刷新** | 变更 | 说明 | |---|---| | 闲言示例URL替换 | 从空壳 `api.example.com` 替换为真实API `https://tools.wktyl.com/api/sentence_source/sample?num=10` | | URL分析后业务提醒 | 分析成功显示数据条数和格式识别结果;失败显示具体原因 | | 创建频道后额外拉取数据 | 调用 `fetchMore()` 额外拉取20条数据,确保频道有足够内容 | | 自定义频道自动刷新 | 首次加载时从URL源自动拉取新数据,支持持续刷新加载 | **3. 后端 — 句子来源API接口** | 变更 | 说明 | |---|---| | 新增 `SentenceSource` 控制器 | 提供 sample/categories/install 三个接口 | | sample接口 | 从hitokoto表转换数据为闲言v1格式(title/category/content/detail/author/time) | | categories接口 | 返回7个分类(诗词/名言/歌词/哲学/动漫/影视/网络) | | install接口 | 返回格式信息和数据总量(8812条) | | 路由注册 | route.php 新增3条API路由 | **4. 拾光Sheet修复** | 变更 | 说明 | |---|---| | 修复 `markNeedsPaint` 断言报错 | `ref.listen` 回调中的状态变更延迟到 `addPostFrameCallback` 执行,避免在paint阶段调用setState | | 扩大开关列表显示区域 | `Flexible` 改为 `Expanded`,移除 `mainAxisSize.min`,列表占满可用空间 | **5. UrlAnalyzerService新增fetchMore方法** | 变更 | 说明 | |---|---| | `fetchMore(url, limit)` | 从URL源拉取更多数据,支持hitokoto和闲言v1格式 | #### 涉及文件 - `lib/features/source/presentation/source_mix_config_sheet.dart` — 卡片混合模式Sheet分离 + 按钮颜色修复 - `lib/features/source/presentation/source_page.dart` — 混合模式Sheet调用分离 - `lib/features/source/presentation/url_import_page.dart` — 示例URL + 分析提醒 + 额外拉取 - `lib/features/source/services/url_analyzer_service.dart` — fetchMore方法 - `lib/features/home/providers/home_feed_mixin.dart` — 自定义频道自动刷新 - `lib/features/home/presentation/date_config_sheet.dart` — 拾光Sheet修复 - `docs/toolsapi/application/api/controller/SentenceSource.php` — 后端控制器(新增) - `docs/toolsapi/application/route.php` — 路由注册 - `docs/toolsapi/docs/API_SENTENCE_SOURCE_DOC.md` — API文档更新 *** ## [v6.36.1] - 2026-06-11 ### 📱 鸿蒙端适配 — UI交互优化 + USB事件修复 #### 变更内容 **1. 主页"编辑此句"鸿蒙端交互调整** | 变更 | 说明 | |---|---| | 鸿蒙端点击"编辑此句"弹出toast"敬请期待" | 编辑器功能暂未适配鸿蒙平台 | **2. "实现中的功能"弹窗鸿蒙端适配** | 变更 | 说明 | |---|---| | `FeatureFlagService.check()` 鸿蒙端改为toast提示 | 不再弹出CupertinoAlertDialog,改为轻量toast | | `general_settings_page.dart` 鸿蒙端设置项弹窗改为toast | 保持交互一致性 | **3. "我的"页面鸿蒙端隐藏Beta入口** | 变更 | 说明 | |---|---| | 鸿蒙端不显示"实验性功能"按钮 | 实验性功能页面暂不适配鸿蒙 | **4. 桌面小部件页面鸿蒙端适配** | 变更 | 说明 | |---|---| | 鸿蒙端不显示Beta弹窗 | 跳过开发中提示弹窗 | | 鸿蒙端点击"添加"弹出toast"敬请期待" | 小部件添加功能暂未适配 | **5. 修复文件传输页面USB事件报错** | 变更 | 说明 | |---|---| | 鸿蒙端跳过原生USB事件监听 | 原生插件未实现`xianyan/usb_events`,避免`MissingPluginException` | #### 涉及文件 - `lib/features/home/presentation/panels/sentence_detail_actions.dart` - `lib/core/services/feature/feature_flag_service.dart` - `lib/features/mine/settings/presentation/general/general_settings_page.dart` - `lib/features/mine/profile/presentation/profile_page.dart` - `lib/features/widget/presentation/widget_management_page.dart` - `lib/features/file_transfer/services/discovery/usb_discovery_service.dart` *** ## [v6.36.0] - 2026-06-10 ### 🔒 隐私合规 — 剪贴板读取改为被动触发 + Android引导页双按钮 #### 问题描述 1. 用户同意隐私协议后,`ClipboardMonitorService`立即以3秒定时轮询读取剪贴板,违反"非对应场景不得读取剪贴板"的合规要求 2. Android端引导页仍使用勾选框方式,与原生隐私协议对话框的双按钮风格不一致 堆栈证据: ``` java.lang.Exception at android.content.ClipboardManager.getPrimaryClipDescription(Native Method) at A.e.onMethodCall(Unknown Source:312) ``` #### 修复内容 **1. ClipboardMonitorService改为被动触发(核心修复)** | 变更 | 说明 | |---|---| | 移除`Timer.periodic`3秒轮询 | 不再主动定时读取剪贴板 | | 新增`checkClipboardOnce()`方法 | 仅在用户主动操作时调用(被动触发) | | `initFromStore()`仅恢复启用标志 | 不再自动启动定时器 | | 5秒防抖机制 | 防止短时间内重复读取 | **2. 移除自动初始化入口** | 文件 | 变更 | |---|---| | `PostAgreementInitializer` | 移除`ClipboardMonitorService`初始化,不再协议同意后自动启动 | | `AppLifecycleGate` | 移除前后台切换时自动恢复剪贴板监控 | **3. 添加被动触发点** | 场景 | 触发方式 | |---|---| | 用户打开稍后读页面 | `ReadLaterPage.initState()` → `checkClipboardOnce()` | | 用户点击"从剪贴板粘贴"按钮 | 已有逻辑,无需修改 | | 用户点击"查看剪贴板"操作表 | 已有逻辑,无需修改 | **4. Android引导页双按钮** | 变更 | 说明 | |---|---| | `agreement_page.dart` | Android端移除勾选框,改为"同意并继续"+"拒绝并退出"双按钮 | | 其他平台 | 保持原有勾选框逻辑不变 | *** ## [v6.35.0] - 2026-06-10 ### 🔒 隐私合规 — 协议前禁止传感器读取(SplashActivity守门策略) #### 问题描述 v6.34.0的"先注册再移除"策略无法从根本上阻止传感器读取: - `super.configureFlutterEngine()`调用`GeneratedPluginRegistrant.registerWith()`时 - `SensorsPlugin.onAttachedToActivity()`已被触发并调用`SensorManager.getSensorList()` - 移除插件发生在传感器读取之后,为时已晚 堆栈证据: ``` java.lang.Exception at android.hardware.SensorManager.getSensorList(Native Method) at E7.v.onAttachedToActivity(Unknown Source:168) at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(Unknown Source:485) at apps.xy.xianyan.MainActivity.onCreate(Unknown Source:0) ``` #### 修复方案:SplashActivity守门策略 **核心思路**:在Flutter引擎启动前完成隐私协议确认,从根本上阻止`GeneratedPluginRegistrant`在协议前注册敏感插件。 **启动流程变更**: ``` 旧流程:点击图标 → MainActivity(Flutter引擎启动 → 插件注册 → 传感器读取)→ 引导页协议 新流程:点击图标 → SplashActivity(原生协议对话框)→ 同意 → MainActivity(Flutter引擎启动)→ 引导页 ``` **1. 新增SplashActivity(核心修复)** | 文件 | 作用 | |---|---| | `SplashActivity.kt` | 应用LAUNCHER入口,协议守门人 | | `SplashActivity.kt` | 检查`agreement_accepted`标志,已同意直接启动MainActivity | | `SplashActivity.kt` | 老用户自动迁移(检测Flutter数据目录存在即视为已同意) | | `SplashActivity.kt` | 新用户显示原生隐私协议对话框(含权限说明+协议链接) | | `SplashActivity.kt` | 用户同意后持久化状态并启动MainActivity,拒绝则退出应用 | | `dialog_privacy_agreement.xml` | 原生隐私协议对话框布局(Material3风格) | **2. AndroidManifest.xml变更** | 变更 | 说明 | |---|---| | 新增`SplashActivity`为LAUNCHER | 应用启动入口从MainActivity改为SplashActivity | | `MainActivity`移除LAUNCHER intent-filter | 不再直接启动,由SplashActivity守门 | | `MainActivity`设为`exported=false` | 防止外部直接启动绕过协议 | **3. MainActivity.kt调整** | 变更 | 说明 | |---|---| | 插件移除/恢复逻辑保留为安全网 | 防Shortcut/DeepLink绕过SplashActivity的异常场景 | | 更新注释说明守门策略 | 明确正常流程由SplashActivity保证协议同意 | *** ## [v6.34.0] - 2026-06-10 ### 🔒 隐私合规 — 协议前禁止权限 + 引导页按钮优化 + Android权限精简 > ⚠️ 此版本的"先注册再移除"策略无法阻止传感器读取,已在v6.35.0中修复 #### 问题描述 1. 安卓端未同意隐私声明前,`sensors_plus`等插件在`onAttachedToActivity`时已读取传感器,违反隐私合规要求 2. 引导页未勾选协议时按钮显示不明确,用户无法直观感知"拒绝"操作 3. AndroidManifest.xml声明了多个非核心权限,增加隐私审查风险 #### 修复内容 **1. 原生端插件注册管控(核心修复)** | 文件 | 修复 | |---|---| | `MainActivity.kt` | 重写`configureFlutterEngine`:协议未同意时仅注册非敏感插件(跳过传感器/麦克风/位置/WiFi/通知/相机/相册/生物识别/视频播放等11个插件) | | `MainActivity.kt` | 新增`AGREEMENT_CHANNEL`:Flutter端协议同意后通知原生端补充注册敏感插件 | | `MainActivity.kt` | 使用原生`SharedPreferences`持久化协议同意状态(独立于Hive,原生端启动时可读) | | `MainActivity.kt` | 通过反射动态注册插件,依赖变更时仅需更新类名列表 | **2. 引导页按钮优化** | 文件 | 修复 | |---|---| | `agreement_page.dart` | 未勾选协议时显示红色"拒绝并退出"按钮,点击退出应用 | | `agreement_page.dart` | 勾选两个协议后显示"同意并继续"按钮,点击进入下一页 | | `onboarding_provider.dart` | `completeOnboarding()`新增`_notifyNativeAgreementAccepted()`通知原生端 | | `main.dart` | 老用户升级后自动通知原生端注册敏感插件 | **3. Android权限精简** | 权限 | 操作 | 原因 | |---|---|---| | `CHANGE_WIFI_MULTICAST_STATE` | 移除 | 非核心功能,LocalSend可走其他发现方式 | | `RECORD_AUDIO` | 移除 | 语音输入非闲言主要功能 | | `READ_CALENDAR` / `WRITE_CALENDAR` | 移除 | 闲言不依赖日历读写 | | `ACCESS_FINE_LOCATION` | 移除 | 粗略定位已满足天气城市级需求 | | `android.hardware.usb.host` | 移除 | 闲言不依赖USB主机模式 | **4. 多语言支持** - 新增`rejectAndExit`翻译键,14种语言全部覆盖 *** ## [v6.33.0] - 2026-06-10 ### 🐛 文件传输助手 — 修复iOS端"搜索附近设备"卡死/崩溃 #### 问题描述 iOS端文件传输助手页面,点击"搜索附近设备"按钮后应用卡死或崩溃。 #### 根因分析 运行日志捕获到关键异常: ``` SocketException: Send failed (OS Error: No route to host, errno = 65), address = 0.0.0.0, port = 53317 ``` - `LocalSendService._sendAnnounce()` 发送UDP多播时未捕获 `SocketException` - iOS在无WiFi/网络不支持多播/本地网络权限被拒时,`RawDatagramSocket.send()` 抛出异常 - Timer回调中调用 `_sendAnnounce()` 无异常保护,导致应用崩溃 - `joinMulticast()` 同样可能抛出未捕获异常 - `HttpScanDiscoveryService` 使用HTTPS连接本地IP但无SSL旁路,导致扫描失败 - `DeviceDiscoveryNotifier.startScan()` 异常未处理,`isScanning` 永远为true导致UI卡住 #### 修复内容 | 文件 | 修复 | |---|---| | `localsend_service.dart` | `_sendAnnounce()` 添加 try-catch 捕获 `SocketException`,网络不可用时优雅降级 | | `localsend_service.dart` | `startDiscovery()` 中 `joinMulticast()` 单独 try-catch,失败后仍启动定时广播 | | `localsend_service.dart` | `_handleIncomingDatagram()` 扩大 try-catch 范围,覆盖 `receive()` 的 `SocketException` | | `http_scan_discovery.dart` | 添加 `IOHttpClientAdapter` + `badCertificateCallback` 旁路本地IP的SSL验证 | | `device_discovery_provider.dart` | `startScan()` 各方法调用添加 try-catch,`Future.wait` 添加异常保护 | | `file_transfer_discovery_tab.dart` | `startFullScan()`/`startSingleMethodScan()` 添加 `.catchError()` 防止未处理Future异常 | *** ## [v6.32.0] - 2026-06-10 ### 🔧 工具中心优化 — 隐藏工具入口 + 推荐工具限4 + 已删除工具不可恢复 #### 变更说明 **1. 隐藏工具入口(TODO注释标记)** - RSS订阅:添加 `isDeleted: true` + TODO注释,从工具中心隐藏 - 药茶大全:添加 `isDeleted: true` + TODO注释,从工具中心隐藏 - 歌词大全:已有 `isDeleted: true`,确认隐藏状态 **2. 推荐工具栏仅展示4个** - `recommendedTools` getter 增加 `.take(4)` 限制,同时排除已删除工具 **3. 工具中心设置页已删除工具不再支持恢复** - 单个恢复:点击"恢复"按钮显示 Toast "已下线,暂不支持恢复" - 全部恢复:点击"全部恢复"显示 Toast "已下线工具暂不支持恢复" - 恢复按钮样式降级:颜色从 accent 改为 textHint,视觉提示不可用 #### 修改文件 | 文件 | 变更 | |---|---| | `discover/models/tool_item.dart` | RSS订阅/药茶大全添加 `isDeleted: true` + TODO注释 | | `discover/providers/tool_center_provider.dart` | `recommendedTools` 限制4个+排除已删除 | | `discover/presentation/pages/tool_center_settings_page.dart` | 恢复功能改为提示已下线 | *** ## [v6.31.0] - 2026-06-10 ### 🏗️ 个人中心页面重构 — 组件拆分 + 架构优化 + 功能增强 #### 变更说明 **1. 个人中心页面组件拆分(1225行 → 617行主页面 + 5个子组件)** - `ProfileHeader` — 头像/昵称/称号,独立组件 - `UserStatsBar` — 积分/签到/笔记统计栏,独立组件 - `DarkModeSwitch` — 深色模式开关,独立组件 - `SettingRow` + `SettingsDivider` — 通用设置行+分割线,提升为 shared 组件 - 退出弹窗逻辑迁移至 `core/services/app/app_exit_service.dart` **2. ext 参数内部化 — 组件自治原则** - `SettingRow`/`SettingsDivider`/`ProfileHeader`/`UserStatsBar`/`DarkModeSwitch` 全部移除 `ext` 参数 - 各组件内部通过 `AppTheme.ext(context)` 自行获取主题,降低耦合度 **3. 导航逻辑抽取为 SplitViewNavigationMixin** - `_isWidescreen()`/`_navigateOrPanel()`/`_openSettingsPanel()` 提取为 `SplitViewNavigationMixin` - 其他设置页面可复用此 Mixin,消除重复代码 **4. 新增下拉刷新功能** - 使用 `custom_refresh_indicator` 实现下拉刷新用户数据 - 保留原有下拉触发搜索功能(阈值 -80px) **5. ProfileHeader 骨架屏加载态** - 加载中状态从 `CupertinoActivityIndicator` 升级为 Shimmer 骨架屏 - 复用项目已有的 `shimmer` 库 **6. 评分按钮接入应用商店** - iOS 跳转 App Store,Android 跳转 Google Play - 降级处理:Google Play 不可用时打开网页版 - 均不可用时显示 Toast 提示 #### 新增文件 | 文件 | 作用 | |---|---| | `shared/widgets/input/setting_row.dart` | 通用设置行+分割线(shared级) | | `core/services/app/app_exit_service.dart` | 退出弹窗+移至后台逻辑 | | `core/layout/split_view_navigation_mixin.dart` | 分屏导航 Mixin | #### 删除文件 | 文件 | 原因 | |---|---| | `profile/presentation/widgets/setting_row.dart` | 提升为 shared 组件 | | `profile/presentation/widgets/profile_quick_actions.dart` | 迁移至 core/services | *** ## [v6.30.0] - 2026-06-10 ### 🎨 深色模式优化 — 纯黑默认 + 深色模式跳转主题个性化 + 弹跳定位 + 语言弹跳 #### 变更说明 **1. 深色模式默认切换为纯黑(AMOLED)** - 定时深色自动切换时,从"夜间模式"改为"纯黑模式"(`AppThemeMode.amoled`),AMOLED屏幕更省电 - 用户仍可在主题个性化页面选择"夜间模式"(深蓝紫背景)作为独立选项 **2. 我的页面深色模式行保留开关+支持点击跳转** - 保留 `CupertinoSwitch` 开关,可快捷切换日间↔纯黑 - 点击整行跳转到"主题个性化"页面,开关右侧增加箭头提示 - 开关切换默认使用纯黑(AMOLED)模式 **3. 跳转后弹跳动画定位外观模式卡片(弹跳2次)** - 从我的页面点击深色模式跳转后,自动滚动到"外观模式"区块 - 外观模式卡片播放2次弹跳动画(ScaleTransition: 1.0→1.06→0.97→1.0→1.04→0.98→1.0,1000ms) - 新增 `ThemeModeBounceNotifier` + `themeModeBounceProvider` 管理弹跳触发状态 **4. 语言设置页面弹跳动画(弹跳2次)** - 从我的页面点击语言跳转后,当前选中的语言项播放2次弹跳动画 - 新增 `LanguageBounceNotifier` + `languageBounceProvider` 管理弹跳触发状态 #### 影响范围 | 模块 | 变更 | |---|---| | theme_settings_provider | 自动深色切换改用AMOLED;新增 `ThemeModeBounceNotifier` | | general_settings_provider | 新增 `LanguageBounceNotifier` | | profile_page | 深色模式行保留开关+跳转,`_ThemeSwitch`→`_DarkModeSwitch`;语言行增加弹跳触发 | | theme_settings_page | 转为StatefulWidget,添加ScrollController+GlobalKey自动滚动 | | theme_sections_basic | `ThemeModeSection` 转为StatefulWidget,弹跳2次动画 | | language_settings_page | 转为StatefulWidget,当前语言项弹跳2次动画 | *** ## [v6.29.1] - 2026-06-10 ### 🐛 Bug修复 — 工厂重置数据库只读 + 导航栏残留 + 框架错误处理 #### 变更说明 **1. 修复工厂重置后 SqliteException(1032) 只读数据库写入错误** - 根因:工厂重置步骤5删除了文档目录下所有文件(包括 `xianyan.db`),但 `AppDatabase` 单例仍持有旧连接,SQLite 在文件被删除后以只读模式重新创建,导致后续写入报 1032 错误 - 修复:`AppDatabase` 新增 `closeAndReopen()` 静态方法,关闭旧连接并重建单例 - 工厂重置流程调整:先关闭数据库连接 → 清除数据 → 删除缓存文件 → 再次重建连接,确保数据库文件始终可用 **2. 修复清空数据后所有页面头部显示"更多设置"AppBar** - 根因:`_executeFactoryReset` 使用 `context.appGo()` 导航到 onboarding,但 `appGo` 内部调用 `go()` 在子导航器 context 上执行,不会清除整个导航栈,导致 `MoreSettingsPage` 的 `CupertinoNavigationBar` 在转场中残留 - 修复:改用 `GoRouter.of(context).go()` 直接通过根导航器导航,确保完全替换导航栈 **3. 修复 CupertinoPageRoute 转场时 Null check operator on null value 错误** - 根因:Flutter 框架已知 bug([#106934](https://github.com/flutter/flutter/issues/106934)),`_TransitionableNavigationBar.renderBox` 在转场时可能返回 null - 修复:`AppErrorBoundary` 新增 `_isNavBarNullCheck()` 方法,精确识别 `nav_bar.dart` 中的 null check 错误并归类为非致命,仅记录日志不触发错误UI #### 影响范围 | 模块 | 变更 | |---|---| | app_database | 新增 `closeAndReopen()` 方法,`_instance` 改为非 final | | more_settings_page | 工厂重置流程重构,导航改用 `GoRouter.of(context).go()` | | app_error_boundary | 新增 `_isNavBarNullCheck()` 精确匹配导航栏 null check 错误 | *** ## [v6.29.0] - 2026-06-10 ### 🎨 我的页面交互优化 — 搜索框上移 + 退出闲言合并Dialog + 工具入口隐藏 #### 变更说明 **1. 搜索框位置上移** - Spotlight搜索浮层从屏幕居中(`Center`)改为偏上对齐(`Align(0, -0.35)`),搜索框更靠近顶部,操作更便捷 **2. 退出闲言合并为二级Dialog** - 原"+"按钮ActionSheet中的"退出闲言"、"退出闲言账号"、"关闭闲言返回桌面"三个独立按钮合并 - 点击"退出闲言"后弹出二级选择Dialog,包含3个功能按钮: - **关闭闲言,结束后台运行** — 完全退出应用,`SystemNavigator.pop()` - **返回桌面(不退出)** — Android通过MethodChannel调用`moveTaskToBack`移到后台;iOS降级退出 - **退出闲言账号** — 仅登录时显示,调用`authProvider.logout()` **3. Android原生MethodChannel支持** - `MainActivity.kt`新增`com.xianyan.app/background` Channel,处理`moveToBackground`调用 **4. 工具入口隐藏** - 发现页工具中心隐藏4个入口:中药材、民间偏方、药品查询、疾病自查(`isDeleted: true` + TODO注释) **5. 多语言更新** - 新增3个翻译键:`closeAppKillBackground`、`backToDesktop`、`selectExitMethod` - 更新全部14个语言文件 #### 影响范围 | 模块 | 变更 | |---|---| | profile_page | 退出闲言合并二级Dialog,新增`_showExitDialog`/`_moveToBackground`方法 | | spotlight_search_overlay | 搜索框位置上移 | | MainActivity.kt | 新增moveToBackground MethodChannel | | tool_item.dart | 隐藏4个工具入口 | | t_profile.dart | 新增3个翻译字段 | | 14个语言文件 | 新增3个翻译值 | *** ## [v6.28.0] - 2026-06-10 ### 🛠️ 导入来源全模块审计重写 — 风格统一 + 空壳功能完善 + 主页数据修复 #### 变更说明 **1. URL导入页面 — 自动导入句子修复** - 修复创建频道后主页无内容:`_createChannel` 增加 `importSentences` 调用,将分析获取的样本数据自动写入 `importedSentences` 表,确保主页切换到自定义频道时能展示句子 **2. 文件导入页面 — 全面重写** - 风格统一:`Theme.of(context)` → `AppTheme.ext(context)`,自定义卡片 → `GlassContainer`,硬编码值 → 设计令牌 - 模板下载:从空壳弹窗改为实际生成 JSON/CSV/XML 模板文件,写入临时目录后系统分享 - 预览按钮:从空 `onPressed: () {}` 改为实际预览解析数据(前5条),支持字段映射后预览 - 自定义字段映射:6个标准字段可映射到文件字段,CupertinoActionSheet 选择器 - 创建频道后自动导入句子(调用 `importSentences`) - 修复 Navigator.maybePop 断言错误 - 增加使用指引横幅 **3. 频道管理页面 — 全面重写** - ConsumerWidget → ConsumerStatefulWidget - 风格统一:全面使用设计令牌 + GlassContainer + flutter_animate - 右滑删除:使用 `AppSlidable` + `SlideActionType.delete`,确认弹窗 `AppSlidableDeleteConfirm` - 频道详情弹窗:点击卡片弹出 CupertinoModalPopup,展示频道信息/来源列表/句子预览/操作按钮 - 统计栏使用 GlassContainer 包裹 **4. 校验页面 — 全面重写** - StatefulWidget → ConsumerStatefulWidget - 风格统一:全面使用设计令牌 + GlassContainer + flutter_animate - 所有校验规则从硬编码静态展示改为实际动态校验(URL/文件/内容质量) - 新增一键校验按钮 + 校验进度指示 + 结果摘要 - 各分区支持展开/收起 **5. 句子来源页面 — 自定义频道右滑删除 + 详情弹窗** - 自定义频道卡片包裹 `AppSlidable`,右滑显示删除按钮 - 新增 `_showCustomChannelDetail` 弹窗(频道信息/来源列表/删除按钮) - 新增 `_confirmDeleteChannel` 方法(使用 `AppSlidableDeleteConfirm` 确认对话框) #### 影响范围 | 模块 | 变更 | |---|---| | url_import_page | 创建频道后自动导入句子,修复主页无内容 | | file_import_page | 全面重写,风格统一,模板下载/预览/字段映射/导入句子 | | channel_manage_page | 全面重写,风格统一,右滑删除/详情弹窗 | | validate_page | 全面重写,风格统一,动态校验/一键校验/进度/展开收起 | | source_page | 自定义频道右滑删除 + 详情弹窗 | *** ## [v6.25.0] - 2026-06-10 ### 🔧 来源模块Bug修复 — XML解析 + 分享功能实现 #### 变更说明 1. **修复XML正则解析逻辑**:重写 `_parseXml` 方法,改为层级感知解析 — 先定位根元素,再在根元素内部提取直接子节点(非递归),统计直接子节点标签频率确定行标签,避免外层容器标签干扰。新增 `_extractDirectChildren` 方法支持同名嵌套和自闭合标签处理 2. **实现分享功能**:`_onShare` 方法从空壳改为完整实现 — 无频道时提示用户、单频道直接分享、多频道弹出选择器;三种分享模式(配置+数据/仅配置/内容分析报告)均调用 `ShareExportService.shareChannel` 完成实际分享,包含空数据和异常处理 #### 影响范围 | 模块 | 变更 | |---|---| | file_parser_service | XML解析逻辑重写,新增 `_extractDirectChildren`/`_isTagStart`/`_XmlChild` | | import_source_page | 分享功能实现,新增 `_shareWithMode`/`_doShare`/`_showNoChannelTip`/`_modeLabel` | *** ## [v6.24.0] - 2026-06-10 ### 📝 笔记模块国际化 + 动态主题适配 #### 变更说明 1. **新增 TNote 翻译类型**:定义 108 个翻译键,覆盖笔记模块全部硬编码中文文本 2. **14 种语言全量更新**:zh_cn/zh_tw/en/ja/ko 完整翻译,de/fr/es/it/pt/ru/ar/hi/bn 使用英文回退(待机器翻译) 3. **笔记列表页国际化**:30+ 处硬编码中文替换为翻译键,NoteSortMode/NoteGroupMode 枚举 label 改为翻译方法 4. **笔记编辑页国际化**:27 处硬编码中文替换,静态数组改为动态方法(_noteTypes/_sourceTypes/_fontFamilies) 5. **笔记统计面板国际化**:11 处硬编码替换,StatelessWidget→ConsumerWidget 6. **笔记导出工具国际化**:13 处硬编码替换,方法签名增加 TNote 参数 7. **笔记置顶弹窗国际化**:8 处硬编码替换,showPinDialog 增加 TNote 参数 8. **筛选/共享组件国际化**:NoteFilterTabs/NoteEmptyState/NoteFooter/NoteDateHeader/NoteTypeBadge/NoteSourceRow 全部国际化 9. **translation_io_service 同步更新**:新增 _tNoteToMap/_importNote/_checkNoteFieldsSync 映射方法 10. **动态主题验证**:所有页面已使用 AppTheme.ext(context) 获取主题令牌,无硬编码颜色 #### 影响范围 | 模块 | 变更 | |---|---| | TNote 类型 | 新增 108 字段翻译定义 | | T 根类型 | 新增 note 字段注册 | | translation_io_service | 新增导出/导入/同步检查 | | 14 种语言文件 | 全部更新 | | note_list_page | 30+ 处国际化 | | note_edit_page | 27 处国际化 | | note_filter_widgets | 筛选/空状态/底部栏国际化 | | note_shared_widgets | 类型徽章/来源行国际化 | | note_stats_panel | 统计面板国际化 | | note_export_utils | 导出工具国际化 | | note_pin_widgets | 置顶弹窗国际化 | | note_list_layout | 适配 groupNotesBy 签名变更 | | note_timeline_layout | 适配 groupNotesBy 签名变更 | *** ## [v6.23.0] - 2026-06-10 ### 🌐 国际化补全 + StatefulBuilder 审计 + 空值安全 #### 变更说明 1. **注销页面国际化补全**:TAccountSettings 新增 45 个翻译 key,覆盖全部硬编码中文,14 种语言全部更新 2. **退出选项国际化**:TProfile 新增 4 个翻译 key(exitSubProject/exitApp/exitAccount/closeAppToDesktop),14 种语言全部更新 3. **StatefulBuilder 陷阱审计**:排查项目 15 个 StatefulBuilder 用法,全部正确无陷阱(唯一有 bug 的 note_list_page.dart 已在上版本修复) 4. **KvStorage.getBool 空值安全**:appbar_date_display.dart 已有 `?? false` 处理,无需额外修复 #### 影响范围 | 模块 | 变更 | |---|---| | TAccountSettings 类型 | +45 字段(注销页面全量国际化) | | TProfile 类型 | +4 字段(退出选项国际化) | | 14 种语言文件 | 全部更新(zh_cn/zh_tw/en/ja/ko/de/fr/es/it/pt/ru/ar/hi/bn) | | account_deletion_page | 所有硬编码中文替换为翻译 key | | profile_page | 4 个退出选项文案替换为翻译 key | *** ## [v6.22.0] - 2026-06-10 ### 🔧 多页面功能修复与增强 — 注销页国际化 + 退出选项 + 运行模式标签 + 拾光栏增强 + 置顶开关修复 #### 变更说明 1. **注销账户页面重构**:所有 emoji 替换为 CupertinoIcons,添加多语言支持(导航栏标题/取消按钮等使用翻译系统),动态主题适配(硬编码颜色替换为主题扩展色) 2. **我的页面快捷操作增加退出选项**:新增"退出子项目"、"退出闲言"、"退出闲言账号"(仅登录时显示)、"关闭闲言返回桌面"四个退出选项 3. **软件信息页面增加运行模式标签**:检测更新按钮右侧新增 Release/Debug 模式标签,根据 `dart.vm.product` 自动判断显示 4. **拾光栏增强**:增加可点击区域(上下左右 padding),首次点击前显示红色小圆点提示(点击后消失并持久化),拾光配置 Sheet 新增星期几/周几显示 5. **修复笔记置顶开关 Bug**:`_showPinDialog` 中 `currentPinned` 变量从 StatefulBuilder builder 内部移至外层闭包,修复开关无法切换的问题 #### 影响范围 | 模块 | 变更 | |---|---| | 注销页面 | emoji→CupertinoIcons,多语言,动态主题 | | 我的页面 | 快捷操作 dialog 增加 4 个退出选项 | | 软件信息 | CheckUpdateItem 增加 Release/Debug 标签 | | 拾光栏 | 点击区域扩大,小红点提示,星期几显示 | | 笔记页面 | 修复"在发现中置顶"开关状态丢失 Bug | *** ## [v6.21.0] - 2026-06-10 ### 🗑️ 移除传感器相关功能 — 删除 sensors_plus 依赖 + 摇一摇功能下线 #### 变更说明 1. **移除 sensors_plus 三方库**:从 pubspec.yaml / pubspec.macos.yaml / pubspec.ohos.yaml 三个模板中移除 sensors_plus 依赖及鸿蒙端本地包覆写 2. **删除 ShakeDetector 服务**:移除 `lib/core/services/device/shake_detector.dart`,删除摇一摇检测器单例及处理器栈模式 3. **移除摇一摇权限**:从 `AppPermission` 枚举中移除 `shake` 虚拟权限,移除 `isShakeEnabled` / `setShakeEnabled` 方法 4. **移除路由观察者**:删除 `ShakeScopeObserver`,不再监听路由作用域切换 5. **移除生命周期管理中的摇一摇**:`AppLifecycleGate` 不再管理 ShakeDetector 的启停 6. **AR视图改为纯动画模式**:`DailyCardArView` 移除加速度传感器监听,改为手势+动画驱动 7. **移除设置页摇一摇开关**:通用设置中移除"摇一摇换句"开关项 8. **移除权限管理页摇一摇卡片**:删除 `_ShakePermissionCard` 组件 9. **移除引导页摇一摇选项**:个性化页面不再提供摇一摇开关 10. **移除音效类型**:`SfxType` 枚举中移除 `shake` 类型 11. **清理存储层**:移除 `shakeEnabled` / `nsHomeShakeEnabled` 存储键 12. **清理翻译系统**:移除 14 个语言文件中的摇一摇相关翻译键(共 9 个键/语言) 13. **更新三方库清单**:iOS_macOS_Developer_Guide.md 和 ThirdpartyLibrarites.md 移除 sensors_plus / shake 条目 #### 影响范围 | 模块 | 变更 | |---|---| | 依赖配置 | 3 个 pubspec 模板移除 sensors_plus | | 核心服务 | 删除 shake_detector.dart,permission_service 移除 shake 权限 | | 路由 | 移除 ShakeScopeObserver | | 生命周期 | AppLifecycleGate 移除摇一摇恢复逻辑 | | 首页 | 移除摇一摇回调注册和监听 | | AR视图 | 改为纯手势+动画模式 | | 设置 | 移除摇一摇开关 | | 权限管理 | 移除摇一摇权限卡片 | | 引导页 | 移除摇一摇选项 | | 存储 | 移除 shakeEnabled 键 | | 翻译 | 14 个语言文件移除 9 个摇一摇翻译键 | | 文档 | 2 个文档移除 sensors_plus 条目 | *** ## [v6.20.0] - 2026-06-09 ### 🏗️ 稍后读页面架构重构 — Provider拆分 + UI ViewModel + i18n完善 + 性能优化 #### 变更说明 1. **ReadLaterNotifier 职责拆分**:将UI状态(搜索/筛选/排序/选择/拖拽)从 `ReadLaterState` 抽离至独立的 `ReadLaterUiNotifier`,数据层与UI层解耦 2. **新增组合Provider**:`readLaterFilteredProvider`(筛选条目)、`readLaterFoldersProvider`(文件夹缓存)、`readLaterTagStatsProvider`(标签统计缓存),消除 `FutureBuilder` 和同步阻塞调用 3. **i18n完善**:49个硬编码中文字符串迁移至多语言系统(`TReadLater` 新增49个翻译键),支持中英文 4. **BuildContext安全**:所有异步操作后增加 `mounted` 检查,防止跨async使用已销毁的Context 5. **拖拽文件完善**:`handleDroppedFiles` 支持图片/视频/音频/文档/链接等6种文件类型识别和添加 6. **列表动画优化**:长列表仅前20项使用交错延迟动画,避免性能问题 7. **主题感知卡片**:暗色模式下卡片背景使用半透明效果,增强层次感 8. **StateAccessor精简**:UI状态迁移至Provider后,抽象声明从172行大幅精简 #### 架构变更 | 变更项 | 变更前 | 变更后 | |---|---|---| | UI状态管理 | ReadLaterState内嵌字段 | 独立ReadLaterUiNotifier | | 文件夹加载 | FutureBuilder每次重建 | readLaterFoldersProvider缓存 | | 标签统计 | 同步getTagStats()阻塞UI | readLaterTagStatsProvider | | 筛选条目 | state.filteredEntries getter | readLaterFilteredProvider组合 | | 批量操作 | 从state.selectedIds读取 | 通过参数传入Set | | 硬编码字符串 | ~30处中文硬编码 | 全部走i18n翻译键 | #### 修改文件 - `lib/features/home/presentation/providers/readlater/readlater_ui_provider.dart` — 新增UI ViewModel - `lib/features/home/presentation/providers/readlater/readlater_provider.dart` — 移除UI状态,新增组合Provider,批量方法签名变更 - `lib/features/home/presentation/providers/readlater/readlater_page_state_accessor.dart` — 精简抽象声明 - `lib/features/home/presentation/providers/readlater/readlater_page_ui_mixin.dart` — 使用新Provider/i18n/动画优化/主题卡片 - `lib/features/home/presentation/providers/readlater/readlater_page_detail_mixin.dart` — i18n替换/mounted检查 - `lib/features/home/presentation/providers/readlater/readlater_page_folder_tag_mixin.dart` — i18n替换/mounted检查/Provider - `lib/features/home/presentation/providers/readlater/readlater_page_ops_mixin.dart` — i18n替换/mounted检查/拖拽完善/Provider - `lib/features/home/presentation/providers/readlater/readlater_page_ai_mixin.dart` — i18n替换/mounted检查 - `lib/features/home/presentation/providers/readlater_page.dart` — 适配新Provider - `lib/l10n/types/t_read_later.dart` — 新增49个翻译键 - `lib/l10n/languages/zh_cn.dart` — 新增49个中文翻译 - `lib/l10n/languages/en.dart` — 新增49个英文翻译 *** ## [v6.19.0] - 2026-06-09 ### 📋 引导页优化 — 安卓端页面顺序调整 + 协议页滚动进度条 #### 变更说明 1. **软件协议页增加滚动进度条**:协议内容区域新增垂直滚动进度条(进度百分比+Scrollbar),方便用户了解阅读进度 2. **安卓端页面顺序调整**:首次启动时,软件协议页为第一页,欢迎与指引为第二页(其他端不变) 3. **安卓端从App内打开引导页跳过协议**:从设置页"重新打开引导页"或关于页"使用引导"进入时,直接从欢迎与指引开始,跳过协议页(其他端不变) #### 页面顺序对照 | 场景 | 页面顺序 | |---|---| | 非安卓端首次 | 欢迎 → 协议 → 个性化 | | 安卓端首次 | 协议 → 欢迎 → 个性化 | | 安卓端从App内打开 | 欢迎 → 个性化(跳过协议) | #### 修改文件 - `lib/features/onboarding/presentation/onboarding_page.dart` — OnboardingNavScope增加语义导航索引,OnboardingPage支持skipAgreement参数和动态页面顺序 - `lib/features/onboarding/presentation/pages/agreement_page.dart` — 添加滚动进度条(LinearProgressIndicator+百分比+Scrollbar),权限说明列表同步添加 - `lib/features/onboarding/presentation/pages/welcome_page.dart` — 导航改用OnboardingNavScope语义索引 - `lib/features/onboarding/presentation/pages/personalization_page.dart` — 导航改用OnboardingNavScope语义索引 - `lib/features/onboarding/providers/onboarding_provider.dart` — OnboardingState增加totalPages字段,支持动态页数 - `lib/core/router/app_router.dart` — onboarding路由读取skip_agreement查询参数 - `lib/core/router/app_routes.dart` — 新增onboardingSkipAgreement路由常量 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 安卓端重新打开引导页使用skipAgreement路由 - `lib/features/mine/profile/presentation/about_page.dart` — 安卓端使用引导使用skipAgreement路由 - `lib/features/mine/settings/presentation/more_settings_page.dart` — 安卓端工厂重置后使用skipAgreement路由 *** ## [v6.18.0] - 2026-06-09 ### 🔒 隐私增强 — 摇一摇权限默认关闭 #### 变更说明 摇一摇(传感器)权限改为**默认关闭**,用户需在「权限管理」页面手动开启后才能访问加速度传感器。 #### 修改内容 - `PermissionService.isShakeEnabled` 默认值从 `true` 改为 `false` - `GeneralStorage.shakeEnabled` 默认值从 `true` 改为 `false` - 首页启动 ShakeDetector 前增加 `PermissionService.isShakeEnabled` 检查 - 通用设置页开启「摇一摇换句」时,若权限未授权则弹窗引导去权限管理页 - 前后台恢复摇一摇时增加权限检查 - 引导页开启摇一摇时同步设置 PermissionService 权限 #### 修改文件 - `lib/core/services/auth/permission_service.dart` — 默认值改为 false - `lib/core/storage/app_storage.dart` — 默认值改为 false - `lib/features/home/presentation/home_page.dart` — 增加权限检查 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 权限未授权时引导 - `lib/core/services/performance/app_lifecycle_gate.dart` — 恢复时增加权限检查 - `lib/features/onboarding/presentation/pages/personalization_page.dart` — 同步权限设置 - `lib/features/daily_card/presentation/daily_card_ar_view.dart` — AR视图传感器增加权限检查 *** ## [v6.17.0] - 2026-06-09 ### 🐛 Bug修复 — 安卓端管理空间对话框依旧不弹出 #### 根因分析 `android:manageSpaceActivity=".MainActivity"` 设置后,Android系统点击"管理空间"时**不会发送 `MANAGE_STORAGE` action intent**,而是直接以普通方式启动指定Activity。因此 `isManageStorageIntent()` 永远返回 false,对话框永远不会弹出。 #### 修复方案 拆分为独立的 `ManageSpaceActivity`: - 系统点击"管理空间" → 启动 `ManageSpaceActivity`(透明Activity,仅显示对话框) - 用户选择操作后 → 通过 intent extra 传递操作类型 → 启动 `MainActivity` - `MainActivity` 检测 extra → 通过 MethodChannel 通知 Flutter 执行操作 #### 修改文件 - `android/.../ManageSpaceActivity.kt` — 新建,独立管理空间对话框Activity - `android/.../MainActivity.kt` — 移除对话框逻辑,改为检测 intent extra - `android/.../AndroidManifest.xml` — manageSpaceActivity 指向 ManageSpaceActivity - `android/.../res/values/styles.xml` — 新增 ManageSpaceActivityTheme(透明) - `android/.../res/values-night/styles.xml` — 暗色模式透明主题 *** ## [v6.16.0] - 2026-06-09 ### 🐛 Bug修复 — 安卓端管理空间对话框不弹出 #### 问题描述 安卓端「应用信息 → 管理空间」点击后,原生对话框未弹出。 #### 根因分析 1. **Activity主题不兼容**:`LaunchTheme` 继承自 `Theme.Light.NoTitleBar`,不包含对话框样式,`AlertDialog.Builder` 在此主题下无法正常创建对话框 2. **冷启动时序问题**:原代码在 `configureFlutterEngine` 中用 800ms 固定延迟显示对话框,但此时 Activity 可能尚未 `onResume`,窗口不可见 #### 修复内容 - 使用 `ContextThemeWrapper` + `Material3` 对话框主题(`ManageSpaceDialogTheme`),独立于 Activity 主题 - 改用 `onResume` + `window.decorView.post` 确保窗口就绪后再显示对话框 - 添加 `com.google.android.material:material:1.12.0` 显式依赖 - 新增 `ManageSpaceDialogTheme` 样式(亮色/暗色模式) - 添加 try-catch 降级处理:对话框创建失败时回退到 Flutter 页面跳转 - 移除 `Handler.postDelayed(800ms)` 的不可靠时序方案 #### 修改文件 - `android/app/src/main/kotlin/apps/xy/xianyan/MainActivity.kt` — 修复对话框主题和时序 - `android/app/build.gradle.kts` — 添加 Material 依赖 - `android/app/src/main/res/values/styles.xml` — 新增 ManageSpaceDialogTheme - `android/app/src/main/res/values-night/styles.xml` — 新增暗色 ManageSpaceDialogTheme - `android/app/src/main/res/drawable/bg_dialog_background.xml` — 新建对话框圆角背景 *** ## [v6.15.0] - 2026-06-09 ### ✨ 新功能 — 稍后读页面全面升级(12项UI+4项数据层+2项三方库扩展) #### 问题描述 稍后读页面存在大量服务已实现但UI未接入的空壳功能,以及数据层缺陷。 #### UI层完善(12项) **1. 文件夹功能接入UI**: - 新增文件夹快捷栏(全部/未归档/自定义文件夹),支持创建/重命名/删除 - 条目可移入/移出文件夹(Slidable左滑 + 批量操作) - 长按文件夹Chip显示操作菜单 **2. 标签功能接入UI**: - 新增标签筛选栏,显示标签使用统计 - 条目标签管理面板(添加/移除/快捷选择) - Slidable左滑添加标签 **3. AI摘要接入UI**: - Feed详情弹窗增加"AI摘要"按钮 - 链接详情弹窗增加"AI摘要"按钮 - AI摘要弹窗支持一键复制 **4. 云端同步UI入口**: - 导航栏增加同步按钮(☁️) - 设置页增加自动同步开关 + 上次同步时间 + 立即同步 **5. 协作共享UI入口**: - 批量操作增加"分享到共享列表" - 设置页增加共享列表管理 + 创建共享列表 **6. 设备同步UI入口**: - Provider层已接入设备发现/发送方法 **7. 提醒服务UI入口**: - 设置页增加"充电时提醒"开关 + 立即检查 **8. 筛选Chip补充location类型**: - 📍位置类型已加入筛选Chip行 **9. 批量操作增强**: - 新增:批量移入文件夹、批量添加标签、批量分享到共享列表 **10. 详情弹窗增强**: - Feed详情:来源标签 + 相对时间 + 互动数据(👍👁️) + AI摘要按钮 - 链接详情:OG预览卡片 + AI摘要按钮 **11. Slidable多操作**: - 右滑:移除稍后读 + 标记已读/未读 - 左滑:移入文件夹 + 添加标签 **12. 空状态引导**: - 添加"去发现"按钮引导用户添加内容 #### 数据层修复(4项) **1. 已读状态持久化**: - `toggleRead`/`markAllRead` 现在持久化到数据库,退出页面不再丢失 **2. 拼音搜索**: - 搜索支持拼音首字母匹配(如搜"gsd"匹配"故事会") **3. 去重策略优化**: - 从 title+subtitle 拼接去重改为 id 去重,避免误去重 **4. location消息类型支持**: - ReadLaterEntryType 新增 location 枚举 - Provider 中新增 location 类型消息转换 #### 三方库扩展(2项) **1. 二维码分享**: - 协作共享列表支持二维码分享(qr_flutter) - 扫码加入共享列表 **2. 桌面拖拽**: - 桌面端支持拖拽文件添加到稍后读(desktop_drop) - 使用 PlatformHelper 公共类处理平台检测 #### 新建文件 - `readlater_settings_page.dart` — 稍后读设置页面(同步/提醒/协作) #### 修改文件 - `readlater_page.dart` — 页面大改造(文件夹/标签/同步/批量/详情/QR/拖拽) - `readlater_entry.dart` — 新增 folderId/tags/aiSummary 字段 + location 类型 - `readlater_provider.dart` — 已读持久化 + 27个新方法 + 拼音搜索 + id去重 - `readlater_entry_widgets.dart` — 新增 location 类型渲染 - `readlater_stats_page.dart` — 补充 location 类型映射 - `app_slidable.dart` — 新增 read/folder/tag SlideActionType - `route_registry.dart` — 注册 /readlater-settings 路由 *** ## [v6.14.0] - 2026-06-09 ### ✨ 新功能 — 安卓端管理空间原生对话框 #### 功能描述 安卓端「应用信息 → 清理数据 → 管理空间」点击后,由原来的直接跳转数据管理页面改为弹出原生对话框,提供三个操作选项。 #### 对话框功能 - **🗑️ 一键清理**:清除所有应用数据(收藏、历史、笔记、缓存等),带二次确认防误操作 - **📦 缓存管理**:跳转到应用内缓存管理页面(`/cache`) - **📊 数据管理**:跳转到应用内数据管理页面(`/settings/data`) #### 技术实现 - **Android原生端**:自定义 `AlertDialog` + XML布局,支持亮色/暗色模式自适应 - **MethodChannel通信**:新增 `navigate_to_cache_management`、`navigate_to_data_management`、`clear_all_data` 三个方法 - **Flutter端**:`app.dart` 新增对应处理器,一键清理复用 `DataManagementPage._clearAllData()` 逻辑 - 防止对话框重复弹出,`onDestroy` 时自动释放 #### 修改文件 - `android/app/src/main/kotlin/apps/xy/xianyan/MainActivity.kt` — 新增原生对话框逻辑 - `android/app/src/main/res/layout/dialog_manage_space.xml` — 新建对话框布局 - `android/app/src/main/res/drawable/bg_manage_option.xml` — 新建选项背景 - `android/app/src/main/res/drawable/bg_manage_option_destructive.xml` — 新建危险选项背景 - `android/app/src/main/res/drawable/bg_icon_circle_*.xml` — 新建图标圆形背景(蓝/绿/红) - `android/app/src/main/res/drawable-night/` — 暗色模式对应资源 - `lib/app/app.dart` — 新增MethodChannel处理器和一键清理逻辑 *** ## [v6.13.0] - 2026-06-09 ### ✨ 新功能 — 附件面板空壳功能完善(位置/链接/富文本) #### 问题描述 会话流输入栏左侧"+"按钮弹出的8宫格附件面板中,📍位置、🔗链接、✏️富文本三个入口为空壳UI,点击仅关闭面板无实际功能。 #### 完善内容 **🔗 链接输入面板 (LinkInputSheet)**: - 新建 `link_input_sheet.dart`,支持URL输入/剪贴板一键粘贴/可选标题输入 - 自动检测有效URL并异步抓取OG元数据预览(标题/描述/图片/站点名) - 发送链接消息,复用已有 `sendLinkMessage` 方法 **📍 位置输入面板 (LocationInputSheet)**: - 新建 `location_input_sheet.dart`,支持位置名称/详细地址手动输入 - 6个快捷位置Chip(🏠家/🏢公司/☕咖啡厅/🍽️餐厅/🏥医院/🛒商场),点击自动填充 - 新增 `location` 消息类型到 `ChatMessageType` 枚举 - 新增 `sendLocation` 方法到 `ChatMessageService` 和 `ChatNotifier` - 新增 `isLocation` 便捷属性到 `ChatMessage` 模型 **📍 位置消息气泡 (ChatLocationBubble)**: - 新建 `chat_location_bubble.dart`,毛玻璃卡片样式显示位置名称/地址 - 地图占位区(渐变背景+图钉图标+装饰网格线) - 操作按钮:复制地址/打开地图(Apple Maps) **✏️ 富文本**: - 连接已有 `RichTextEditorSheet`,点击直接打开富文本编辑器 **气泡渲染**: - `chat_bubble.dart` 中新增 `ChatLocationBubble` 渲染分支(AI气泡+用户气泡) **统计页面**: - `readlater_stats_page.dart` 中 `_typeLabel` 补充 `location` 类型映射 #### 修改文件 - `lib/features/discover/presentation/widgets/chat_input/link_input_sheet.dart` — 新建 - `lib/features/discover/presentation/widgets/chat_input/location_input_sheet.dart` — 新建 - `lib/features/discover/presentation/widgets/chat_bubble/chat_location_bubble.dart` — 新建 - `lib/features/discover/models/chat_message.dart` — 新增 location 枚举 + isLocation 属性 - `lib/features/discover/services/chat_message_service.dart` — 新增 sendLocation - `lib/features/discover/providers/chat_provider.dart` — 新增 sendLocationMessage - `lib/features/discover/presentation/widgets/chat/chat_flow_input_bar.dart` — 完善三个空壳 onTap - `lib/features/discover/presentation/widgets/chat_bubble/chat_bubble.dart` — 新增位置气泡渲染 - `lib/features/discover/presentation/pages/readlater_stats_page.dart` — 补充 location 类型映射 *** ## [v6.12.0] - 2026-06-09 ### 🐛 Bug修复 — 平台过滤全关闭后仍返回内容 + 后台分类快捷开关状态未更新 #### 问题描述 1. **核心Bug**: 后台将所有平台/分类关闭后,主页句子广场和句子卡片依旧有内容返回 2. **后台Bug**: 分类快捷开关批量启用/禁用后,列表勾选状态未更新 #### 根因分析 1. **API端**: `list/mix/recommend` 等方法在过滤后无启用分类时,回退到硬编码默认分类(如poetry/wisdom等),绕过了平台过滤 2. **API端**: `trending/random/refresh/refresh_content` 完全没有平台过滤逻辑 3. **API端**: `list` 指定具体频道时无平台过滤 4. **API端**: 大部分方法只从GET参数读取platform,未从`X-Platform`请求头读取(Flutter端很多调用只通过请求头传递) 5. **后台端**: 分类快捷面板checkbox未初始化为数据库中的`is_enabled`状态,操作后也未更新 #### 修复内容 **Feed.php(API控制器)- 8个方法修复**: 1. `list()` — 全平台关闭时返回空列表而非回退到硬编码分类;指定频道时增加平台过滤;缓存key加入platform 2. `channels()` — 所有频道禁用时不显示"推荐"频道 3. `trending()` — 新增platform参数和平台过滤逻辑 4. `recommend()` — 新增platform参数和平台过滤;用户偏好也按平台过滤;缓存key加入platform 5. `random()` — 新增platform参数和平台过滤逻辑 6. `mix()` — 全平台关闭时返回空列表而非回退到硬编码分类 7. `refresh()` — 新增platform参数和平台过滤逻辑 8. `refresh_content()` — 新增platform参数和平台过滤逻辑 9. 新增 `_getPlatform()` 统一方法 — 优先GET参数,其次`X-Platform`请求头,无效平台忽略 **FeedWeight.php(后台控制器)**: - `index()` — 传递`enabled_types`到视图,用于初始化快捷面板checkbox **index.html(后台视图)**: - 分类快捷面板checkbox根据`is_enabled`状态初始化checked和背景色 **feed_weight.js(后台JS)**: - 新增`updateCategoryCheckboxes()`函数,批量操作后同步更新checkbox状态和背景色 - `batch_category_enable`和`quick_all_categories`操作成功后调用状态更新 #### 修改文件 - `docs/toolsapi/application/api/controller/Feed.php` — 8个方法修复 + 新增_getPlatform() - `docs/toolsapi/application/admin/controller/FeedWeight.php` — 传递enabled_types - `docs/toolsapi/application/admin/view/feed_weight/index.html` — checkbox初始化 - `docs/toolsapi/public/assets/js/backend/feed_weight.js` — 操作后状态更新 #### 测试验证 - `Scripts/test_platform_filter.py` — 13/13 通过(正常状态+向后兼容+X-Platform头+无效平台) - `Scripts/test_platform_filter_full.py` — 10/10 通过(全关闭→空数据→恢复→有数据) *** ## [v6.11.0] - 2026-06-09 ### ✨ 新功能 — 推荐权重管理UI优化 #### 功能描述 对推荐权重管理模块进行7项UI和功能优化,包括开关样式按钮、分类多选、内容数量显示、平台图标点击切换等。 #### 新增后台接口 1. **toggle_platform** `POST /admin.php/feed_weight/toggle_platform` — 列表页点击平台图标直接切换开关 2. **batch_category_enable** `POST /admin.php/feed_weight/batch_category_enable` — 多选分类批量启用/禁用 3. **content_count** `GET /admin.php/feed_weight/content_count?feed_type=xxx` — 获取分类内容条数 #### UI优化 1. **平台快捷开关**: 改为iOS风格开关样式按钮(绿色=开启,灰色=关闭) 2. **分类快捷开关**: 改为多选checkbox列表,支持批量启用/禁用 3. **全局操作**: 改为开关样式,显示分类和平台信息 4. **启用状态列**: 平台图标改为可点击的圆形开关按钮,支持一键切换 5. **内容数量列**: 新增"内容数"列,显示每个分类的内容条数(万级显示) 6. **禁用分类显示**: 开启平台后,禁用状态的分类依旧显示❌已禁用 #### Bug修复 1. **random_content**: 修复表名映射(chengyu→cy, cidian→zc)和`$this->success()`参数顺序错误 2. **content_count**: 修复`strpos()`错误,改用原生SQL查询 3. **quick_platform**: 未指定ids时只操作is_enabled=1的分类,禁用分类保持不变 #### 修改文件 - `docs/toolsapi/application/admin/controller/FeedWeight.php` — 新增3个接口,修复success参数,原生SQL替代Db::name - `docs/toolsapi/public/assets/js/backend/feed_weight.js` — 开关样式按钮,平台图标点击,内容数列 - `docs/toolsapi/application/admin/view/feed_weight/index.html` — 开关样式快捷面板,分类多选 - `docs/toolsapi/docs/API_PLATFORM_FILTER_DOC.md` — 新增3个接口文档 *** ## [v6.10.0] - 2026-06-09 ### ✨ 新功能 — A/B测试实验管理 #### 功能描述 新增A/B测试功能,允许管理员对不同平台+用户分组展示不同的内容权重配置。例如:安卓用户A组看到笑话权重50,B组看到笑话权重30。 #### 新增数据表 - `tool_ab_test` — A/B测试实验表(实验名称、标识、平台、状态、流量占比、时间范围) - `tool_ab_test_variant` — A/B测试变体表(变体名称、标识、权重覆盖JSON、流量占比、是否对照组) #### 新增后台功能 1. **实验列表页**: 显示实验名称、目标平台、状态标签(草稿/运行中/已暂停/已结束)、流量占比、变体数量、操作按钮 2. **新建实验**: 实验名称、标识、描述、目标平台(下拉选择)、流量占比、计划时间、变体配置(动态添加,含权重覆盖弹窗) 3. **编辑实验**: 预填已有数据,运行中实验仅允许修改描述和结束时间 4. **实验状态流转**: 草稿→启动→暂停→恢复→结束,含校验(至少2个变体、流量占比总和100%、必须有对照组) 5. **变体权重配置**: 弹窗选择要覆盖的分类,设置权重值和启用状态,JSON格式存储 6. **删除实验**: 仅草稿状态可删除 #### 新增API接口 - `GET /api/feed/ab_test_config?platform=android&user_id=xxx` — 获取A/B测试配置 - 根据平台匹配运行中的实验 - 根据user_id的crc32 hash稳定分配变体 - 返回test_key、variant、weight_overrides #### 新增文件 - `Scripts/add_ab_test_table.py` — 数据库迁移脚本(SSH+PHP CLI建表) - `Scripts/add_ab_test_menu.py` — 权限菜单添加脚本 - `docs/toolsapi/application/admin/controller/AbTest.php` — 后台控制器 - `docs/toolsapi/application/admin/view/ab_test/index.html` — 列表视图 - `docs/toolsapi/application/admin/view/ab_test/add.html` — 新建视图 - `docs/toolsapi/application/admin/view/ab_test/edit.html` — 编辑视图 - `docs/toolsapi/public/assets/js/backend/ab_test.js` — 后台JS - `docs/toolsapi/application/admin/lang/zh-cn/ab_test.php` — 语言包 #### 修改文件 - `docs/toolsapi/application/api/controller/Feed.php` — 新增ab_test_config接口和_getAbTestConfig方法 #### weight_config JSON格式示例 ```json { "joke": {"weight": 30, "is_enabled": true}, "poetry": {"weight": 70, "is_enabled": true} } ``` *** ## [v6.9.2] - 2026-06-09 ### 🛡️ 修复 — platform_enabled 格式异常容错处理 #### 变更描述 为 `platform_enabled` 字段添加全面容错逻辑,防止服务端返回异常格式数据时导致客户端解析崩溃或频道显示异常。 #### 容错策略 - `platform_enabled` 为 null → 所有平台默认启用 - `platform_enabled` 不是 Map 类型 → 所有平台默认启用 - 某个平台 key 不存在 → 该平台默认启用 - 某个平台值不是 bool 类型 → 该平台默认启用 - 平台检测异常 → 兜底返回 'other' #### 修改文件 - `lib/features/home/models/feed_model.dart` — FeedChannel 新增 `platformEnabled` 字段和 `_parsePlatformEnabled` 容错解析函数,新增 `isPlatformEnabled()` 方法 - `lib/core/network/api_interceptor.dart` — `currentPlatform` getter 增加 try-catch 兜底 #### 向后兼容 - `FeedChannel` 新增字段均有默认值,不影响现有使用 - `is_enabled` 字段解析逻辑不变 - 服务端 `platform_enabled` 为空时行为与之前一致(所有平台启用) *** ## [v6.9.1] - 2026-06-09 ### ♻️ 重构 — 深度链接解析逻辑配置驱动化 #### 变更描述 将 `app_router.dart` 中5个硬编码 switch 方法的深度链接解析逻辑,重构为基于 `route_registry` 的配置驱动架构。新增路由只需在 `RouteDef.deepLinkAliases` 中声明别名即可,无需手动同步多个 switch 语句。 #### 新增文件 - `lib/core/router/deep_link_resolver.dart` — 配置驱动的深度链接解析器 #### 修改文件 - `lib/core/router/route_def.dart` — RouteDef 新增 `deepLinkAliases` 字段 - `lib/core/router/app_router.dart` — 删除5个硬编码 switch 方法,改用 DeepLinkResolver - `lib/core/router/route_registry.dart` — 为46个路由添加 deepLinkAliases 映射 - `lib/main.dart` — 添加 debug 模式下的深度链接配置验证 #### 向后兼容 - 深度链接解析结果与重构前完全一致 - DeepLinkService 调用方式不变 - 所有 xianyan:// 和 https://s2ss.com 链接行为不变 *** ## [v6.10.0] - 2026-06-09 ### ✨ 新功能 — A/B测试系统 + 后台优化 #### A/B测试系统 - 新增 `tool_ab_test` 和 `tool_ab_test_variant` 数据表 - 后台新增「A/B测试」管理菜单(信息流管理下) - 支持创建实验:实验名称、标识、目标平台、流量占比 - 支持多变体配置:A组(对照组)/B组/C组,每组可设置权重覆盖 - 实验状态管理:草稿→运行中→已暂停→已结束 - 启动校验:至少2个变体、流量占比总和100%、必须有对照组 - 用户分配算法:基于user_id的crc32哈希,确保同一用户始终分配到同一变体 - API接口:`GET /api/feed/ab_test_config?platform=android&user_id=xxx` - 运行中实验缓存30秒,状态变更时主动清除 #### 后台优化(8项) 1. **修复页面报错**:index.html模板`{:foreach}`语法错误改为`{foreach}` 2. **random_content性能优化**:`ORDER BY RAND() LIMIT 1`替代`COUNT+OFFSET` 3. **事务包裹**:`quick_all_platforms`/`quick_all_categories`/`batch_platform`/`reset_defaults`/`sync`均加事务 4. **SQL注入防护**:`random_content`/`sub_categories`加白名单校验(`_isValidTable()`) 5. **缓存清理完善**:清除所有平台维度的缓存key + 模板编译缓存 6. **platform_count排序优化**:MySQL JSON_EXTRACT函数替代PHP内存排序 7. **快捷操作批量选择**:选中分类后快捷平台操作只影响选中的分类 8. **APP端容错**:`platform_enabled`格式异常时默认所有平台启用 #### 修改文件 - `docs/toolsapi/application/admin/controller/FeedWeight.php` — 8项优化 - `docs/toolsapi/application/admin/controller/AbTest.php` — 新增A/B测试控制器 - `docs/toolsapi/application/admin/view/feed_weight/index.html` — 修复模板语法 - `docs/toolsapi/application/admin/view/ab_test/` — 新增3个视图 - `docs/toolsapi/application/api/controller/Feed.php` — 新增ab_test_config接口 - `docs/toolsapi/public/assets/js/backend/ab_test.js` — 新增 - `docs/toolsapi/public/assets/js/backend/feed_weight.js` — 快捷操作支持批量选择 - `lib/features/home/models/feed_model.dart` — platform_enabled容错 - `lib/core/network/api_interceptor.dart` — 平台检测容错 *** ## [v6.9.0] - 2026-06-09 ### ✨ 新功能 — 推荐权重管理后台全面升级 #### 功能描述 后台推荐权重管理页面全面升级:启用状态列显示平台图标、平台开关交互修复、快捷操作面板、内容类型中文显示、表头排序、随机内容预览、子类查询等。 #### 变更清单 1. **启用状态列改为显示平台图标**: 列表页不再显示"启用/禁用"文字,改为显示7个平台emoji图标,开启的图标正常显示,关闭的图标半透明+分隔线 2. **修复平台开关点击无反应**: 根因是ThinkPHP模板引擎无法用`$row.platform_data[$key]`访问变量key的数组元素,改为JavaScript动态生成平台开关按钮 3. **平台数量排序**: 新增"平台数"列,显示"开启数/7",支持点击排序 4. **禁用状态下不可编辑平台开关**: 编辑视图中is_enabled=0时,平台开关变灰不可点击,切换启用状态时自动联动 5. **快捷操作面板**: 列表页新增"快捷操作"按钮,展开面板包含: - 一键开启/关闭某平台(7个平台×开/关=14个按钮) - 一键启用/禁用某分类(下拉选择+启用/禁用) - 全局操作:全部开启/关闭平台、全部启用/禁用分类 6. **内容类型显示中文名**: nameMap从17种扩展到44种,所有内容类型显示emoji+中文名 7. **表头排序**: ID/内容类型/推荐权重/展示权重/推送上限/启用状态/平台数 均支持点击排序 8. **随机内容预览**: 编辑视图新增"随机一条"按钮,AJAX获取该分类的随机一条数据 9. **子类查询**: 编辑视图新增"查看子类"按钮,显示该分类的总条数、字段列表、子类分组统计 #### 新增API接口 - `POST /admin.php/feed_weight/quick_platform` — 一键开启/关闭所有分类的某个平台 - `POST /admin.php/feed_weight/quick_category` — 一键启用/禁用某个分类 - `POST /admin.php/feed_weight/quick_all_platforms` — 一键开启/关闭所有分类的所有平台 - `POST /admin.php/feed_weight/quick_all_categories` — 一键启用/禁用所有分类 - `GET /admin.php/feed_weight/random_content` — 获取某个内容类型的随机一条数据 - `GET /admin.php/feed_weight/sub_categories` — 获取某个内容类型的子类信息和统计 #### 修改文件 - `docs/toolsapi/application/admin/controller/FeedWeight.php` — 新增6个API方法 - `docs/toolsapi/application/admin/view/feed_weight/edit.html` — 重写平台开关为JS动态生成 - `docs/toolsapi/application/admin/view/feed_weight/index.html` — 新增快捷操作面板 - `docs/toolsapi/public/assets/js/backend/feed_weight.js` — 重写列定义和格式化器 - `Scripts/upload_platform_filter.py` — 新增JS文件上传支持 *** ## [v6.8.0] - 2026-06-09 ### ✨ 新功能 — 平台过滤:按平台控制内容分类开关 #### 功能描述 后台推荐权重管理模块的"启用状态"从单一开关改为多选平台开关,支持按平台(android/iOS/鸿蒙/macOS/Windows/Web/其他)独立控制每个内容分类的推送状态。APP端根据当前运行平台自动过滤,只展示该平台启用的内容。 #### 后台管理变更 - **FeedWeight控制器**: 新增 `$platforms` 平台列表常量,新增 `batch_platform()` 批量平台操作方法 - **编辑接口**: 支持 `platform_enabled` JSON参数,设置每个平台的开关状态 - **批量操作**: 支持全选/全不选/反选/按平台切换 - **视图**: 新增"平台操作"下拉菜单,支持一键操作;编辑页面新增平台开关按钮组(全选/反选/按平台切换) - **恢复默认**: 重置时所有平台开关恢复为开启 #### API变更 - **新增接口**: `GET /api/feed/platform_config` — 获取当前平台的内容分类配置 - **扩展接口**: `channels/list/mix/weight_config` 新增 `platform` 参数,支持按平台过滤 - **平台传递**: 支持 `X-Platform` 请求头 + `platform` URL参数双重传递 - **install接口**: 新增分类时自动设置 `platform_enabled` 默认值(所有平台开启) - **数据库**: `fa_feed_weight_config` 表新增 `platform_enabled` VARCHAR(255) 字段(表前缀tool_) #### 端到端测试结果 - 关闭joke的iOS平台 → iOS频道不包含joke ✅ - 安卓频道仍包含joke ✅ - platform_config接口正确返回禁用列表 ✅ - 恢复后iOS频道重新包含joke ✅ #### Flutter APP变更 - **ApiInterceptor**: `X-Platform` 请求头从固定值`flutter`改为实际平台标识(android/ios/harmony等) - **FeedService**: `fetchChannels/fetchRefreshContent` 新增 `platform` 参数 - **FeedListParams**: 新增 `platform` 字段,`toQueryParameters()` 自动附带 - **FeedMixConfig**: 新增 `platform` 字段,`toQueryParameters()` 自动附带 - **HomeFeedMixin**: 所有Feed数据拉取调用自动传入当前平台标识 #### 向后兼容 - `platform_enabled` 为空时所有平台默认启用 - 不传 `platform` 参数时不按平台过滤(等同旧版行为) - 旧版APP不传 `X-Platform` 头时不受影响 #### 修改文件 - `docs/toolsapi/application/admin/controller/FeedWeight.php` - `docs/toolsapi/application/admin/model/FeedWeightConfig.php` - `docs/toolsapi/application/admin/view/feed_weight/index.html` - `docs/toolsapi/application/admin/lang/zh-cn/feed_weight.php` - `docs/toolsapi/application/api/controller/Feed.php` - `lib/core/network/api_interceptor.dart` - `lib/features/home/services/feed_service.dart` - `lib/features/home/models/feed_model.dart` - `lib/features/home/providers/home_feed_mixin.dart` - `docs/toolsapi/docs/API_PLATFORM_FILTER_DOC.md` (新增) - `Scripts/upload_platform_filter.py` (新增) - `Scripts/test_platform_filter.py` (新增) *** ## [v6.7.5] - 2026-06-08 ### 🐛 修复 — 登录页/忘记密码页布局崩溃 #### 问题描述 - 点击「我的 → 头像/昵称」跳转后页面卡死(RenderBox was not laid out) - 登录页面(LoginPage)和忘记密码页面(ForgotPasswordPage)在iOS上触发布局约束错误 #### 根因分析 1. **LoginPage**: `Center` 包裹 `SingleChildScrollView`,在 `CupertinoPageScaffold` 中导致无限高度约束 2. **LoginPage**: `PageView` 在 `Column` 中缺少高度约束(`PageView` 需要有限高度才能布局) 3. **ForgotPasswordPage**: 同样的 `Center + SingleChildScrollView` 嵌套问题 #### 修复内容 - **login_page.dart**: 移除 `Center` 包裹,`SingleChildScrollView` 直接作为 `SafeArea` 子组件;给 `PageView` 添加 `SizedBox(height: 200)` 约束 - **forgot_password_page.dart**: 移除 `Center` 包裹,`SingleChildScrollView` 直接作为 `SafeArea` 子组件 #### 举一反三 - `Center` 不应直接包裹 `SingleChildScrollView`,因为 `Center` 不会为子组件提供高度约束 - `PageView`/`ListView`/`GridView` 在 `Column` 中必须用 `Expanded`、`SizedBox` 或 `Flexible` 包裹以提供高度约束 - 项目中其他26个文件存在 `Center + SingleChildScrollView` 组合,但大多数有中间组件提供约束,仅上述2个文件存在直接嵌套问题 #### 修改文件 - `lib/features/auth/presentation/login_page.dart` - `lib/features/auth/presentation/forgot_password_page.dart` *** ## [v6.7.4] - 2026-06-08 ### ♻️ 重构 — Emoji清理与原生Icon替代 #### 变更描述 全面清理UI层硬编码的emoji字符,替换为CupertinoIcons原生图标,提升视觉一致性和iOS风格统一性。同时清理14个多语言翻译文件中的emoji,避免翻译键值与UI图标重复。 #### 翻译文件清理(14个语言文件) - 移除所有emoji字符(国旗emoji除外,实际无国旗emoji) - ❤️按语言语义化替换(如"用心打造"、"Made with love"等) - 保留Unicode格式符号(↑ ↓ ⚡ ✓ ✕ ▼ ▲ 《》) - 涉及文件:ar/bn/de/en/es/fr/hi/it/ja/ko/pt/ru/zh_cn/zh_tw.dart #### UI层Emoji替换为CupertinoIcons - **readlater_utils.dart**: `mimeTypeToEmoji` → `mimeTypeToIcon`,`DocDisplayConfig.emoji` → `iconData` - **readlater_entry_widgets.dart**: 图片/视频/音频/文件/文档/文本条目的emoji全部替换为Icon - **thumbnail_image.dart**: 新增 `fallbackIcon` 参数,优先于 `fallbackEmoji` - **chat_session.dart**: 新增 `systemIcon` getter,系统会话图标映射 - **session_row/search_bar/popup_menu/hidden_sessions_page**: 条件渲染Icon优先、Text emoji兜底 - **sentence_detail_sheet.dart**: 操作按钮、统计标签、作者行、摘要框等emoji替换为Icon - **chat_bubble.dart**: 上下文菜单、元信息、分类标签、推送头部、气泡操作等emoji替换为Icon - **data_collection_info_page.dart**: 数据分类和用户权利的emoji替换为Icon #### 图标映射示例 | 原emoji | CupertinoIcon | 用途 | |---------|--------------|------| | 📖 | book_fill | 稍后读 | | 🔍 | lightbulb_fill | 灵感 | | 👣 | location_fill | 足迹 | | 📅 | calendar | 日签卡片 | | 🎨 | paintbrush_fill | 壁纸模板 | | ❤️ | heart_fill | 喜欢 | | ⭐ | star_fill | 收藏 | | 📊 | chart_bar_fill | 使用报告 | #### 修改文件 - `lib/l10n/languages/*.dart`(14个文件) - `lib/features/home/presentation/providers/readlater/readlater_utils.dart` - `lib/features/home/presentation/providers/readlater/readlater_entry_widgets.dart` - `lib/shared/widgets/media/thumbnail_image.dart` - `lib/features/discover/models/chat_session.dart` - `lib/features/discover/providers/chat_session_provider.dart` - `lib/features/discover/presentation/widgets/session/session_row.dart` - `lib/features/discover/presentation/widgets/session/session_search_bar.dart` - `lib/features/discover/presentation/widgets/session/session_popup_menu.dart` - `lib/features/discover/presentation/pages/chat/hidden_sessions_page.dart` - `lib/features/home/presentation/providers/sentence_detail_sheet.dart` - `lib/features/discover/presentation/widgets/chat_bubble/chat_bubble.dart` - `lib/features/mine/settings/presentation/privacy/data_collection_info_page.dart` *** ## [v6.7.3] - 2026-06-08 ### 🐛 修复 — Android端系统TTS不可用问题 #### 问题描述 - Android端系统TTS引擎显示为不可用 - 点击播放按钮后一直转圈,无法朗读 - 仅在线TTS在Android上可用,鸿蒙端系统TTS和在线TTS均正常 #### 根本原因 1. `flutter_tts`在Android端需要等待TTS引擎异步初始化完成,但代码未等待引擎就绪就调用`speak()` 2. `_initialized`标志设置过早,在引擎实际就绪之前就标记为已初始化 3. `speak()`方法没有超时机制,引擎未就绪时可能永远挂起,导致UI一直转圈 4. 缺少系统TTS失败时的自动回退机制 #### 修复内容 - **TtsService**: 新增`_engineReady`引擎就绪状态,通过`getEngines`/`getLanguages`验证引擎可用性 - **TtsService**: 新增`_waitForEngineReady()`方法,Android端初始化时等待引擎就绪(最多5秒超时) - **TtsService**: `speak()`添加8秒超时机制,防止无限挂起 - **TtsService**: 新增`onError`错误事件流,通知UI层系统TTS失败 - **TtsService**: 新增`isEngineReady` getter,供外部检查引擎就绪状态 - **TtsService**: 新增初始化锁`_initCompleter`,防止并发初始化 - **TtsPlayerSheet**: 新增系统TTS错误监听,失败时自动回退到在线TTS - **TtsPlayerSheet**: `_startPlaying()`增加引擎就绪检查,未就绪时直接回退 - **TtsPlayerBar**: 新增系统TTS错误监听和回退逻辑 - **TtsPlayerBar**: `_togglePlay()`增加引擎就绪检查 - **PluginHealthService**: 改进TTS健康检查,先初始化再检查引擎就绪状态 - **TtsPluginPage**: 预览朗读增加引擎就绪检查,不可用时自动切换到在线TTS - **TtsPluginPage**: 健康状态指示器增加系统TTS不可用提示 #### 修改文件 - `lib/core/services/audio/tts_service.dart` - `lib/shared/widgets/plugin/tts_player_sheet.dart` - `lib/shared/widgets/media/tts_player_bar.dart` - `lib/features/mine/settings/services/plugin_health_service.dart` - `lib/features/mine/settings/presentation/plugin/tts_plugin_page.dart` *** ## [v6.7.2] - 2026-06-08 ### ✨ 新增 — iOS Share Extension 分享扩展 #### 功能描述 新增 iOS Share Extension,用户可在其他App中通过系统分享面板选择"闲言",将文本、链接、图片、视频和文件分享到稍后读页面。此前仅 Android 支持此功能,iOS 端无法在系统分享面板中显示闲言。 #### 实现细节 - **ShareViewController.swift**:自定义分享扩展控制器,继承 SLComposeServiceViewController - 支持文本、URL、图片、视频、文件五种内容类型 - 图片类型支持 UIImage 直接保存和文件 URL 两种方式 - 视频类型自动生成缩略图和提取时长信息 - 所有文件复制到 App Group 共享容器,主 App 可直接读取 - **数据格式兼容**:ShareMediaFile/ShareMediaType 的 JSON 编码格式与 receive_sharing_intent 插件的 SharedMediaFile 完全一致 - 使用相同的 UserDefaults key(ShareKey/ShareMessageKey) - 主 App 的 SwiftReceiveSharingIntentPlugin 可直接解码 - **App Group 数据共享**:使用 `group.apps.xy.xianyan.share` 与主 App 和 Widget 共享数据 - **URL Scheme 跳转**:分享完成后通过 `ShareMedia-apps.xy.xianyan:share` 跳转回主 App - **Info.plist 配置**:主 App 新增 CFBundleURLTypes(URL Scheme)和 AppGroupId 键 - **Xcode 项目**:新增 ShareExtension target,Bundle ID 为 `apps.xy.xianyan.ShareExtension` - **Podfile**:新增 ShareExtension target 配置 #### 新增文件 - `ios/ShareExtension/ShareViewController.swift` — 分享扩展控制器 - `ios/ShareExtension/Info.plist` — 扩展配置(NSExtension + 激活规则) - `ios/ShareExtension/ShareExtension.entitlements` — App Group 权限 #### 修改文件 - `ios/Runner/Info.plist` — 新增 URL Scheme 和 AppGroupId - `ios/Runner.xcodeproj/project.pbxproj` — 新增 ShareExtension target - `ios/Podfile` — 新增 ShareExtension target #### 注意事项 - 需要运行 `cd ios && pod install` 更新 CocoaPods 配置 - 首次构建需在 Xcode 中打开项目确认 ShareExtension target 配置正确 *** ## [v6.7.1] - 2026-06-08 ### ✨ 新增 — 稍后读音频文件支持 #### 功能描述 为稍后读(Read Later)功能新增音频文件类型支持,用户可通过系统分享将音频文件保存到稍后读,并在稍后读列表中直接播放音频。 #### 实现细节 - **ReadLaterEntryType 新增 audio 枚举**:在稍后读条目类型枚举中新增 `audio` 类型,与 image/video/file 等并列 - **ReadLaterEntry 模型扩展**:新增 `audioPath`(音频文件路径)和 `durationMs`(时长毫秒)字段,copyWith 同步更新 - **AudioEntryWidget 音频气泡组件**:新增音频条目渲染组件,支持播放/暂停、波形可视化、进度显示、时长显示 - 使用 `audioplayers` 包实现音频播放 - 静态 AudioPlayer 实例,确保列表中只有一个音频在播放 - 波形进度条:已播放部分高亮,未播放部分淡色 - 播放完成自动重置状态 - **readlater_provider 消息转换**:`_chatMessageToEntry` 方法新增 `msg.isAudio` 分支,从 ChatMessage 附件和 meta 中提取音频路径、时长等信息 - **isFile 类型分流**:当 `isFile` 消息的 mimeType 以 `audio/` 开头时,映射为 `ReadLaterEntryType.audio` 而非 `file` - **筛选标签**:稍后读页面类型筛选 Chip 行新增 🎵 音频筛选标签 - **国际化**:TReadLater 新增 `audioType` 和 `audioEmoji` 翻译键,全部14种语言已更新 #### 修改文件 - `lib/features/home/presentation/providers/readlater/readlater_entry.dart` — 新增 audio 枚举、audioPath/durationMs 字段 - `lib/features/home/presentation/providers/readlater/readlater_entry_widgets.dart` — 新增 AudioEntryWidget + _MiniWaveformPainter - `lib/features/home/presentation/providers/readlater/readlater_provider.dart` — _chatMessageToEntry 新增 isAudio 分支 - `lib/features/home/presentation/providers/readlater_page.dart` — 筛选 Chip 新增 🎵 - `lib/l10n/types/t_read_later.dart` — 新增 audioType/audioEmoji 字段 - `lib/l10n/languages/` 全部14个语言文件 — 新增音频翻译 *** ## [v6.7.0] - 2026-06-08 ### 🔧 优化 — 注册流程增强 #### 功能描述 对注册模块进行分流重构和6项功能增强,提升安全性、数据一致性和用户体验。 #### 实现细节 - **文件分流重构**:将 `register_section.dart`(1241行)拆分为5个文件:主控组件 + 步骤1/2/3 + 弹窗工具类,每个文件控制在350行以内 - **用户名格式校验**:步骤1增加正则校验(3-30位,字母/数字/下划线/中文),实时显示校验状态(太短/非法字符/可用/已占用) - **用户名实时可用性检测**:输入防抖800ms后调用 `UserSecurityService.checkUsername()` 检测是否已被占用,接口不可用时默认放行 - **步骤间数据一致性**:记录发送验证码时的邮箱,步骤2返回步骤1后若邮箱变更则自动重置验证码状态(清空验证码、取消倒计时、重置发送状态) - **倒计时改用 Timer.periodic**:替换 `Future.doWhile` 为 `Timer.periodic`,更符合 Flutter 惯用写法,可通过 `cancel()` 精确控制 - **步骤切换动画**:使用 `AnimationController` + `FadeTransition` + `SlideTransition` 实现淡入滑动过渡效果 - **AuthNotifier 日志修复**:`login()` 方法中日志"注册成功"修正为"登录成功" #### 新增国际化键 - `usernameTooShort` — 用户名至少3个字符 - `usernameInvalidChars` — 用户名仅支持字母、数字、下划线和中文 - `usernameChecking` — 正在检查用户名 - `usernameTaken` — 该用户名已被占用 #### 新增后端接口 - `GET /api/user_security/check-username?username=xxx` — 检测用户名是否已被占用 #### 修改文件 - `lib/features/auth/presentation/register_section.dart` — 主控组件重构,邮箱变更检测、Timer.periodic、步骤动画 - `lib/features/auth/presentation/register_step_account.dart` — 用户名格式校验 + 实时可用性检测 - `lib/features/auth/presentation/register_step_verify.dart` — 无变更 - `lib/features/auth/presentation/register_step_password.dart` — 无变更 - `lib/features/auth/presentation/register_dialogs.dart` — 无变更 - `lib/features/auth/services/user_security_service.dart` — 新增 `checkUsername()` 方法 - `lib/features/auth/providers/auth_provider.dart` — 修复 login 日志 - `lib/l10n/types/t_auth.dart` — 新增4个翻译键 - `lib/l10n/languages/zh_cn.dart` — 新增4个中文翻译 - `lib/l10n/languages/en.dart` — 新增4个英文翻译 - `lib/l10n/languages/` 其余11个语言文件 — 新增4个翻译键(英文回退) *** ## [v6.6.9] - 2026-06-08 ### ✨ 新增 — 后台Feed权重管理扩展至44种分类 #### 功能描述 将后台管理面板的Feed权重配置从18种分类扩展至全部44种数据源,使所有分类均可通过管理面板配置推荐权重、展示权重、推送上限和启用状态。 #### 实现细节 - **FeedWeight控制器**:新增 `$allCategories` 静态属性定义全部44种分类的名称、图标、默认权重、搜索字段;新增 `sync()` 方法自动检测并插入缺失分类到数据库;更新 `reset_defaults()` 覆盖全部44种分类 - **Feed API控制器**:新增 `install` 公开接口(`/api/feed/install`),支持通过token或管理员登录调用,自动同步全部分类到 `feed_weight_config` 表;新增 `_ensureTableExists()` 自动建表方法;新增 `_getDefaultWeight()` 分类默认权重映射 - **语言文件**:新增 `feed_name`/`feed_icon`/`search_fields` 字段中文映射 - **测试脚本**:新增 `Scripts/test_feed_weight_api.py`,测试install端点、安全校验、channels端点、weight_config端点、stats端点、幂等性 #### 全部44种数据源 poetry, wisdom, story, hitokoto, riddle, efs, brainteaser, saying, lyric, why, composition, couplet, cs, drug, herbal, food, wine, article, chengyu, hanzi, cidian, prescription, tisana, joke, zgjm, lunyu, hdnj, jgj, mz, zz, zuozhuan, sj, sgz, sbbf, warring, illness, word, abbr, surname, jieqi, nation, wlyh, jiufang, bot #### 修改文件 - `docs/toolsapi/application/admin/controller/FeedWeight.php` — 新增$allCategories定义、sync()方法、更新reset_defaults() - `docs/toolsapi/application/api/controller/Feed.php` — 新增install()接口、_ensureTableExists()、_getDefaultWeight() - `docs/toolsapi/application/admin/lang/zh-cn/feed_weight.php` — 新增字段映射 - `Scripts/test_feed_weight_api.py` — 新增测试脚本 *** ## [v6.6.8] - 2026-06-08 ### ✨ 新增 — 笔记"在发现中置顶"功能 #### 功能描述 在笔记列表页的每张笔记卡片右下角添加置顶按钮,用户可将笔记置顶到发现页的会话流中。置顶后的笔记以📌图标显示在会话流顶部,点击可跳转到笔记编辑页。 #### 实现细节 - **ChatSession 模型**:新增 `linkedNoteId` 字段和 `isPinnedNote` 计算属性,用于关联笔记与会话 - **ChatSessionProvider**:新增 `pinNoteToDiscover`/`unpinNoteFromDiscover`/`isNotePinnedToDiscover` 方法,支持笔记置顶状态管理和本地持久化 - **笔记列表页**:三种布局(列表/瀑布流/时间线)均添加置顶按钮,点击弹出 CupertinoAlertDialog 包含"在发现中置顶"开关 - **发现页**:`_onSessionTap` 中新增置顶笔记会话判断,点击直接导航到笔记编辑页 #### 修改文件 - `lib/features/discover/models/chat_session.dart` — 添加 linkedNoteId 字段和 isPinnedNote 属性 - `lib/features/discover/providers/chat_session_provider.dart` — 添加笔记置顶方法 + 持久化/恢复逻辑 - `lib/features/note/presentation/note_list_page.dart` — 添加置顶按钮和弹窗 - `lib/features/discover/presentation/pages/home/discover_page.dart` — 处理置顶笔记点击导航 *** ## [v6.6.7] - 2026-06-07 ### 🐛 修复 — iOS App Store 上传验证失败 (IOSSIMULATOR platform) #### 问题 上传 IPA 到 App Store 时验证失败,报错:`objective_c.framework/objective_c` 的 arm64 slice 引用了不支持的平台 (IOSSIMULATOR)。 #### 原因 Dart NativeAssets 构建系统将 `objective_c` 原生库错误地标记为 `IOSSIMULATOR` 平台而非 `IOS` 平台。`objective_c 9.4.1` 是 `path_provider_foundation` 的传递依赖,其生成的 framework 二进制文件中 `LC_BUILD_VERSION` load command 的 platform 字段为 7 (IOSSIMULATOR) 而非 2 (IOS)。 #### 修复 - 在 Xcode 项目中添加 "Fix Simulator Platform" 构建阶段脚本 - 脚本在构建后自动检测所有 framework 中的 IOSSIMULATOR 平台标记 - 使用 Python 解析 Mach-O 二进制文件,将 `LC_BUILD_VERSION` 中的 platform 从 7 (IOSSIMULATOR) 修改为 2 (IOS) - 脚本位于 "Embed App Extensions" 和 "Thin Binary" 构建阶段之间 #### 修改文件 - `ios/Runner.xcodeproj/project.pbxproj` — 添加 Fix Simulator Platform 构建阶段 *** ## [v6.20.19] - 2026-06-07 ### 🐛 修复 — 句子广场选择分类后仍显示混合句子 #### 问题 选择具体分类(如"古诗词")后,句子列表仍显示"推荐"模式的混合数据,而非所选分类的句子。 #### 原因 1. `selectType()` 切换分类时未清空旧句子列表,新数据加载期间仍显示旧的混合数据 2. `fetchNewSentences()` 和 `fetchRefreshSentences()` 中的分类过滤逻辑仅检查"是否启用",未严格匹配当前选中的分类 #### 修复 - `selectType()` 无缓存时清空 `sentences` 并设置 `isForceLoading=true`,显示骨架屏而非旧数据 - `fetchNewSentences()` 和 `fetchRefreshSentences()` 增加严格分类过滤:选中具体分类时只保留该分类数据 - fallback 逻辑同步修复 #### 修改文件 - `lib/features/home/providers/home_provider.dart` — selectType 清空旧数据 - `lib/features/home/providers/home_feed_mixin.dart` — 严格分类过滤 *** ## [v6.20.18] - 2026-06-07 ### 📊 改进 — 句子广场/句子来源分类由后台推荐权重管理控制 #### 服务端修改 - `/api/feed/channels` 接口根据 `tool_feed_weight_config` 表的 `is_enabled` 字段过滤分类,只返回后台启用的分类 - `/api/feed/stats` 接口同步过滤,统计数据只包含启用分类 - 频道列表响应新增 `is_enabled` 字段 - 未在权重配置表中的类型默认启用(保持兼容) #### 前端修改 - `FeedChannel` 模型新增 `isEnabled` 字段,解析服务端 `is_enabled` - `source_provider.dart` 移除硬编码的 `_kDefaultDisabledKeys`(原默认禁用 jieqi/article/lunyu/abbr/jiufang),改为由服务端控制 - 句子来源页面分类总数现在正确反映后台开启的分类数量 #### 修改文件 - `docs/toolsapi/application/api/controller/Feed.php` — channels/stats 方法增加 is_enabled 过滤 - `lib/features/home/models/feed_model.dart` — FeedChannel 添加 isEnabled 字段 - `lib/features/source/providers/source_provider.dart` — 移除硬编码禁用列表 *** <<<<<<< Updated upstream ## [v6.20.17] - 2026-06-07 ### 🔍 改进 — Spotlight搜索扩展 #### 全局快捷键 (Cmd+K / Ctrl+K) - 新增 `SpotlightShortcut` 工具类,检测 Cmd+K (macOS) / Ctrl+K (Win/Linux/Web/外接键盘) - Profile 页面注册全局键盘监听,快捷键直接唤起搜索 - 搜索浮层底部快捷键提示增加 ⌘K/Ctrl+K #### 搜索结果最近访问排序 - 搜索结果按最近访问时间倒序排列(最近使用的排前面) - 访问记录持久化到本地存储 #### 搜索建议自动补全 - 输入≥2字即触发搜索建议 - 新增模糊匹配(逐字符匹配,允许间隔) - Provider 新增 `suggestions` 字段 ### 🛡️ 改进 — LoginGuardWidget 增强 - 默认文案接入 i18n 系统(`t.profile.loginToViewProfile` / `t.profile.goLogin`) - 新增 `onLogin` 回调参数,登录成功后可触发页面数据刷新 ### 🌍 改进 — 翻译系统一致性 - `translation_io_service.dart` 添加 `_checkProfileFieldsSync` 字段同步检查(debug 模式打印警告) - 签到页面 30+ 处硬编码中文替换为 i18n 调用 - TProfile 新增 32 个签到相关翻译字段,14 种语言同步更新 ### 🔧 修复 — 编译构建 - `app_info_sections.dart` 添加显式类型注解修复 `avoid_dynamic_calls` 警告 ### 🌙 改进 — 深色模式对比度优化 - `textSecondary`: #9CA3AF → #AEAEB2 (iOS systemGray2) - `textHint`: #6B7280 → #8E8E93 (iOS systemGray, WCAG AA ≥4.5:1) - `overlaySubtle`: 深色模式边框从不可见 → 白色33%透明度 - AMOLED 纯黑模式同步修复 ### 📱 改进 — iPad 横屏布局 - Spotlight 搜索浮层 iPad 横屏宽度 480 → 520 ### ♿ 改进 — 无障碍支持 - Spotlight 搜索浮层:搜索栏/结果项/分类标题/最近搜索标签添加 Semantics - LoginGuardWidget:未登录提示视图添加 Semantics - Profile 页面:搜索按钮/快捷操作按钮添加 Semantics #### 修改文件 - `lib/features/mine/profile/presentation/spotlight_search/spotlight_shortcut.dart` — 新增全局快捷键 - `lib/features/mine/profile/presentation/spotlight_search/spotlight_search_overlay.dart` — 快捷键提示+iPad宽度+Semantics - `lib/features/mine/profile/presentation/spotlight_search/spotlight_search_data.dart` — 模糊匹配+suggest方法 - `lib/features/mine/profile/presentation/spotlight_search/spotlight_search_provider.dart` — 访问排序+建议+模糊匹配 - `lib/features/mine/profile/presentation/profile_page.dart` — 全局快捷键+Semantics - `lib/shared/widgets/feedback/login_guard_widget.dart` — i18n+onLogin+Semantics - `lib/core/theme/app_colors.dart` — 深色模式对比度修复 - `lib/l10n/translation_io_service.dart` — 字段同步检查+签到翻译导入 - `lib/l10n/types/t_profile.dart` — 32个签到翻译字段 - `lib/l10n/languages/*.dart` — 14种语言同步更新 - `lib/features/mine/signin/presentation/signin_page.dart` — 硬编码→i18n - `lib/features/mine/profile/presentation/app_info_sections.dart` — 类型注解修复 *** ## [v6.20.16] - 2026-06-07 ### 🌍 改进 — 签到页面 i18n 国际化 #### 签到页面硬编码中文全面接入 i18n 翻译系统 **变更内容**: - TProfile 类型新增 32 个签到相关翻译字段(loginToCheckin、todaySigned、weeklyCheckin、makeupCheckin 等) - 全部 14 个语言文件(zh_cn、en、ja、zh_tw、ko、de、it、es、ar、bn、hi、pt、ru、fr)同步更新 - translation_io_service.dart 的 `_tProfileToMap`、`_importProfile`、`_checkProfileFieldsSync` 三处同步更新 - signin_page.dart 所有用户可见硬编码中文替换为 `t.profile.xxx` / `t.common.xxx` 调用 - 补签弹窗中带参数的字符串使用 `{0}`/`{1}` 占位符 + `replaceAll` 替换 **保留项**(受限空间视觉元素,暂无 i18n 键): - 日历格子单字指示符('签'/'补') - 星期缩写('一二三四五六日') - 日期格式('年月日') ### 🛡️ 改进 — TProfile 字段同步检查 #### 新增 `_checkProfileFieldsSync` 防止新增字段遗漏 - 在 `_importProfile` 方法中添加字段同步检查调用 - 新增 `_checkProfileFieldsSync` 静态方法,debug 模式下打印缺失/多余字段警告 - 使用 `assert(() { ... return true; }())` 模式,release 模式下零开销 ### 🔧 修复 — app_info_sections.dart avoid_dynamic_calls 警告 #### 修复 PlatformDispatcher 实验性 API 的类型安全警告 - `PlatformDispatcher` 和 `FlutterView` 添加显式类型注解 - 保留 `(x as dynamic)` 强转访问实验性 API(impellerEnabled、renderingEngine) - 添加 `// ignore: avoid_dynamic_calls` 注释 #### 修改文件 - `lib/l10n/types/t_profile.dart` — 新增 32 个签到翻译字段 - `lib/l10n/translation_io_service.dart` — 同步字段映射 + 字段检查 - `lib/l10n/languages/*.dart` — 14 个语言文件更新 - `lib/features/mine/signin/presentation/signin_page.dart` — 硬编码中文替换为 i18n - `lib/features/mine/profile/presentation/app_info_sections.dart` — 修复类型警告 *** ## [v6.20.15] - 2026-06-07 ### 🔍 新功能 — 我的页面 Spotlight 全局搜索 #### 新增:macOS Spotlight 风格全局搜索浮层,支持实时搜索/分类展示/键盘导航/拼音匹配 **功能特性**: - 点击「我的」页面顶部🔍图标弹出 Spotlight 风格搜索浮层 - 毛玻璃背景遮罩 + 居中圆角搜索框 + 弹性入场动画 - 实时搜索:输入即搜索,支持中文/拼音/拼音首字母匹配 - 分类展示:页面(蓝)/功能(绿)/工具(橙)/设置(灰)/内容(紫) 五大分类 - 关键词高亮:匹配部分用主题色高亮显示 - 最近搜索:空查询时显示最近搜索标签,支持点击填入/单条删除 - 键盘导航:↑↓选择 / Enter确认 / ESC关闭 - 快捷键提示栏 **动画效果**: - 入场:遮罩渐入 + 搜索框弹性滑入(过冲曲线 Cubic(0.34, 1.56, 0.64, 1.0)) - 结果列表:flutter_staggered_animations 交错入场 - 选中项:AnimatedContainer 背景渐变 - 清除按钮:fadeIn + scale 动画 **技术实现**: - `SpotlightSearchOverlay` — 搜索浮层主组件(showGeneralDialog + BackdropFilter) - `SpotlightSearchData` — 50+ 搜索项全量索引(PinyinHelper 自动生成拼音) - `SpotlightSearchNotifier` — Riverpod 状态管理(搜索/导航/历史持久化) - 使用 `flutter_animate` + `flutter_staggered_animations` 实现动画 - 动态主题适配(AppTheme.ext(context)) ### 🛡️ 改进 — LoginGuardWidget 扩展部署 #### 退出登录后信息清理覆盖更多页面 **新增部署页面**: - `signin_page.dart` — 签到页面(替换自定义 _showLoginPrompt 弹窗) - `note_list_page.dart` — 笔记页面(替换自定义 _buildLoginPrompt) - `achievement_page.dart` — 成就中心 - `daily_fortune_page.dart` — 每日运势 - `reading_report_page.dart` — 阅读报告 **保留原有设计的页面**: - 收藏/点赞/足迹页面 — 保留 sync banner 设计(本地数据仍可见) - 用户中心/个人资料 — 保留自有 auth 处理(核心页面需始终可访问) #### 修改文件 - `lib/features/mine/profile/presentation/spotlight_search/spotlight_search_overlay.dart` — 新增搜索浮层 - `lib/features/mine/profile/presentation/spotlight_search/spotlight_search_data.dart` — 新增搜索数据索引 - `lib/features/mine/profile/presentation/spotlight_search/spotlight_search_provider.dart` — 新增搜索状态Provider - `lib/features/mine/profile/presentation/profile_page.dart` — 添加搜索按钮入口 - `lib/features/mine/signin/presentation/signin_page.dart` — 部署LoginGuardWidget - `lib/features/note/presentation/note_list_page.dart` — 部署LoginGuardWidget - `lib/features/mine/achievement/presentation/achievement_page.dart` — 部署LoginGuardWidget - `lib/features/daily_fortune/presentation/daily_fortune_page.dart` — 部署LoginGuardWidget - `lib/features/reading_report/presentation/reading_report_page.dart` — 部署LoginGuardWidget *** ## [v6.20.14] - 2026-06-07 ### 🔐 新功能 — 忘记密码重置页面 #### 新增:未登录用户可通过密保问题/验证码/联系客服三种方式重置密码 **页面功能**: - 三种重置方式切换:密保问题、验证码、联系客服 - 密保问题方式:输入账号 → 选择密保问题 → 输入答案 → 设置新密码 → 提交 - 验证码方式:输入邮箱/手机号 → 发送验证码 → 输入验证码 → 设置新密码 → 提交 - 联系客服方式:展示需提交给客服的信息列表和联系方式 **技术实现**: - 使用 `CupertinoSlidingSegmentedControl` 实现三种方式切换 - iOS 风格 `CupertinoPageScaffold` + `GlassContainer` 毛玻璃卡片 - 动态主题支持 `AppTheme.ext(context)` - 使用项目统一组件:`AppSpacing`、`AppRadius`、`AppTypography`、`GlassContainer` - 调用 `UserSecurityService.resetPassword()` / `sendEms()` / `secQuestions()` 接口 **路由**: - 新增路由 `AppRoutes.forgotPassword = '/forgot-password'` - 登录页"忘记密码"按钮改为导航至新页面(原为弹窗提示) **国际化**: - `TAuth` 新增17个翻译键:forgotPasswordTitle, forgotPasswordSubtitle, resetBySecQuestion, resetByVerifyCode, resetByContactService, newPasswordHint, resetCodeAccountHint, resetPasswordSuccess, resetPasswordFailed, contactServiceTitle, contactServiceSubtitle, contactServiceInfoAccount, contactServiceInfoEmail, contactServiceInfoDevice, contactServiceInfoDescription, contactServiceMethod, contactServiceMethodDetail - 全部14种语言文件已更新 #### 修改文件 - `lib/features/auth/presentation/forgot_password_page.dart` — 新增忘记密码页面 - `lib/core/router/app_routes.dart` — 新增 forgotPassword 路由常量 - `lib/core/router/route_registry.dart` — 注册 forgot-password 路由 - `lib/features/auth/presentation/login_page.dart` — "忘记密码"按钮改为导航至新页面 - `lib/l10n/types/t_auth.dart` — 新增17个翻译键 - `lib/l10n/languages/*.dart` — 全部14种语言文件更新 *** ## [v6.20.13] - 2026-06-07 ### 🌐 国际化 — 通用设置页面 i18n 支持 #### 新增:通用设置页面全量多语言翻译键,替换所有硬编码中文文本 **翻译键新增**: - `TCommon`: searchHistory, gotIt, featureUnavailable, featureNotSupported, inDevelopment, nAvailable, appName, exportFailed - `TSettings` (flat): featureExtension, plugin, pluginSubtitle, dailyReminder, dailyReminderSubtitle, reminderTime, reminderTimeSubtitle, developer, logLevel, logLevelSubtitle - `TSettingsInteraction`: sfxFeedback, sfxFeedbackSubtitle, sfxStyle, sfxStyleSubtitle, shakeToSwitch, shakeToSwitchSubtitle - `TSettingsDisplay`: screenAlwaysOn, screenAlwaysOnSubtitle, screenAlwaysOnOff, screenAlwaysOnReading, screenAlwaysOnAlways, screenAlwaysOnTitle, reopenOnboarding, reopenOnboardingSubtitle, navBarPosition, navBarPositionSubtitle, navBarPositionLeft, navBarPositionTitle, splitViewRatio, splitViewRatioSubtitle, splitViewRatioTitle, splitViewEnabled, splitViewEnabledSubtitle, shaderBackground, shaderBackgroundSubtitle - `TSettingsPrivacy`: nearbyDiscovery, nearbyDiscoverySubtitle - `TSettingsAdvanced`: otherSettings, otherSettingsSubtitle **语言文件更新**: 全部14种语言 (zh_cn, zh_tw, en, ja, ko, fr, de, es, it, pt, ru, ar, hi, bn) **源文件替换**: general_settings_page.dart, general_settings_sections.dart, general_settings_pickers.dart, general_settings_actions.dart 中所有硬编码中文文本已替换为 `t.settings.xxx` / `t.common.xxx` 翻译调用 **向后兼容**: T根类和TSettings类新增 @Deprecated flat getters,保持旧代码兼容 #### 修改文件 - `lib/l10n/types/t_common.dart` — 新增8个通用翻译键 - `lib/l10n/types/t_settings.dart` — 新增10个flat键 + deprecated getters - `lib/l10n/types/t_settings_interaction.dart` — 新增6个交互翻译键 - `lib/l10n/types/t_settings_display.dart` — 新增18个显示翻译键 - `lib/l10n/types/t_settings_privacy.dart` — 新增2个隐私翻译键 - `lib/l10n/types/t_settings_advanced.dart` — 新增2个高级翻译键 - `lib/l10n/types/t_root.dart` — 新增deprecated flat getters - `lib/l10n/languages/*.dart` — 全部14种语言文件更新 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 替换硬编码文本 - `lib/features/mine/settings/presentation/general/general_settings_sections.dart` — 替换硬编码文本 - `lib/features/mine/settings/presentation/general/general_settings_pickers.dart` — 替换硬编码文本 - `lib/features/mine/settings/presentation/general/general_settings_actions.dart` — 替换硬编码文本 *** ## [v6.20.12] - 2026-06-07 ### 🐛 Bug修复 — 密保问题注册显示"服务器内部错误" #### 修复:跳过邮箱验证+密保问题注册时,点击完成注册显示"服务器内部错误" **后端根因**: 1. `tool_user`表缺少`gold`字段,`setInc('gold', 50)`抛出未捕获PDOException → HTTP 500 2. `sec_question`/`sec_answer`通过`$extend`传入`User::create()`,若字段不存在则INSERT失败 3. 注册后操作(验证状态/积分/金币)无try-catch保护,任何异常导致500 **后端修复** (UserSecurity.php v10.2.1): 1. `sec_question`/`sec_answer`不再放入`$extend`,改为注册成功后单独UPDATE(带try-catch) 2. `gold`字段操作增加容错:检测字段是否存在,不存在则跳过 3. 注册后所有操作包裹在整体try-catch中,确保任何失败不影响注册结果 4. 数据库迁移:`tool_user`表新增`gold INT(10) UNSIGNED DEFAULT 0`字段 **客户端修复**: 1. `UserSecurityService.register()` 新增 `on ApiException catch` 分支,捕获ApiClient转换后的异常 2. 当检测到服务端内部错误(500/内部/服务器错误)时,自动尝试用注册凭据登录 3. 若登录成功,确认注册已完成,返回用户信息(注册视为成功) 4. 若登录也失败,才抛出原始错误 5. `_handleRegister()` 区分"已注册"和"服务器内部错误"两种错误场景 **影响范围**: 注册流程(跳过邮箱验证+密保问题注册场景) #### 修改文件 - `docs/toolsapi/application/api/controller/UserSecurity.php` — 后端注册接口修复 - `docs/toolsapi/application/admin/command/Install/migrate_v10_2.sql` — gold字段迁移 - `lib/features/auth/services/user_security_service.dart` — register()新增ApiException捕获+自动登录恢复逻辑 - `lib/features/auth/presentation/register_section.dart` — 区分已注册/服务器错误处理 *** ## [v6.20.11] - 2026-06-07 ### 🐛 Bug修复 — RenderChartFadeTransition disposed 回归修复(第二版) #### 修复:SafeChartWidget 改用 didChangeDependencies 监听路由 - **v6.20.11 初版问题**: 在 `build()` 中检查 `ModalRoute.of(context)?.isCurrent` 无效—— CupertinoPageRoute 的 pop 动画通过 overlay 级 SlideTransition 实现,页面内容 widget 的 build() 不会在动画期间被调用,因此 isCurrent 变化不会触发重建 - **最终方案**: 改用 `didChangeDependencies` 监听 `_ModalScopeStatus` InheritedWidget 变化 - `ModalRoute.of()` 内部依赖 `_ModalScopeStatus`,当 isCurrent 变化时通知所有依赖方 - `didChangeDependencies` 在 pop 开始时立即触发(build 阶段之前),此时 setState 将图表替换为占位符 - 图表在 pop 动画开始前就被移出 widget 树,后续 dispose/unmount 时已无 Syncfusion 元素 - 同时处理路由恢复场景(子页面 pop 后当前路由重新变为 current),恢复图表渲染 - **影响范围**: 所有使用 SafeChartWidget 的页面(40+处) #### 修改文件 - `lib/shared/widgets/charts/safe_chart_widget.dart` — 新增 didChangeDependencies 路由监听 *** ## [v6.20.10] - 2026-06-07 ### 🐛 Bug修复 — 双重回归: RenderChartFadeTransition disposed + 卡片收起无反应 #### 修复1:数据管理页面 "disposed RenderObject was mutated: RenderChartFadeTransition" - **根因**: v6.20.9 移除 deactivate 的 setState 后,标志位虽然变了但 build 未被触发,chart widget 仍在 element tree 中直到 unmount。Syncfusion 内部 Ticker 在 RenderObject 被 dispose 后仍尝试 markNeedsLayout - **修复**: deactivate 中用 `addPostFrameCallback` 调度 setState,异步触发 rebuild 把 chart 替换为 placeholder - 不在 build 阶段同步 setState(避免 "setState called during build" + GlobalKey 重复) - 保证 chart 在 dispose 前被替换(避免 "disposed RenderObject mutated") - **影响范围**: 所有使用 SafeChartWidget 的页面(数据管理、字体管理、缓存分析等) #### 修复2:每日心情卡片展开后点击收起无反应 - **根因**: `FortuneState.copyWith` 的 `expandedDate: clearExpanded ? null : (expandedDate ?? this.expandedDate)` 在传 `null` 时被 `null ?? this.expandedDate` 回退到旧值,导致收起时 expandedDate 永远不会被清空 - **修复**: toggleExpanded 中显式设置 `clearExpanded: shouldClear` 走清空分支 - **影响范围**: 每日心情页面所有卡片的展开/收起交互 #### 修改文件 - `lib/shared/widgets/charts/safe_chart_widget.dart` — deactivate 调度 postFrameCallback - `lib/features/daily_fortune/providers/fortune_provider.dart` — toggleExpanded 传 clearExpanded *** ## [v6.20.9] - 2026-06-07 ### 🐛 Bug修复 — 数据管理返回后双重错误 + 每日心情卡片展开/收起 ParentDataWidget #### 修复1:数据管理页面返回后 "Duplicate GlobalKeys" + "setState called during build" 双重错误 - **根因**:上一版 v6.20.8 修复图表 disposed 时,在 `SafeChartWidget.deactivate()` 中增加 `setState(() {})` 强制重建。该方案存在两个隐患: 1. `deactivate` 可能被框架在 build 阶段触发 → 抛 "setState() or markNeedsBuild() called during build" 2. 错误的 dirty 标记污染 widget tree → 引发 "Duplicate GlobalKeys detected in widget tree" - **修复**:移除 `deactivate()` 中的 `setState` 调用,仅设置 `_deactivated = true` 和 `_ready = false` 标志位,下次 build 自动渲染占位符(无需重建) - **影响范围**:所有使用 SafeChartWidget 的页面 #### 修复2:每日心情页面卡片展开/收起 "ParentDataWidget Expanded(flex: 1)" 错误 - **根因**:`_buildActionButton` 内部返回 `Expanded(child: GestureDetector(...))`,分享按钮处用 `AnimatedScale > AnimatedOpacity > _buildActionButton(...)` 包裹。`AnimatedScale`/`AnimatedOpacity` 均为 RenderObjectWidget(RenderAnimatedScale / RenderAnimatedOpacity),它们会截断 RenderFlex 父级链。当 `Expanded` 试图给子 RenderObject 应用 `FlexParentData` 时,发现父级是 RenderAnimatedOpacity 而非 RenderFlex,触发 "ParentData of incompatible type" 错误 - **修复**: 1. 重构 `_buildActionButton` 不再包 `Expanded`,由调用方决定是否用 `Expanded` 包裹 2. 在 `_buildActionButtons` 中显式使用 `Expanded` 作为 Row 的直接子节点,分享按钮的 `AnimatedScale`/`AnimatedOpacity` 仅包裹按钮内容 3. 顺手为按钮文本添加 `Flexible` + `maxLines: 1` + `overflow: ellipsis` 防止长文本溢出 - **影响范围**:每日心情页面卡片展开后的分享按钮交互 #### 修改文件 - `lib/shared/widgets/charts/safe_chart_widget.dart` — 移除 deactivate 中的 setState - `lib/features/daily_fortune/presentation/daily_fortune_page.dart` — 重构 _buildActionButton,去除 Expanded 内嵌 *** ## [v6.20.8] - 2026-06-06 ### 🐛 Bug修复 — 每日心情卡片展开收起 + 图表disposed增强保护 #### 修复1:每日心情卡片展开后无法收起 + ParentDataWidget Expanded + Duplicate GlobalKeys - **根因**:`AnimatedCrossFade`/`AnimatedSize` 在动画期间同时保留新旧两个子 widget 树,导致:1) `Expanded` 的 `FlexParentData` 被应用到非 Flex 的 RenderObject;2) `flutter_animate` 的 `.animate()` 内部使用 GlobalKey,在 SliverList 回收重建时产生 Duplicate GlobalKeys - **修复**: 1. 移除 `AnimatedCrossFade`,改用直接条件渲染(`isExpanded ? expanded : collapsed`),从根本上避免两个子 widget 同时存在 2. 移除 `.animate()` 入场动画,消除 flutter_animate GlobalKey 冲突 3. 移除 `RepaintBoundary` 上的 `GlobalKey`,改用 `visitChildElements` 查找 `RenderRepaintBoundary` 实现分享截图 - **影响范围**:每日心情页面卡片展开/收起、分享截图功能 #### 修复2:数据管理页面返回后 RenderChartFadeTransition disposed 报错(增强保护) - **根因**:`SafeChartWidget` 的 `deactivate()` 仅设置 `_ready = false`,但未触发 `setState` 重建,导致 Syncfusion 图表 widget 在 unmount 阶段仍存在于 element tree 中 - **修复**:在 `deactivate()` 中增加 `setState(() {})` 调用,强制 element 在 unmount 前重建为占位符 - **影响范围**:所有使用 SafeChartWidget 的页面 #### 修改文件 - `lib/features/daily_fortune/presentation/daily_fortune_page.dart` — 移除 AnimatedCrossFade,改用条件渲染;移除 .animate();移除 GlobalKey - `lib/shared/widgets/charts/safe_chart_widget.dart` — deactivate 中增加 setState 强制重建 ======= ## [v6.20.8] - 2026-06-06 ### 🛡️ 后端API返回值类型安全修复 #### 问题 后端API返回的JSON数值字段可能是 `int`、`double` 或 `String` 类型,使用 `as int?` 强转会在遇到非int类型时抛出 TypeError,导致应用崩溃。 #### 修复规则 - `json['field'] as int? ?? 0` → `(json['field'] as num?)?.toInt() ?? 0` - `data['field'] as int? ?? 0` → `(data['field'] as num?)?.toInt() ?? 0` - `data?['field'] as int? ?? 0` → `(data?['field'] as num?)?.toInt() ?? 0` - `json['field'] as int?` (无默认值) → `(json['field'] as num?)?.toInt()` #### 修复范围(30+文件) - **auth/models/** — `user_model.dart` (UserModel/UserTitle/UserVerification/UserVip/UserCloudSpace/UserDevice/UserExtra) - **auth/services/** — `user_security_service.dart` (code/expireTime/expireSeconds/id字段) - **mine/user_center/models/** — `user_center_models.dart` (PublicProfileModel/InteractionRecord/HeatmapEntry/DashboardModel) - **mine/user_center/presentation/** — `public_profile_page.dart`, `learning_center_page.dart`, `learning_heatmap.dart` - **mine/user_center/providers/** — `coin_provider.dart`, `interaction_provider.dart`, `learning_progress_provider.dart`, `tag_cloud_provider.dart` - **mine/user_center/services/** — `user_center_service.dart`, `account_insights_service.dart` - **mine/achievement/** — `achievement_models.dart`, `badge_provider.dart`, `achievement_service.dart`, `achievement_page.dart`, `checkin_page.dart` - **mine/settings/** — `permission_management_page.dart` - **core/network/** — `api_interceptor.dart` - **core/services/** — `token_service.dart`, `permission_service.dart`, `settings_export_service.dart`, `feature_flag_service.dart`, `image_cache_metadata_service.dart`, `ip_location_service.dart` - **core/services/readlater/** — `readlater_device_sync_service.dart`, `readlater_collab_service.dart`, `readlater_sync_service.dart`, `safe_sharing_receiver.dart` - **discover/** — `hot_api_service.dart`, `rss_service.dart`, `tool_search_page.dart`, `tool_list_page.dart`, `china_colors_page.dart`, `ocr_tool_page.dart`, `readlater_folder_service.dart`, `chat_migration_service.dart`, `chat_message.dart`, `hot_item.dart`, `custom_translate_api.dart`, `hanzi_result.dart`, `chat_sentence_card_bubble.dart` - **file_transfer/** — `ws_p2p_service.dart`, `transfer_signaling_handler.dart`, `usb_transport_service.dart`, `webrtc_service.dart`, `ws_relay_service.dart`, `ws_relay_resume_handler.dart`, `ws_relay_chunk_assembler.dart`, `tcp_socket_service.dart`, `transfer_api_service.dart`, `transfer_task.dart`, `transfer_message.dart`, `transfer_device.dart`, `signaling_service.dart`, `ip_location_service.dart`, `ip_location_result.dart`, `voice_message_data.dart`, `cloud_cache_record.dart`, `offline_queue_item.dart`, `cloud_cache_service.dart`, `delivery_receipt_service.dart`, `localsend_dto.dart`, `canvas_document.dart`, `stroke.dart`, `qr_pairing_service.dart`, `file_transfer_device_actions.dart` - **home/providers/readlater/** — `readlater_provider.dart` #### 特殊处理 - `ip_location_result.dart` — 字段名 `num` 与Dart类型名冲突,改用 `_parseIntField()` 辅助方法 >>>>>>> Stashed changes *** ## [v6.20.7] - 2026-06-06 <<<<<<< Updated upstream ### 🐛 Bug修复 — 图表disposed全量修复 + 每日心情GlobalKey冲突 + 搜索页返回按钮 #### 修复1:全量替换 DeferredBuilder → SafeChartWidget,彻底解决 RenderChartFadeTransition disposed 报错 - **根因**:项目中9个文件(20处图表)仍使用保护不足的 `DeferredBuilder`,缺少 `_tearingDown` 标志。页面返回/切换时 Syncfusion 内部 `CustomLayoutBuilderElement.unmount` 触发已 disposed 的 `RenderChartFadeTransition.markNeedsLayout` - **修复**:将所有 `DeferredBuilder` 替换为 `SafeChartWidget`,其三重保护机制(延迟渲染 + RepaintBoundary + dispose前替换)可有效防止此类错误 - **影响范围**:数据管理、权限管理、成就中心、闲情逸致、翻译插件、稍后读统计、内容查重、收藏/积分/学习统计等9个页面的20处图表 #### 修复2:每日心情页面 GlobalKey 重复 + ParentDataWidget Expanded 报错 - **根因**:`RepaintBoundary` 使用 `GlobalKey`,在 `AnimatedSize` 展开/收起动画期间,旧 widget 尚未完全卸载而新 widget 已挂载,导致同一 GlobalKey 同时存在于两个 Column 中 - **修复**:移除 `RepaintBoundary` 上的 `GlobalKey`,改用 `visitChildElements` 遍历 element tree 查找 `RenderRepaintBoundary` 实现分享截图,从根本上避免 GlobalKey 冲突 - **影响范围**:每日心情页面卡片展开、分享截图功能 #### 修复3:搜索页面缺少返回按钮 - **根因**:搜索页面使用自定义搜索栏,只有"取消"文字按钮,没有返回箭头按钮,不符合 iOS 导航规范 - **修复**:在搜索栏左侧添加 `AdaptiveBackButton` 返回按钮 - **影响范围**:搜索页面导航 #### 修改文件 - `lib/features/mine/settings/presentation/data_management_page.dart` — DeferredBuilder → SafeChartWidget - `lib/features/mine/settings/presentation/privacy/permission_management_page.dart` — DeferredBuilder → SafeChartWidget - `lib/features/mine/achievement/presentation/achievement_page.dart` — DeferredBuilder → SafeChartWidget - `lib/features/tool_center/leisure/presentation/pages/leisure_settings_sections.dart` — DeferredBuilder → SafeChartWidget - `lib/features/mine/settings/presentation/plugin/translate_plugin_page.dart` — DeferredBuilder → SafeChartWidget - `lib/features/discover/presentation/pages/readlater_stats_page.dart` — DeferredBuilder → SafeChartWidget(6处) - `lib/features/check/presentation/check_page.dart` — DeferredBuilder → SafeChartWidget - `lib/features/tool_center/statistics/presentation/widgets/favorite_stats_tab.dart` — DeferredBuilder → SafeChartWidget(3处) - `lib/features/tool_center/statistics/presentation/widgets/coin_stats_tab.dart` — DeferredBuilder → SafeChartWidget(3处) - `lib/features/tool_center/statistics/presentation/widgets/learning_stats_tab.dart` — DeferredBuilder → SafeChartWidget(2处) - `lib/features/daily_fortune/presentation/daily_fortune_page.dart` — 移除 GlobalKey,改用 visitChildElements 查找 RepaintBoundary - `lib/features/search/presentation/search_page.dart` — 添加 AdaptiveBackButton ======= ### 🌐 UserCenter子组件国际化 & Catcher2弹窗优化 #### 问题1: UserCenter子组件硬编码中文 - `account_section.dart` — 5处硬编码中文(账户与数据/账户设置/离线模式/缓存管理/调试信息) - `profile_header_row.dart` — 12处硬编码中文(审核中/编辑/编辑资料/修改用户名/修改昵称/修改签名/修改头像/用文字点亮生活的每一刻等) - `edit_field_bottom_sheet.dart` — 9处硬编码中文(取消/修改xxx/保存/请输入xxx/成功/失败/好的/xxx修改成功/修改失败) - `public_profile_page.dart` — 40处硬编码中文(用户主页/返回/用户不存在/重试/匿名用户/积分/签到/文章/收藏/关注/私信/分享主页/屏蔽用户/个人简介/头衔等级/新手/学徒/熟练工/专家/大师/当前积分/活跃数据/签到x次/笔记x篇/点赞x次/评论x条/浏览x次/稍后读x等) #### 修复1 - **t_profile.dart** — 新增40个翻译键(accountAndData/editProfile/edit/editBio/save/pleaseInput/modifySuccess/modifyFailed/userProfile/goBack/userNotExist/retry/anonymousUser/articles/follow/followed/theUser/privateMessage/gotIt/shareProfile/blockUser/personalBio/titleLevel/currentPoints/activeData/beginner/apprentice/skilled/expert/master/signInCount/noteCount/likeCount/commentCount/viewCount/readLaterCount/modifyField/pleaseInputField/fieldModifySuccess/fieldModifyFailed/debugInfo/defaultBio) - **14种语言文件** — zh_cn/en/zh_tw/ja/ko/fr/de/es/it/pt/ru/ar/hi/bn 均已添加对应翻译 - **4个组件文件** — 全部替换硬编码中文为 `tp.xxx` 翻译键引用 #### 问题2: Catcher2溢出捕获弹窗优化 - 错误信息显示字数上限300太短,大部分错误信息被截断 - 复制确认弹窗显示冗余信息(错误ID) - 弹窗中文面向开发者不够通用 #### 修复2 - **显示字数上限** — 从300提升至2000,完整显示大部分错误信息 - **复制确认弹窗** — 简化为"已复制到剪贴板",移除错误ID显示 - **弹窗英文化** — '⚠️ 应用异常'→'App Error'、'📋 复制详情'→'Copy Details'、'忽略'→'Dismiss'、'确认'→'Confirm'、'好的'→'OK'、'时间:'→'Time:' #### 修改文件 - `lib/l10n/types/t_profile.dart` — 新增40个翻译键+toMap+fromMap - `lib/l10n/languages/zh_cn.dart` — 新增中文翻译 - `lib/l10n/languages/en.dart` — 新增英文翻译 - `lib/l10n/languages/zh_tw.dart` — 新增繁体中文翻译 - `lib/l10n/languages/ja.dart` / `ko.dart` / `fr.dart` / `de.dart` / `es.dart` / `it.dart` / `pt.dart` / `ru.dart` / `ar.dart` / `hi.dart` / `bn.dart` — 新增英文占位翻译 - `lib/features/mine/user_center/presentation/widgets/account_section.dart` — 5处硬编码→翻译键,新增tp参数 - `lib/features/mine/user_center/presentation/widgets/profile_header_row.dart` — 12处硬编码→翻译键,新增tp参数 - `lib/features/mine/user_center/presentation/widgets/edit_field_bottom_sheet.dart` — 9处硬编码→翻译键 - `lib/features/mine/user_center/presentation/public_profile_page.dart` — 40处硬编码→翻译键,新增tp参数 - `lib/features/mine/user_center/presentation/user_center_page.dart` — 更新组件调用传递tp参数 - `lib/core/services/catcher2_config_service.dart` — 字数上限300→2000、弹窗英文化、复制确认简化 >>>>>>> Stashed changes *** ## [v6.20.6] - 2026-06-06 <<<<<<< Updated upstream ### 🐛 Bug修复 — 日签卡片布局 + TiltController + Syncfusion图表 + 引导页路由 #### 修复1:日签卡片页面 ParentDataWidget 嵌套 Expanded 错误 - **根因**:`CardRenderer` 中4种样式(默认/大字报/中国风/毛玻璃)的内容区域方法返回 `Expanded > SingleChildScrollView`,而外层调用处已经用 `Expanded` 包裹,导致 `Expanded ← Expanded` 嵌套,两个 ParentDataWidget 竞争同一个 RenderObject - **修复**:移除内层 `Expanded`,让 `SingleChildScrollView` 直接作为外层 `Expanded` 的子组件 - **影响范围**:日签卡片页面4种卡片样式 #### 修复2:首页 TiltController 关闭后仍发送事件崩溃 - **根因**:`flutter_tilt` 包 4.0.2 的 `TiltController.emit()` 未检查 StreamController 是否已关闭。当 widget dispose 后仍有 pointer 事件到达时,向已关闭的 StreamController 写入导致 `Bad state: Cannot add new events after calling close` - **修复**:在所有 `Tilt`/`Tilt.base` 组件上设置 `enableGestureTouch: false`,仅保留视觉效果,规避包内部 bug - **影响范围**:首页日签卡片、日签卡片页面、文件传输设备卡片 #### 修复3:Syncfusion 图表 disposed RenderObject mutation 错误 - **根因**:Syncfusion 内部 `CustomLayoutBuilderElement.unmount` 在 element 卸载阶段调用 `updateCallback`,触发已 disposed 的 `RenderChartFadeTransition.markNeedsLayout` - **修复**:在 `SafeChartWidget` 和 `DeferredBuilder` 中增加 `deactivate()` 生命周期保护,在组件从树中移除时立即停止渲染图表 - **影响范围**:所有使用 Syncfusion 图表的页面(学习中心、成就、统计等) #### 修复4:关于页面点击"使用引导"GlobalKey 断言错误 - **根因**:GoRouter redirect 逻辑在引导页完成后拦截 `/onboarding` 路由并重定向到首页,导致 Navigator 栈异常触发 GlobalKey 保留断言 - **修复**:新增 `AppRoutes.onboardingReview`(带 `?review=true` 参数),redirect 逻辑对带此参数的请求放行;所有主动导航到引导页的入口改用新路由 - **影响范围**:关于页、通用设置页、更多设置页 #### 修改文件 - `lib/features/daily_card/presentation/widgets/card_renderer.dart` — 移除4处内层 Expanded - `lib/features/home/presentation/home_daily_card.dart` — Tilt 添加 enableGestureTouch: false - `lib/features/daily_card/presentation/daily_card_page.dart` — Tilt 添加 enableGestureTouch: false - `lib/features/file_transfer/presentation/widgets/device_card.dart` — Tilt 添加 enableGestureTouch: false - `lib/shared/widgets/charts/safe_chart_widget.dart` — 增加 deactivate 保护 - `lib/shared/widgets/containers/deferred_builder.dart` — 增加 deactivate 保护 - `lib/core/router/app_routes.dart` — 新增 onboardingReview 路由常量 - `lib/core/router/app_router.dart` — redirect 逻辑支持 review 参数放行 - `lib/features/mine/profile/presentation/about_page.dart` — 使用 onboardingReview - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 使用 onboardingReview - `lib/features/mine/settings/presentation/more_settings_page.dart` — 使用 onboardingReview ======= ### 🐛 安卓端长按桌面图标快捷方式闪退修复 #### 问题 安卓端长按桌面图标,点击弹出的快捷方式(主题个性化/通用设置),App直接卡死闪退。鸿蒙端和iOS端正常。 #### 根因 1. `quick_actions_android` 插件在冷启动时,`initialize()` 回调可能在 GoRouter 完全初始化之前被调用 2. 此时 `appRouter.push(route)` 执行时路由系统未就绪,抛出未捕获异常导致闪退 3. `_handleAction` 方法同步执行 `onAction!(route)`,无延迟和异常保护 #### 修复 - **`_handleAction` 添加延迟机制** — 使用 `Future.delayed(500ms)` 确保路由系统初始化完成后再执行导航 - **`_handleAction` 添加异常捕获** — `try-catch` 包裹 `onAction!` 调用,防止未捕获异常闪退 - **`app.dart` 回调添加 `addPostFrameCallback`** — 安卓端使用 `WidgetsBinding.instance.addPostFrameCallback` 确保首帧渲染完成后再导航 - **`app.dart` 回调添加异常保护** — 整个回调用 `try-catch` 包裹,双重保险 #### 修改文件 - `lib/core/services/device/quick_actions_service.dart` — `_handleAction` 延迟+异常捕获 - `lib/app/app.dart` — `_initQuickActions` 回调 addPostFrameCallback+异常保护 >>>>>>> Stashed changes *** ## [v6.20.5] - 2026-06-06 <<<<<<< Updated upstream ### 🐛 Bug修复 — 句子详情GlobalKey重复崩溃 + 进度美化LateInitializationError #### 修复1:句子详情面板GlobalKey重复导致iOS启动卡死崩溃 - **根因**:`detailCardKeyProvider` 是 Riverpod `Provider`,全局只创建一个 GlobalKey 实例。在 `StatefulShellRoute.indexedStack` + `KeepAlivePanelWrapper` 架构下,多个面板实例同时存活时共享同一个 GlobalKey,触发 "Multiple widgets used the same GlobalKey" 错误导致应用崩溃 - **修复**:移除 `detailCardKeyProvider` 全局 Provider,改为在 `SentenceDetailPanel` 的 State 中创建实例级 GlobalKey,通过参数传递给 `SentenceDetailContent` 和 `SentenceDetailActions` - **影响范围**:句子详情面板、截图分享功能、宽屏分屏布局 #### 修复2:进度美化页面 LateInitializationError - **根因**:`_args` 声明为 `late` 变量,在 `addPostFrameCallback` 中初始化,但 `build()` 在回调执行前被调用,访问未初始化的 `_args` 导致崩溃 - **修复**:将 `_args` 改为带默认值的普通变量,在 `didChangeDependencies()` 中首次初始化,避免 late 访问异常 - **影响范围**:进度美化页面 #### 修复3:objective_c FFI 加载失败(模拟器) - **根因**:`path_provider_foundation` 依赖的 `objective_c.framework` 构建缓存为 iOS 设备架构,模拟器需要 iOS-simulator 架构 - **修复**:`flutter clean` + 删除 Pods + 重新构建 - **影响范围**:iOS 模拟器上的路径获取、缓存操作 #### 修改文件 - `lib/features/home/presentation/panels/sentence_detail_provider.dart` — 移除 `detailCardKeyProvider` - `lib/features/home/presentation/panels/sentence_detail_panel.dart` — 新增实例级 `_cardKey`,传递给子组件 - `lib/features/home/presentation/panels/sentence_detail_content.dart` — 接收 `cardKey` 参数替代全局 Provider - `lib/features/home/presentation/panels/sentence_detail_actions.dart` — 接收 `cardKey` 参数替代全局 Provider - `lib/features/progress/presentation/progress_beautify_page.dart` — 修复 `_args` late 初始化错误 ======= ### 🐛 鸿蒙端多场景卡死修复 #### 问题 1. **SearchType.validateAll 逐条日志导致鸿蒙端IDE卡死** — 每个不支持的类型单独调用 `Log.w()`,产生大量日志输出(11条重复格式警告),在鸿蒙端debug模式下导致IDE卡死 2. **MissingPluginException 卡死** — `checkPendingManageStorage` 方法在鸿蒙端没有原生实现,调用时抛出 `MissingPluginException` 3. **个人中心页面卡死** — `_loadDashboard()` 静默吞掉异常;`_dashboardData?['score'] as int?` 后端返回String时抛TypeError;UserStatsBar中同样存在类型安全问题;debug日志在鸿蒙端加剧卡死 #### 修复 - **SearchType.validateAll 合并日志输出** — 将逐条 `Log.w()` 改为合并为单条日志输出,避免鸿蒙端debug模式IDE卡死 - **鸿蒙端跳过数据管理通道初始化** — `_initDataManagementChannel()` 在鸿蒙端直接 return,避免 `MissingPluginException` - **_loadDashboard() 异常日志** — `catch (_)` 改为 `catch (e, st)` 并调用 `Log.e()` 记录异常,便于排查 - **score 类型安全** — `_dashboardData?['score'] as int?` 改为 `(_dashboardData?['score'] as num?)?.toInt()`,兼容后端返回String/int/double - **UserStatsBar 类型安全** — 所有 dashboard 数据访问改为 `(data['key'] as num?)?.toInt() ?? defaultValue`,防止类型转换崩溃 - **删除 UserStatsBar debug 日志** — 移除每次构建时的 `Log.d()` 调用,减少鸿蒙端日志输出压力 #### 修改文件 - `lib/features/discover/models/search_type.dart` — validateAll 合并日志 - `lib/app/app.dart` — 鸿蒙端跳过数据管理通道 - `lib/features/mine/user_center/presentation/user_center_page.dart` — 异常日志 + score类型安全 - `lib/features/mine/user_center/presentation/widgets/user_stats_bar.dart` — 类型安全 + 删除debug日志 >>>>>>> Stashed changes *** ## [v6.20.4] - 2026-06-06 <<<<<<< Updated upstream ### 🐛 Bug修复 — 设备在线数量显示0 + 每日运势GlobalKey崩溃 #### 修复1:设备概览在线数量始终显示0 - **根因**:后端 `is_online` 字段5分钟无活动即置0,`isActiveRecently` 要求 `is_online==1` 且7天内活跃,导致所有设备均不满足条件,在线计数为0 - **修复**:`UserDevice` 新增 `getIsActiveByTime` 前端兜底getter,根据 `lastActiveTime` 判断7天内是否活跃 - **策略**:`DeviceState.onlineCount` 优先后端 `isActiveRecently`,后端全部返回0时用前端时间兜底 - **影响范围**:设备概览卡片、设备列表分组、当前在线计数 #### 修复2:每日运势页面GlobalKey重复导致崩溃 - **根因**:`_fortuneCardKey` 为单一 GlobalKey,展开/收起切换时旧卡片未卸载新卡片已挂载,同一 key 同时存在于两个 Column - **修复**:将单一 `_fortuneCardKey` 改为 `Map` 按日期索引,每个 FortuneRecord 拥有独立 GlobalKey - **影响范围**:运势卡片展开/收起、分享截图功能 #### 修改文件 - `lib/features/auth/models/user_model.dart` — 新增 `getIsActiveByTime` getter - `lib/features/mine/user_center/providers/device_provider.dart` — `onlineCount` 添加前端兜底 - `lib/features/mine/user_center/presentation/devices/device_overview_card.dart` — currentDevice 获取添加兜底 - `lib/features/mine/user_center/presentation/my_devices_page.dart` — 设备分组逻辑添加兜底 - `lib/features/daily_fortune/presentation/daily_fortune_page.dart` — GlobalKey 改为按日期索引的 Map ======= ### 🐛 引导页相关Bug修复 #### 修复 - **鸿蒙端/安卓端通用设置"重新打开引导页"无效** — 鸿蒙端 onboarding 路由未在 OHOS 路由注册表中注册,`appGo` 导航失败。改为鸿蒙端直接使用 `Navigator.push` 推送 `OnboardingPage`,安卓端保持原有路由导航 - **鸿蒙端杀后台重启后引导页重复弹出** — `OhosAppShell._checkOnboarding()` 未检查 `KvStorage.isReady`,Hive 未初始化完成时 `isFirstLaunch`/`shouldShowOnboarding` 默认返回 true,导致引导页每次都弹出。添加 `isReady` 检查,未就绪时延迟 300ms 重试 #### 修改文件 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — `_reopenOnboarding()` 增加鸿蒙端平台判断 - `lib/core/layout/ohos_app_shell.dart` — `_checkOnboarding()` 添加 `KvStorage.isReady` 检查 >>>>>>> Stashed changes *** ## [v6.20.3] - 2026-06-06 <<<<<<< Updated upstream ### 🧹 依赖清理 — 移除8个未使用的三方库 #### 移除的依赖 | 依赖名 | 原用途 | 移除原因 | |---|---|---| | `animations` | Material过渡动画 | lib/中0处导入 | | `animate_do` | 常用入场/出场动画 | lib/中0处导入 | | `value_layout_builder` | 值变化触发布局重建 | lib/中0处导入 | | `flutter_advanced_canvas_editor` | 高级画布编辑器 | lib/中0处导入 | | `flutter_blue_plus` | 蓝牙BLE通信 | lib/中0处导入(仅ohos端有) | | `http_cache_file_store` | Dio文件缓存存储 | lib/中0处导入/引用 | | `dartx` | 集合扩展方法 | lib/中0处导入(firstOrNull/lastOrNull已为Dart 3.0+内置) | | `vector_math` | 向量数学运算 | lib/中0处导入(Flutter传递依赖,无需显式声明) | #### 保留的边界依赖 - `json_annotation` — json_serializable代码生成需要 - `hive_ce` — hive_flutter传递依赖,显式声明做版本锁定 #### 文档更新 - `iOS_macOS_Developer_Guide.md` v9 — 删除差异对照表中 `flutter_blue_plus`/`flutter_nfc_kit` 过时条目 #### 修改文件 - `pubspec.yaml` — 移除7个未使用依赖 - `pubspec.ohos.yaml` — 移除8个未使用依赖(含flutter_blue_plus) - `pubspec.macos.yaml` — 移除7个未使用依赖 - `iOS_macOS_Developer_Guide.md` — 更新差异对照表和版本日志 ======= ### 🔧 鸿蒙端快捷方式修复 + 布局溢出弹窗静默处理 + 权限管理修复 + 注册弹窗多语言 + 日志精简 #### 修复 - **鸿蒙端桌面长按快捷方式不生效** — `module.json5` 中 metadata name 从 `ohos.shortcut.config` 修正为 `ohos.ability.shortcuts`(符合华为官方文档规范) - **shortcuts.json 缺少 moduleName** — 两个快捷方式的 wants 中补充 `moduleName: "entry"` 字段,确保鸿蒙系统能正确解析快捷方式目标 - **冷启动快捷方式不跳转** — `EntryAbility.ets` 的 `configureFlutterEngine` 末尾增加待处理快捷方式检查,冷启动时也能正确通知 Flutter 侧跳转 - **布局溢出错误弹窗干扰** — Catcher2 的 `_ConsoleLogHandler` 和 `CopyableDialogReportMode` 均增加 overflow/RenderFlex 错误过滤,溢出错误不再弹窗、不打印详情,静默处理 - **鸿蒙端权限管理页面点击相机无反应/定位卡死** — `isPlatformRelevant` 鸿蒙端过滤不支持的权限(location/storage);`checkStatus()` 和 `requestPermission()` 添加鸿蒙端超时保护(3秒/5秒) - **注册页面弹窗多语言** — `_showExperimentalFeatureDialog()` 和 `_showRegisterInfo()` 中7处硬编码中文替换为翻译键,14种语言文件同步更新 - **日志量精简** — `appLogger` printer 改为简洁模式(关闭颜色/emoji/调用栈);`LogCategory` 默认级别提高(ui/network/router/storage/device/search/provider/onboarding/general 从debug/info提高到warning,chart/haptic/push提高到error) #### 修改文件 - `ohos/entry/src/main/module.json5` — metadata name 修正 - `ohos/entry/src/main/resources/base/profile/shortcuts.json` — 补充 moduleName - `ohos/entry/src/main/ets/entryability/EntryAbility.ets` — 冷启动快捷方式通知 - `lib/core/services/catcher2_config_service.dart` — 布局溢出错误静默处理 - `lib/core/services/auth/permission_service.dart` — isPlatformRelevant 鸿蒙端过滤 + 超时保护 - `lib/features/auth/presentation/login_page.dart` — 注册弹窗多语言 - `lib/l10n/types/t_auth.dart` — 新增7个翻译键 - `lib/l10n/languages/*.dart` — 14种语言文件同步更新 - `lib/core/utils/logger.dart` — 日志精简 >>>>>>> Stashed changes *** ## [v6.20.2] - 2026-06-06 ### 📱 鸿蒙端占位页面体验优化 — 友好提示 + 功能介绍 #### 优化 - **占位页面全面重构** — 将5个鸿蒙端占位页面(协作画布/屏幕共享/传输聊天/快速卡片/编辑器子页面)从简陋的"暂不支持"提示升级为完整的功能介绍页面 - **统一占位页面风格** — 提取 `_OhosFeaturePlaceholder` 通用组件,统一emoji图标 + 功能名称 + 适配状态徽章 + 功能介绍 + 特性列表 + 返回按钮的布局 - **适配状态徽章** — 使用黄色圆点 + "该功能正在适配中" 替代原来的"鸿蒙端暂不支持XXX",语气更友好 - **功能介绍文案** — 每个占位页面增加功能描述和3-4条特性说明,让用户了解该功能的用途 - **编辑器子页面差异化** — 图片预览/图片裁剪/图片画廊/3D模型预览各自显示不同的emoji和功能介绍 - **OhosNotFoundWidget 升级** — 404页面同步升级为统一设计风格 - **使用设计系统令牌** — 所有占位页面使用 AppTheme/AppSpacing/AppTypography/AppRadius 统一设计令牌,支持深色模式 #### 鸿蒙端功能可行性分析 - **协作画布** — 依赖 flutter_webrtc(不支持鸿蒙),CRDT纯Dart可运行但无传输通道,保留占位 - **屏幕共享** — 依赖 flutter_webrtc + InAppScreenCapture(均不支持鸿蒙),保留占位 - **传输聊天** — Socket/WebSocket理论上可用,但文件传输依赖 nearby_service/localsend 等原生库不支持鸿蒙,保留占位 - **快速卡片** — 核心为纯Flutter组件,理论上可运行,但TTS/屏幕常亮/相册保存需降级处理,当前保留占位待验证 - **编辑器子页面** — 图片预览(photo_view)/画廊可能可用,裁剪(extended_image)/3D(flutter_3d_controller)需验证,保留占位 #### 修改文件 - `lib/core/router/ohos_placeholders.dart` — 全面重构占位页面,提取通用组件,增加功能介绍 *** ## [v6.20.1] - 2026-06-06 ### 🔧 跨平台编译修复 — Web/iOS/macOS三端编译通过 #### 修复 - **quill_native_bridge_windows 与 win32 6.x 不兼容** — 添加 `dependency_overrides` 指向本地修补版 `packages/quill_native_bridge_windows`(已适配win32 6.x API),解决macOS编译失败 - **nearby_service_adapter 条件导出** — 拆分为 `nearby_service_adapter_io.dart`(原生平台)+ `nearby_service_adapter_web.dart`(Web桩实现),解决Web编译时 `nearby_connections` 和 `dart:io` 不可用问题 - **oauth_service.dart 平台抽象** — `Platform.isIOS`/`Platform.isMacOS` 替换为 `pu.isIOS`/`pu.isMacOS`(项目平台抽象层),解决Web编译时 `dart:io` 不可用问题 - **缺失4个依赖包** — 在 `pubspec.yaml`/`pubspec.macos.yaml`/`pubspec.ohos.yaml` 中补充 `nearby_connections`/`flutter_web_auth`/`google_sign_in`/`sign_in_with_apple` #### 新增文件 - `lib/features/file_transfer/services/transport/nearby_service_adapter_io.dart` — 原生平台nearby_service适配器实现 - `lib/features/file_transfer/services/transport/nearby_service_adapter_web.dart` — Web平台桩实现(所有方法返回false/空) - `lib/features/file_transfer/services/transport/nearby_connections_web.dart` — Web平台nearby_connections类型桩 - `lib/features/file_transfer/services/transport/dart_io_stub.dart` — Web平台dart:io桩(备用) #### 编译结果 - ✅ Web: `build/web` 编译成功(341.5s) - ✅ iOS: `build/ios/iphoneos/Runner.app` (100.5MB) 编译成功 - ✅ macOS: `build/macos/Build/Products/Release/xianyan.app` (200.2MB) 编译成功 #### 修改文件 - `pubspec.yaml` — 补充4个依赖 + quill_native_bridge_windows path override - `pubspec.macos.yaml` — 同步补充4个依赖 + quill_native_bridge_windows path override - `pubspec.ohos.yaml` — 同步补充4个依赖 - `lib/features/file_transfer/services/transport/nearby_service_adapter.dart` — 改为条件导出 - `lib/features/auth/services/oauth_service.dart` — dart:io → 平台抽象层 *** ## [v6.20.0] - 2026-06-05 ### 📱 文件传输 — 集成nearby_connections实现P2P近场传输 #### 新增 - **nearby_connections P2P传输引擎** — 在NearbyServiceAdapter中集成Google Nearby Connections库,实现蓝牙发现+Wi-Fi Direct传输双引擎 - **附近设备发现入口** — 设备配对页面"其他"标签新增"📱 附近设备"卡片(仅Android/iOS显示) - **PairingMethod.nearbyP2p** — 新增配对方式枚举值,标识nearby_connections P2P连接 - **DegradationManager.nearbyP2p** — 新增平台能力检测,非Android/iOS平台自动降级提示 - **P2P传输进度流** — NearbyP2pTransferProgress类,实时跟踪文件传输进度 - **P2P设备发现流** — NearbyP2pDeviceInfo类,管理设备发现/连接/断开状态 - **14种语言翻译** — 新增nearbyDiscovery/nearbyDiscoveryDesc翻译键 #### 修复 - **NearbyConnections API调用修正** — `NearbyConnections()` → `Nearby()`(nearby_connections包的正确单例类名) - **PayloadStatus枚举修正** — `PayloadTransferUpdateStatus` → `PayloadStatus`,`COMPLETED` → `SUCCESS`(匹配包实际API) - **P2P权限请求修正** — 使用permission_handler替代不存在的Nearby权限方法,支持位置/蓝牙/附近Wi-Fi设备权限 - **startDiscovery参数修正** — 第一个参数为userNickName而非serviceId - **OnEndpointLost回调修正** — endpointId参数类型为`String?`(可空) - **requestConnection回调补全** — 添加必需的onConnectionInitiated/onConnectionResult/onDisconnected回调 - **Switch穷举补全** — device_discovery_provider/pairing_service中补充PairingMethod.nearbyP2p分支 #### 新增依赖 - `nearby_connections: ^4.1.1` — Google Nearby Connections(蓝牙发现+Wi-Fi Direct传输,仅Android/iOS) #### 修改文件 - `lib/features/file_transfer/services/transport/nearby_service_adapter.dart` — 双引擎架构(nearby_service + nearby_connections) - `lib/features/file_transfer/presentation/pages/device_pairing_page.dart` — 新增附近设备发现入口 - `lib/features/file_transfer/models/transfer_enums.dart` — 新增PairingMethod.nearbyP2p - `lib/features/file_transfer/services/degradation_manager.dart` — 新增nearbyP2p平台能力 - `lib/features/file_transfer/providers/device_discovery_provider.dart` — 补充nearbyP2p switch分支 - `lib/features/file_transfer/services/pairing_service.dart` — 补充nearbyP2p switch分支 - `lib/l10n/types/t_profile.dart` — 新增nearbyDiscovery/nearbyDiscoveryDesc字段 - `lib/l10n/languages/*.dart` — 14种语言文件新增翻译 - `pubspec.yaml` — 新增nearby_connections依赖 *** ## [v6.19.4] - 2026-06-05 ### 🔧 App Store审核修复 — 移除NFC/蓝牙/Web登录,修复注册流程 #### 审核被拒问题修复 1. **Guideline 2.1 — NFC功能需演示视频** → 移除全部NFC功能代码、权限声明和依赖(flutter_nfc_kit、ndef) 2. **Guideline 4 — 登录跳转外部浏览器** → 移除"Web登录"按钮(原跳转 `https://tools.wktyl.com/web-login` 至系统浏览器) 3. **Guideline 2.1(a) — 注册收不到验证码** → 修复注册流程:点击"下一步"进入验证码步骤时自动发送邮件验证码并启动倒计时,无需手动点击"重新发送" 4. **蓝牙功能移除** → 蓝牙仅用于设备发现(非数据传输),已有6种替代配对方式,同步移除全部蓝牙代码、权限声明和依赖(flutter_blue_plus) #### 新增 - 注册页面Header区域增加 ℹ️ 提示按钮,点击显示温馨提示对话框: - 闲言保持开放性,即使不登录也能体验大部分功能 - 服务器偶尔异常可能导致注册流程失败 - 我们会在后续更新中完善注册验证流程 #### 移除功能 - **NFC句子分享**(NfcShareService)— 删除服务、Provider、UI按钮 - **NFC设备配对**(NfcPairingService)— 删除服务、配对入口 - **蓝牙BLE配对**(BluetoothPairingService)— 删除服务、配对入口 - **附近用户发现**(NearbyDiscoveryService + NearbyUsersSheet)— 删除服务、UI - **Web登录**(跳转外部浏览器)— 删除登录页按钮和相关方法 #### 移除的权限声明 - iOS: NFCReaderUsageDescription、com.apple.developer.nfc.readersession.formats、NSBluetoothAlwaysUsageDescription - Android: NFC权限/特性、全部蓝牙权限(BLUETOOTH/BLUETOOTH_ADMIN/BLUETOOTH_SCAN/BLUETOOTH_CONNECT/BLUETOOTH_ADVERTISE/bluetooth_le) - HarmonyOS: ACCESS_BLUETOOTH权限、permission_nfc_reason、permission_bluetooth_reason #### 移除的依赖 - flutter_nfc_kit ^3.6.0 - ndef - flutter_blue_plus ^2.1.0 #### 修改文件(主要) - `lib/features/auth/presentation/register_section.dart` — 自动发送验证码 + 提示对话框 - `lib/features/auth/presentation/login_page.dart` — 移除Web登录按钮 - `lib/features/file_transfer/` — 移除NFC/蓝牙配对服务和UI - `lib/core/services/nfc/` — 整个目录删除 - `lib/core/services/bluetooth/` — 整个目录删除 - `lib/features/home/presentation/nearby_users_sheet.dart` — 删除 - iOS/Android/HarmonyOS 权限配置文件 — 移除NFC/蓝牙权限 - 14种语言文件 — 移除NFC/蓝牙翻译字符串 - 协议HTML文件 — 移除NFC/蓝牙权限说明(permission-usage V6.6、privacy-policy V6.7、app-introduction V6.6) ## [v6.19.3] - 2026-06-05 ### 📝 文档更新 — 移除NFC和蓝牙相关协议引用 #### 变更说明 因NFC和蓝牙功能已从应用中移除,同步更新所有协议HTML文件中的相关引用: 1. **permission-usage.html** — 移除"蓝牙权限"章节(原第五节),重新编号后续章节(附近设备权限→第五节,网络权限→第六节,权限管理原则→第七节,权限变更→第八节,联系方式→第九节,法律适用→第十节),版本号 V6.5 → V6.6 2. **privacy-policy.html** — 业务功能映射表中"文件传输助手"的权限从"蓝牙/位置/附近设备权限"更新为"位置/附近设备权限",版本号 V6.6 → V6.7 3. **app-introduction.html** — 文件传输助手功能列表移除"蓝牙传输",新增"二维码配对传输",更新日期 #### 未修改文件(无NFC/蓝牙引用) - beginner-guide.html、disclaimer.html、user-service-agreement.html、account-agreement.html、member-benefits.html、children-privacy.html、dev-team.html、index.html ## [v6.19.2] - 2026-06-05 ### 🐛 Bug修复 — macOS 编译运行关键问题修复 #### 修复问题 1. **Hive 初始化失败导致 KvStorage 全部降级** — 根因:`HiveSafeAccess` 使用 `hive_flutter` 的 `Hive.initFlutter()` 初始化,但用 `hive_ce` 的 `Hive.openBox()` 打开 Box,两个包的 Hive 单例不同,导致所有 Box 打开失败: - 统一所有代码使用 `hive_flutter` 包,替换全部 `hive_ce` 引用 - 涉及 8 个文件的 import 替换 2. **KvStorage 未初始化警告** — `GeneralSettingsNotifier.build()` 同步调用约 48 次 `KvStorage.getBool/getString/getInt`,当 Hive 初始化失败时产生大量警告: - 改为延迟加载模式(与 `ThemeSettingsNotifier` 一致),先返回默认值,再通过 `Future.microtask` 从存储加载 3. **macOS Release 构建签名失败** — `Release.entitlements` 中 `keychain-access-groups` 需要开发者证书签名: - 设置 `CODE_SIGN_IDENTITY = "-"` (ad-hoc 签名) - 移除 `keychain` 和 `keychain-access-groups` entitlements 4. **macOS Impeller 未启用** — `LiquidGlassLayer` 需要 Impeller 渲染引擎,macOS 默认使用 Skia: - 在 `Info.plist` 中添加 `FLTEnableImpeller = true` 启用 Impeller 5. **MissingPluginException: checkPendingManageStorage** — 数据管理 MethodChannel 仅鸿蒙平台实现: - `_initDataManagementChannel()` 添加 `!pu.isOhos` 判断,非鸿蒙平台跳过 6. **RenderFlex overflow 弹窗** — 布局溢出错误在 debug 模式下显示红色溢出指示器: - `main.dart` 中 `FlutterError.onError` 拦截 `overflowed` 错误,仅打印日志不弹窗 7. **platformVersionImpl 导出冲突** — `platform_io_stub.dart` 和 `platform_io_native.dart` 都导出了 `platformVersionImpl`: - 在 `utils.dart` 的 export hide 列表中添加 `platformVersionImpl` #### 修改文件 - `lib/core/storage/hive_safe_access.dart` — 统一使用 `hive_flutter`,移除 `hive_ce` 引用 - `lib/core/services/data/backup_service.dart` — import 替换 `hive_ce` → `hive_flutter` - `lib/features/discover/services/rss_service.dart` — import 替换 - `lib/core/services/error/crash_monitor.dart` — import 替换 - `lib/features/tool_center/leisure/providers/leisure_bookmark_provider.dart` — import 替换 - `lib/features/mine/settings/presentation/data_management_export_mixin.dart` — import 替换 - `lib/features/mine/settings/presentation/data_management_backup_mixin.dart` — import 替换 - `lib/features/discover/services/exchange_rate_service.dart` — import 替换 - `lib/core/storage/database/app_database.dart` — import 替换 - `lib/features/mine/settings/providers/general_settings_provider.dart` — 延迟加载模式 - `lib/main.dart` — FlutterError.onError 拦截 overflow 错误 - `lib/app/app.dart` — 数据管理通道添加平台判断 - `lib/core/utils/utils.dart` — 修复 platformVersionImpl 导出冲突 - `macos/Runner.xcodeproj/project.pbxproj` — CODE_SIGN_IDENTITY 设置 ad-hoc - `macos/Runner/Release.entitlements` — 移除 keychain 权限 - `macos/Runner/Info.plist` — 启用 Impeller ## [v6.19.1] - 2026-06-05 ### 🐛 Bug修复 — FontSyncService API返回数据类型解析错误 #### 修复问题 1. **FontSyncService 类型转换崩溃** — `fetchOnlineFonts()` 中 `result['data'] as List?` 抛出异常: - API `/api/font_sync/list` 返回 `data: {"fonts": [...], "count": N}`,`data` 是 `Map` 而非 `List` - 修复为兼容 Map 和 List 两种格式,优先从 `data.fonts` 取字体列表 - 修复前:iPad运行时抛出 `type '_Map' is not a subtype of type 'List?' in type cast`,导致字体同步失败回退到本地数据 #### 修改文件 - `lib/features/mine/settings/services/font_sync_service.dart` — 修复 `data` 字段类型解析逻辑 *** ## [v6.19.0] - 2026-06-05 ### 📋 结构化日志 — LogCategory 按模块控制日志级别 #### 新增功能 1. **LogCategory 枚举** — 在 `logger.dart` 中新增 `LogCategory` 枚举,支持 17 个模块分类: - UI、网络、路由、存储、设备、认证、传输、搜索、图表、触觉、状态、服务、同步、离线、引导、推送、通用 - 每个分类有独立的默认日志级别(如 chart/haptic 默认 warning 减少噪音) 2. **分类级别控制** — 支持动态调整每个分类的日志级别: - `LogCategory.setLevel()` 设置单个分类级别 - `LogCategory.setAllLevels()` 批量设置所有分类级别 - `LogCategory.resetLevels()` 重置为默认级别 - `LogCategory.exportCustomLevels()` / `importCustomLevels()` 支持持久化 3. **Log 方法扩展** — `Log.d/i/w/e/f` 方法新增可选 `LogCategory? category` 参数: - 向后兼容:不传 category 默认为 `LogCategory.general` - 日志输出自动添加分类标签(如 `[网络]`, `[路由]`) - 分类级别过滤:低于分类当前级别的日志不输出到控制台(仍记录到内存缓冲区) 4. **LogEntry 扩展** — `LogEntry` 新增 `category` 字段,支持按分类筛选 5. **日志查看器分类筛选** — 日志查看器页面新增分类过滤栏,支持按模块筛选日志 6. **日志级别设置页面** — 在通用设置"开发者"分组中新增"日志级别"入口: - 展示所有分类及其当前级别 - 点击分类弹出级别选择器 - 提供"全部Debug"和"重置默认"快捷操作 - 自定义级别标记"自定义"标签 #### 修改文件 - `lib/core/utils/logger.dart` — 添加 LogCategory 枚举、修改 Log 方法签名、LogEntry 添加 category - `lib/core/router/app_router.dart` — Log 调用添加 LogCategory.router - `lib/core/router/ohos_nav_bridge.dart` — Log 调用添加 LogCategory.router - `lib/core/router/ohos_route_types.dart` — Log 调用添加 LogCategory.router/auth - `lib/core/services/device/haptic_service.dart` — Log 调用添加 LogCategory.haptic - `lib/core/services/device/device_info_service.dart` — Log 调用添加 LogCategory.device/network - `lib/features/home/providers/home_provider.dart` — Log 调用添加 LogCategory.provider - `lib/features/file_transfer/providers/transfer_notifier.dart` — Log 调用添加 LogCategory.transfer - `lib/main.dart` — Log 调用添加对应分类(general/storage/haptic/ui/device/router/service/network/onboarding) - `lib/features/mine/settings/presentation/general/general_settings_sections.dart` — 添加"开发者"分组 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 添加 log_level 导航处理 - `lib/features/mine/settings/presentation/general/log_level_settings_page.dart` — 新建,日志级别设置页面 - `lib/features/mine/settings/presentation/privacy/log_viewer_page.dart` — 添加分类过滤栏和分类标签显示 *** ## [v6.18.0] - 2026-06-05 ### ♿ 无障碍适配 — VoiceOver/TalkBack 支持 #### 新增功能 1. **无障碍服务** — 创建 `AccessibilityService` 单例,管理系统无障碍状态检测、语义调试开关、语义标注辅助方法 2. **通用设置-无障碍分组** — 在通用设置页面"显示"分组后新增"♿ 无障碍"分组,包含: - 语义调试开关(开发者选项,可手动切换) - 高对比度指示(跟随系统,只读) - 减少动画指示(跟随系统,只读) - 粗体文本指示(跟随系统,只读) 3. **关键页面Semantics标注** — 为以下组件添加 `Semantics(label/hint/value)` 标注,支持 iOS VoiceOver 和鸿蒙 TalkBack: - 首页句子卡片(`SentenceCard`)— 朗读句子内容、作者、互动状态 - 排行榜项卡片(`RankItemCard`)— 朗读排名、用户名、等级、数值 - 日签卡片页面(`DailyCardPage`)— 朗读日签内容,保存/分享按钮标注 4. **App初始化集成** — `app.dart` 中初始化 AccessibilityService,build 时同步系统无障碍状态 #### 修改文件 - `lib/core/services/accessibility/accessibility_service.dart` — 新建,无障碍服务 - `lib/core/services/accessibility/accessibility_export.dart` — 新建,导出文件 - `lib/features/mine/settings/providers/default_settings.dart` — 添加 `semanticsDebugEnabled` 默认值 - `lib/features/mine/settings/providers/sub/general_fields_provider.dart` — 添加 `semanticsDebugEnabled` 字段及持久化 - `lib/features/mine/settings/providers/general_settings_provider.dart` — 添加 getter/setter - `lib/features/mine/settings/presentation/general/general_settings_sections.dart` — 添加无障碍分组 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 处理语义调试开关事件 - `lib/features/home/presentation/home_sentence_card.dart` — 添加 Semantics 标注 - `lib/shared/widgets/cards/rank_item_card.dart` — 添加 Semantics 标注 - `lib/features/daily_card/presentation/daily_card_page.dart` — 添加 Semantics 标注 - `lib/app/app.dart` — 初始化 AccessibilityService + build 时同步状态 *** ## [v6.18.0] - 2026-06-05 ### 🏗️ 架构增强 — 5项核心重构 #### 1. PlatformCapability 接口抽象 - 新增 `lib/core/utils/platform/platform_capability.dart` — 平台能力注册表 - 定义 19 项能力键(localAuth/flutterVibrate/nfcShare/quickActions/homeWidget/backdropFilter/liquidGlass/heavyAnimation/pushNotification/filesystem/usbTransfer/bluetoothDiscovery/shareSheet/fileExport/gpu3d/gallerySave/webView3d/localNotification/calendar) - `PlatformCapabilities.init()` 在 app 启动时根据平台注册能力 - `supports(key)` 查询 + `fallbackDescription(key)` 降级说明 - 重构 11 个文件:my_devices_page/haptic_service/nfc_share_service/quick_actions_service/local_notification_service/notification_init_stub/glass_container/account_insights_sheet/home_widget_service/widget_provider/plugin_update_service #### 2. LogCategory 结构化日志 - 新增 `LogCategory` 枚举,17 个模块分类(ui/network/router/storage/device/auth/transfer/search/chart/haptic/provider/service/sync/offline/onboarding/push/general) - 每个分类独立日志级别,chart/haptic 默认 warning 减少噪音 - `Log.d/i/w/e/f` 新增可选 `category` 参数,完全向后兼容 - 日志输出自动添加分类标签(如 `[网络]`、`[路由]`) - 新增 `lib/features/mine/settings/presentation/log_level_settings_page.dart` — 日志级别配置页面 - 通用设置"开发者"分组新增"日志级别"入口 - 日志查看器新增分类筛选栏 #### 3. SafeChartWidget 封装 - 新增 `lib/shared/widgets/charts/safe_chart_widget.dart` — 安全图表包装组件 - `_disposed` + `_ready` 双标志位保护 + RepaintBoundary 隔离重绘 - 替换 10 个图表页面的 DeferredBuilder → SafeChartWidget(learning_center/coin_log/learning_progress/transfer_stats/statistics/history/favorite/trend_chart/transfer_speed_chart/learning_charts) #### 4. WebSocket P2P 文件传输 - 新增 `lib/features/file_transfer/services/transport/ws_p2p_service.dart` — WebSocket P2P 直连服务 - 服务端/客户端双模式、分块传输、心跳保活、自动重连 - `TransportType` 新增 `wsP2p`,同局域网优先推荐 P2P(confidence 0.93) - 配对码页面新增 P2P 状态指示区域 #### 5. 无障碍适配 - 新增 `lib/core/services/accessibility/accessibility_service.dart` — 无障碍服务 - 通用设置新增"♿ 无障碍"分组(语义调试开关 + 系统状态指示) - 关键组件添加 Semantics 标注:句子卡片/排行榜项/日签卡片 - App 初始化时恢复语义调试状态 *** ## [v6.17.0] - 2026-06-05 ### 🔧 多平台问题批量修复 — 鸿蒙端 + Web端 + 通用问题 #### 鸿蒙端修复 1. **1.1 工具中心部分页面显示"不支持此页面"** — 为缺少ohosBuilder的路由添加鸿蒙端页面构建器 2. **1.2 长按桌面图标无快捷按钮** — module.json5添加shortcuts配置(主题个性化+通用设置) 3. **1.3 我的设备下线/移除报错"验证未通过"** — 鸿蒙端跳过LocalAuthentication生物识别,直接弹确认对话框 4. **1.7 账户洞察鸿蒙端设备识别异常提示** — 鸿蒙端显示"部分设备可能会出现识别异常"蓝色提示条 5. **1.9 HapticService降级警告** — 鸿蒙端直接跳过flutter_vibrate检测,日志降级为debug级别 6. **1.11 鸿蒙端设备显示"未知设备"** — 增加manufacturer/hardware/device字段回退链,Web端精确识别浏览器 #### 通用修复 7. **1.5 句子详情外部搜索内容为空** — 使用_resolveDisplayText()获取最合适的搜索文本 8. **1.8 重新打开引导页没反应** — 先重置onboarding完成状态再导航 9. **1.10/1.12 RenderChartFadeTransition disposed错误** — DeferredBuilder添加disposed标志+图表页面mounted检查 10. **2 工具中心搜索类型不支持** — 更新搜索类型映射与API一致 11. **2.1 预置词搜索** — ToolListPage/ToolSearchPage/HanziToolPage添加热门搜索标签 12. **3 文章广场点击文章不显示内容** — 清除旧数据+完善错误状态展示 13. **4 RenderFlex overflow弹窗改为日志** — overflow错误仅记录Log.w不传递给原始处理器 14. **6 引导页完成按钮loading优化** — loading状态动态切换文字(正在准备/加载/初始化/即将完成) 15. **7 日签卡片保存分享按钮移到appbar** — 保存分享移到navigationBar trailing 16. **8 文件传输配对码页面缺少Appbar** — 替换为始终可见的返回按钮 17. **9 减少不必要的日志打印** — 缓冲区减半+Log.i节流5秒+路由日志降级 18. **10 排行榜隐私保护** — 所有排行类型<50人时显示隐私提示,序号用*代替 19. **11 离线模式/收藏页面重复图标** — 移除dialog重复icon+修复双emoji问题 #### Web端修复 20. **5.1 引导页协议链接不跳转** — 使用rootNavigator确保跨ShellRoute导航 21. **5.2 Web端浏览器精确识别** — 基于WebBrowserInfo识别Chrome/Edge/Safari/QQ浏览器等 #### 修改文件 - `ohos/entry/src/main/module.json5` — shortcuts配置 - `lib/core/services/device/device_info_service.dart` — 鸿蒙设备回退+Web浏览器识别 - `lib/core/services/device/haptic_service.dart` — 鸿蒙端跳过flutter_vibrate - `lib/core/services/error/global_error_handler.dart` — overflow静默处理 - `lib/core/utils/logger.dart` — 缓冲区减半+节流机制 - `lib/core/layout/app_shell.dart` — 移除高频日志 - `lib/core/router/app_router.dart` — 日志降级 - `lib/core/router/route_registry.dart` — ohosBuilder+预置词传递 - `lib/core/router/ohos_placeholders.dart` — 预置词传递 - `lib/features/mine/user_center/presentation/my_devices_page.dart` — 鸿蒙端跳过生物识别 - `lib/features/mine/user_center/presentation/widgets/account_insights_sheet.dart` — 鸿蒙端提示 - `lib/features/mine/settings/presentation/general/general_settings_page.dart` — 引导页重开修复 - `lib/features/home/presentation/providers/sentence_detail_sheet.dart` — 外部搜索修复 - `lib/features/home/presentation/providers/offline_page.dart` — 移除重复icon - `lib/features/home/presentation/favorite_page.dart` — 修复双emoji+disposed保护 - `lib/features/onboarding/presentation/pages/welcome_page.dart` — Web端协议链接修复 - `lib/features/onboarding/presentation/pages/personalization_page.dart` — loading动态文字 - `lib/features/daily_card/presentation/daily_card_page.dart` — 保存分享移到appbar - `lib/features/file_transfer/presentation/pages/device_pairing_page.dart` — 返回按钮修复 - `lib/features/article/presentation/article_detail_page.dart` — 文章内容显示修复 - `lib/features/article/providers/article_provider.dart` — 清除旧数据 - `lib/features/rank/presentation/rank_page.dart` — 隐私保护逻辑 - `lib/shared/widgets/containers/deferred_builder.dart` — disposed保护 - `lib/l10n/types/t_account_insights.dart` + 14个语言文件 — 鸿蒙端提示翻译 *** ## [v6.16.9] - 2026-06-05 ### 🔧 工具中心三合一修复 — 鸿蒙端路由 + 搜索类型 + 预置词搜索 #### 问题 1. **鸿蒙端工具中心部分页面显示"不支持此页面"** — `hanzi-tool`、`calc-tool`、`tool-list` 三个关键路由缺少 `ohosBuilder`,导致 OhosNavBridge 无法匹配路由,显示"鸿蒙端暂不支持此页面" 2. **搜索类型不支持** — `SearchType.changshi` 的值为 `'cs'`(对应 searchall 接口),但 hanzi/search 接口实际支持 `changshi` 类型,导致搜索返回"不支持的搜索类型" 3. **缺少预置词搜索** — 工具中心页面无热门搜索词引导,用户需要手动输入关键词,体验不佳 #### 修复 - **鸿蒙端路由** — 为 `hanzi-tool`、`calc-tool`、`tool-list` 三个路由添加 `ohosBuilder`,新增 `/tool/nick` 路由 - **搜索类型映射** — `changshi` 从 `SearchApiType.searchAll`/`'cs'` 改为 `SearchApiType.hanziSearch`/`'changshi'`;新增 `cs` 枚举值保留 searchall 接口;新增 25 个 searchall 独有类型 - **预置词搜索** — `ToolNavConfig` 新增 `presetKeywords` 字段;所有工具配置预置词;`HanziToolConfig` 新增 `presetKeywords`;`ToolListPage`/`ToolSearchPage`/`HanziToolPage` 添加热门搜索标签UI #### 修改文件 - `lib/core/router/route_registry.dart` — tool-list builder 传递 presetKeywords - `lib/core/router/ohos_placeholders.dart` — buildToolListOhosWidget/buildNickToolOhosWidget 传递 presetKeywords - `lib/core/router/app_routes.dart` — 新增 nickTool 路由常量 - `lib/features/discover/models/search_type.dart` — changshi 改用 hanziSearch,新增 searchall 独有类型 - `lib/features/discover/models/tool_item.dart` — ToolNavConfig 新增 presetKeywords,所有工具配置预置词 - `lib/features/discover/presentation/pages/tool_list_page.dart` — 新增 presetKeywords 属性和热门搜索标签UI - `lib/features/discover/presentation/pages/tool_search_page.dart` — 新增 presetKeywords 属性和热门搜索标签UI - `lib/features/discover/presentation/pages/tool/hanzi_tool_page.dart` — HanziToolConfig 新增 presetKeywords,_buildQuickActions 使用配置预置词 - `lib/features/discover/presentation/widgets/tool/tool_navigation_helper.dart` — 传递 presetKeywords 给 HanziToolConfig 和 listExtra *** ## [v6.16.9] - 2026-06-05 ### 🔧 Windows构建修复 — sqlite3预编译DLL + win32离线构建回退 #### 问题 1. **sqlite3_flutter_libs无法从sqlite.org下载** — CMake构建时尝试从sqlite.org下载SQLite源码,因网络不可达导致构建失败 2. **win32包无法从GitHub下载预编译DLL** — native assets构建钩子尝试从`github.com/halildurmus/win32`下载`win32_windows_x64.dll`,因网络限制导致`SocketException`,整个构建失败 #### 修复 - **sqlite3预编译DLL** — 修改`sqlite3_flutter_libs`的CMakeLists.txt,使用本地预编译的`sqlite3.dll`和`sqlite3.lib`(来自NuGet包`SQLite.Native`),跳过源码下载和编译 - **win32离线构建回退** — 修改`win32`包的`build.dart`钩子,在下载失败时自动回退到本地C编译构建,而非直接抛出异常 #### 举一反三 - 所有依赖外部网络下载的构建步骤都应有离线回退方案 - 预编译二进制文件应优先使用本地缓存或镜像源 - Flutter native assets构建钩子应处理网络异常,提供本地构建备选 **修改文件:** - `packages/win32/hook/build.dart` — 添加try-catch回退到本地C构建 - `E:\cache\pub\hosted\pub.flutter-io.cn\sqlite3_flutter_libs-0.5.42\windows\CMakeLists.txt` — 使用预编译sqlite3.dll *** ## [v6.16.8] - 2026-06-05 ### 🛡️ main()初始化异常捕获修复 #### 问题 - **`_appMain()`未捕获异常** — `_appMain()`是返回`Future`的异步函数,在`main()`中直接调用未await也未捕获异常。若初始化过程中发生未处理的异步异常(如windowManager初始化失败、Catcher2配置异常等),会导致顶层未处理的Future异常,整个应用崩溃且无日志记录。 #### 修复 - **catchError兜底** — 在`main()`中为`_appMain()`调用添加`.catchError()`,捕获所有未处理的异步异常并记录日志,防止静默崩溃 #### 举一反三 - 所有异步入口函数调用必须处理Future异常(catchError或try-catch) - 即使内部各步骤已有try-catch,顶层仍需兜底保护,防止遗漏 **修改文件:** `lib/main.dart` *** ## [v6.16.7] - 2026-06-05 ### 🌐 Web端编译+运行修复 — Platform兼容+Zone mismatch+path_provider保护 #### 问题 1. **`Platform._operatingSystem` 不支持** — Web端 `dart:io` 的 `Platform` 类不可用,多个文件直接使用 `Platform.isAndroid`/`Platform.isIOS` 等导致运行时 `Unsupported operation` 异常 2. **`path_provider` MissingPluginException** — Web端 `getApplicationSupportDirectory()`/`getTemporaryDirectory()` 等无原生实现,多个文件直接调用导致异常 3. **Catcher2 Zone mismatch** — `main()` 中 `runZonedGuarded` 与 Catcher2 内部 `runZonedGuarded` 嵌套导致 Zone 不一致警告 4. **Catcher2 navigator key 缺失** — `Catcher2` 构造时未传入 `navigatorKey`,导致对话框报告模式无法使用 #### 修复 - **Platform.xxx → pu.xxx** — 将30+个文件中的 `Platform.isAndroid/isIOS/isMacOS/isWindows/isLinux/pathSeparator/operatingSystem` 替换为 `pu.isAndroid/isIOS/...` 抽象,Web端自动使用 stub 实现 - **kIsWeb 保护** — 为20+个文件添加 `if (kIsWeb) return/throw` 保护,防止 Web 端调用 `path_provider` 和 `dart:io` API - **Zone mismatch** — 移除 `main()` 中的外层 `runZonedGuarded`,由 Catcher2 内部统一管理 zone - **Catcher2 navigatorKey** — 传入 `rootNavigatorKey`,修复对话框报告模式 - **platformVersion** — 新增 `pu.platformVersion` 抽象(`permission_service.dart` 需要) #### 举一反三 - 所有 `Platform.xxx` 调用必须通过 `platform_utils.dart` 的 `pu.xxx` 抽象,禁止直接使用 `dart:io` 的 `Platform` - 所有 `path_provider` 调用必须添加 `kIsWeb` 保护 - `Platform.pathSeparator` 统一替换为 `'/'`(Dart 在所有平台都支持正斜杠) - Catcher2 与 `runZonedGuarded` 不可嵌套使用 **修改文件(30+):** - `lib/main.dart` — 移除外层 runZonedGuarded - `lib/core/services/catcher2_config_service.dart` — 添加 navigatorKey - `lib/core/services/device/device_info_service.dart` — Platform → pu - `lib/core/utils/platform/ohos_compatibility_helper.dart` — kIsWeb 保护 - `lib/core/utils/platform/platform_io_native.dart` — 新增 platformVersionImpl - `lib/core/utils/platform/platform_io_stub.dart` — 新增 platformVersionImpl - `lib/core/utils/platform/platform_utils.dart` — 新增 platformVersion - `lib/core/services/crash_log_service.dart` — kIsWeb 保护 - `lib/core/storage/hive_safe_access.dart` — kIsWeb 保护 - `lib/core/utils/logger.dart` — kIsWeb 保护 - `lib/core/services/data/backup_service.dart` — kIsWeb 保护 - `lib/core/services/data/settings_export_service.dart` — kIsWeb 保护 - `lib/core/services/data/image_cache_metadata_service.dart` — kIsWeb 保护 - `lib/core/network/api_client.dart` — kIsWeb 保护 - `lib/shared/widgets/display/appbar_date_display.dart` — Platform → pu - `lib/features/home/presentation/date_config_sheet.dart` — Platform → pu - `lib/core/services/notification/notification_service.dart` — Platform → pu - `lib/core/services/notification/local_notification_service.dart` — Platform → pu - `lib/features/home/presentation/home_sentence_card.dart` — kIsWeb 保护 - `lib/features/onboarding/presentation/widgets/mesh_gradient_background.dart` — Platform → pu - `lib/core/services/auth/permission_service.dart` — Platform → pu - `lib/shared/widgets/media/safe_cached_image.dart` — kIsWeb 保护 - `lib/features/home/services/cache_service.dart` — pathSeparator → '/' - `lib/shared/widgets/feedback/share_sheet.dart` — Platform → pu - `lib/features/tool_center/leisure/presentation/widgets/leisure_share_sheet.dart` — Platform → pu - `lib/features/mine/settings/presentation/image_cache_grid.dart` — pathSeparator → '/' - `lib/features/mine/settings/presentation/image_cache_detail_page.dart` — pathSeparator → '/' - `lib/features/mine/settings/services/font_download_service.dart` — pathSeparator → '/' - `lib/features/mine/settings/presentation/font_management_notifier.dart` — pathSeparator → '/' - `lib/core/services/readlater/sharing_receiver_service.dart` — pathSeparator → '/' - 以及其他10+个文件的 kIsWeb 保护 *** ## [v6.16.6] - 2026-06-05 ### 🖥️ Windows端编译+运行修复 — 登录闪退+编译错误+平台兼容 #### 问题 1. **登录闪退** — Windows端输入账户密码后点击登录,应用崩溃闪退 - 根因:`FlutterSecureStorageWindows.write()` 中 `_backwardCompatible.delete()` 未 await,在 Windows 上 `MethodChannelFlutterSecureStorage` 未注册原生实现,抛出 `MissingPluginException` 成为未处理异步异常 - 次因:`SecureStorage` 缺少 Windows 降级方案(macOS 有 SharedPreferences 替代,Windows 没有) 2. **编译错误** — 多个文件使用 `kIsWeb` 但未导入 `package:flutter/foundation.dart` 3. **语法错误** — `more_settings_page.dart` 工厂重置方法中多余 `}` 导致 try-catch 结构破坏 4. **平台兼容** — `Platform.isAndroid` 在 `progress_share_card.dart` 中未通过 `pu` 封装使用 5. **桌面端兼容** — `QuickActionsService` 在桌面端调用移动端 API 6. **设备注册** — `AuthNotifier.login()` 中 `registerDeviceIfNeeded()` 未 await,异常无法捕获 #### 修复 - **FlutterSecureStorageWindows** — `write()` 中 `_backwardCompatible.delete()` 添加 await + try-catch - **SecureStorage** — Windows 与 macOS 统一使用 SharedPreferences 降级方案(`_useSharedPreferences`) - **AuthNotifier** — `registerDeviceIfNeeded()` 添加 await + try-catch(login 和 register 两处) - **QuickActionsService** — 桌面端跳过初始化(`if (pu.isDesktop) return`) - **progress_share_card.dart** — `Platform.isAndroid/IOS` → `pu.isAndroid/isIOS` - **more_settings_page.dart** — 修复多余 `}` 导致的 try-catch 结构错误 - **6个文件** — 添加 `import 'package:flutter/foundation.dart'` 修复 `kIsWeb` 未定义: - `general_settings_provider.dart` - `general_fields_provider.dart` - `chat_file_service.dart` - `data_export_service.dart` - `chat_audio_service.dart` - `readlater_device_sync_service.dart` **修改文件:** - `packages/flutter_secure_storage_windows/lib/src/flutter_secure_storage_windows_ffi.dart` - `lib/core/storage/secure_storage.dart` - `lib/features/auth/providers/auth_provider.dart` - `lib/core/services/device/quick_actions_service.dart` - `lib/features/progress/presentation/progress_share_card.dart` - `lib/features/mine/settings/presentation/more_settings_page.dart` - `lib/features/mine/settings/providers/general_settings_provider.dart` - `lib/features/mine/settings/providers/sub/general_fields_provider.dart` - `lib/features/discover/services/chat_file_service.dart` - `lib/core/services/data/data_export_service.dart` - `lib/features/discover/services/chat_audio_service.dart` - `lib/core/services/readlater/readlater_device_sync_service.dart` *** ## [v6.16.5] - 2026-06-05 ### 🌐 Web平台兼容性修复 — kIsWeb守卫保护文件系统操作 #### 问题 多个服务文件直接使用 `dart:io` 的 `File`/`Directory` 和 `path_provider` 的 `getTemporaryDirectory()` 等API, 在Web平台运行时会抛出 `MissingPluginException` 或编译错误,导致应用崩溃。 #### 修复 为所有涉及文件系统操作的公共方法添加 `kIsWeb` / `pu.isWeb` 早期守卫: - **logger.dart** — `exportToFile()` 添加 `if (kIsWeb) throw UnsupportedError(...)`;`shareLogs()` 添加 `if (kIsWeb) return;` - **backup_service.dart** — `getBackupList()` 返回空列表;`performBackup()` 抛出 UnsupportedError;`deleteBackup()` 返回 false;`deleteAllBackups()` / `getTotalBackupSize()` 早期返回 - **settings_export_service.dart** — `shareSettings()` 添加 `if (kIsWeb) return;`;`_writeTempFile()` 抛出 UnsupportedError - **image_cache_metadata_service.dart** — `indexFile()` / `indexFromCacheManager()` / `autoCleanExpired()` / `rebuildIndex()` 均添加 `if (kIsWeb) return;` - **api_client.dart** — `createFormData()` 添加 `if (kIsWeb) throw UnsupportedError(...)` #### 修复原则 - 所有 `getTemporaryDirectory()`、`getApplicationDocumentsDirectory()`、`getApplicationSupportDirectory()`、`getLibraryDirectory()` 调用前,均需 `if (kIsWeb)` 保护 - 保留 `import 'dart:io';` 因为非Web端仍需要 - 添加 `import 'package:flutter/foundation.dart' show kIsWeb;` **修改文件:** - `lib/core/utils/logger.dart` - `lib/core/services/data/backup_service.dart` - `lib/core/services/data/settings_export_service.dart` - `lib/core/services/data/image_cache_metadata_service.dart` - `lib/core/network/api_client.dart` *** ## [v6.16.4] - 2026-06-04 ### 🐛 鸿蒙端编译修复 — Form小组件不兼容API清理 #### 问题 鸿蒙端 `flutter build hap` 编译失败,81个错误,根因: 1. **Form小组件使用了不支持的API** — `bindContextMenu`、`MenuItem`、`Placement`、`onLongPress`、`vibrator` 在鸿蒙Form(卡片)环境中不可用 2. **缺少图标资源** — `ic_refresh`、`ic_copy`、`ic_open_app`、`ic_save`、`ic_share`、`ic_check`、`ic_open` 在 `ohos/entry/src/main/resources/base/media/` 中不存在 #### 修复 - **移除6个Form页面不兼容API** — SolarTermFormPage、CheckinFormPage、DailySentenceFormPage、ReadlaterFormPage、DailyCardFormPage、FortuneFormPage - 移除 `@Builder MenuBuilder()` + `MenuItem`(Form不支持菜单组件) - 移除 `.bindContextMenu()`(Form不支持上下文菜单) - 移除 `.onLongPress()` + `vibrator.vibrate()`(Form不支持长按和震动) - 移除 `pasteboard.setData()` / `promptAction.showToast()`(Form不支持剪贴板和Toast) - 保留 `.onClick()` + `postCardAction()` 跳转主APP功能 - **添加7个占位图标资源** — 复制 `icon.png` 作为占位,避免资源引用缺失错误 #### 举一反三 - 鸿蒙Form(卡片)有严格API限制,仅支持基础UI组件和 `postCardAction` 交互 - 任何需要复杂交互(菜单、长按、震动、剪贴板)的操作应通过 `postCardAction` 跳转到主APP执行 - Form页面的功能操作应通过 `router` / `call` / `message` 三种 `postCardAction` 类型实现 **修改文件:** - `ohos/entry/src/main/ets/formability/pages/SolarTermFormPage.ets` - `ohos/entry/src/main/ets/formability/pages/CheckinFormPage.ets` - `ohos/entry/src/main/ets/formability/pages/DailySentenceFormPage.ets` - `ohos/entry/src/main/ets/formability/pages/ReadlaterFormPage.ets` - `ohos/entry/src/main/ets/formability/pages/DailyCardFormPage.ets` - `ohos/entry/src/main/ets/formability/pages/FortuneFormPage.ets` - `ohos/entry/src/main/resources/base/media/` (7个图标资源) *** ## [v6.16.3] - 2026-06-04 ### 🛡️ 系统性稳定性加固与审计修复(v6.16.0 ~ v6.16.3 合并) #### 审计修复 — 5类系统性风险26处加固 基于验收审计发现的87个潜在问题,优先修复26处高危问题: - **gal插件ArgumentError捕获**(5处)— iOS模拟器objective_c库异常时降级为友好提示 - **path_provider异常降级**(8处)— 失败时降级使用`Directory.systemTemp` - **Hive.openBox ArgumentError捕获**(2处)— 降级打开fallback box - **addPostFrameCallback mounted检查**(6处)— 回调开头添加mounted保护 - **页面级pop canPop()保护**(5处)— 不可pop时降级导航到首页 #### Hive系统级联崩溃根因修复(v6.16.2 + v6.16.3) - **根因:** `Hive.initFlutter()`在iOS模拟器因objective_c库问题失败后,导致整个Hive系统瘫痪 - **影响范围:** KvStorage、WallpaperFavoriteService、WallpaperHealthService、SettingsChangeLogger等全部初始化失败 - **修复:** `HiveSafeAccess.ensureInitialized()` — 失败时降级使用`Hive.init()`+手动路径获取;各服务添加全异常捕获优雅降级 #### 引导页 & 小部件修复(v6.16.1) - 引导页重复显示 — 将判断从`initialLocation`移到`redirect`回调,改用`isOnboardingCompleted` - 桌面小部件framework断言 — `CupertinoSliverNavigationBar`补充`largeTitle`参数 **修改文件:** - `hive_safe_access.dart`, `kv_storage.dart`, `wallpaper_favorite_service.dart`, `wallpaper_health_service.dart`, `settings_change_logger.dart` - `share_sheet.dart`, `leisure_share_sheet.dart`, `progress_share_card.dart`, `chat_video_bubble.dart`, `china_colors_page.dart` - `export_io_native.dart`, `font_download_service.dart`, `logger.dart`, `sentence_detail_actions.dart`, `account_export_info_sheet.dart`, `voice_recorder_sheet.dart`, `ohos_compatibility_helper.dart`, `general_fields_provider.dart` - `progress_beautify_page.dart`, `signin_page.dart`, `app_lock_pattern_setup.dart`, `image_cache_page.dart`, `chat_flow_page.dart`, `weather_settings_page.dart` - `hot_search_page.dart`, `security_question_page.dart`, `change_password_page.dart`, `sentence_detail_sheet.dart` - `app_router.dart`, `widget_management_page.dart` *** ## [v6.15.0] - 2026-06-04 ### 🐛 10项Bug修复 + 验收审计举一反三 | # | 问题 | 根因 | 修改文件 | |---|------|------|---------| | 1 | 了解我们页面微信搜索无法单独操作 | 标签合并导致 | `learn_us_widgets.dart` | | 2 | 权限管理摇一摇开关关闭无反应 | refresh()销毁开关组件 | `permission_management_page.dart`, `permission_service.dart` | | 3 | 日签卡片一直转圈loading | API请求无超时保护 | `daily_card_provider.dart`, `daily_card_service.dart` | | 4 | 进度保存图片失败 | objective_c库gal抛ArgumentError | `export_io_native.dart`, `progress_beautify_page.dart` | | 5 | 数据管理页文档目录异常 | safeAppDirPath null无降级 | `backup_service.dart`, `data_management_page.dart` | | 6 | 缓存管理AppBar标题多余"图片" | 翻译文案问题 | `zh_cn.dart`, `zh_tw.dart` | | 7 | 个人中心Hive缓存报错 | HiveCacheStore打开Box异常 | `cache_config.dart` | | 8 | iOS长按App icon无返回按钮 | QuickActions用go()替换路由 | `app.dart`(3处go→push) | | 9 | 清理后台重开显示引导页 | 路由判断用isFirstLaunch误判 | `app_router.dart`, `onboarding_provider.dart` | | 10 | 桌面小部件framework断言 | initState异步访问ref | `widget_management_page.dart` | ### 🔍 验收审计 - 举一反三分析 | 风险类别 | 高危 | 中危 | 低危 | 合计 | |---------|------|------|------|------| | 异步生命周期(mounted保护) | 11 | 20 | 9 | 42 | | Hive/Path/Gal缺少ArgumentError捕获 | 9 | 10 | 4 | 29 | | 路由导航(go应改push) | 4 | 4 | 2 | 10 | | KvStorage关键标志位默认值 | 4 | 2 | 0 | 6 | > 注:v6.16.0已修复上述审计建议的高危问题 *** ## [v6.14.0] - 2026-06-04 ### 🎴 日签卡片 AR 3D 展示效果 (Issue #9) 采用伪AR方案 — Flutter 3D变换 + 设备传感器模拟AR体验: - **3D卡片渲染** — Matrix4透视投影变换,设备感应倾斜偏移(`sensors_plus`) - **景深效果** — RadialGradient深空背景 + 动态星空粒子 + ShaderMask暗角 - **光影动画** — 4秒周期LinearGradient光影流动覆盖层 - **截图分享** — RepaintBoundary截取PNG → `share_plus`系统分享 - **6套AR主题** — 宇宙深空🌌 / 极光幻境🌈 / 落日余晖🌅 / 森林秘境🌿 / 深海探幽🌊 / 水晶殿堂💎 - **手势控制** — 拖拽旋转 / 双击重置(触觉反馈) / 捏合缩放(0.6x-2.0x) - **Cupertino风格控制面板** — GlassContainer底部面板(截图/主题切换/自动旋转/重置) **新增文件:** `lib/features/daily_card/presentation/daily_card_ar_view.dart` **修改文件:** `daily_card_page.dart`, `app_routes.dart`, `route_registry.dart` *** ## [v6.13.0] - 2026-06-04 ### 🔧 鸿蒙原生层修复 + iOS Widget深度定制 + 基础设施 #### A. 鸿蒙原生层修复 (Issue #2) - 所有FormPage添加`.bindContextMenu()`长按上下文菜单(6个卡片页面各自定制操作菜单) - 日签卡片保存按钮OHOS兼容 — gal不支持OHOS,降级为系统分享方案 #### B. iOS Widget深度定制 — AppIntent交互式按钮 (Issue #8) - 新增7种AppIntent定义(刷新/点赞/分享/切换/签到/打开页面/保存卡片) - 6个Widget View添加iOS 17+ `Button(intent:)`交互式按钮,iOS 14-16降级为Link方式 - Flutter端更新`home_widget_service.dart`处理新Intent类型 #### C. 基础设施 (Issue #3, #4) - **Hive安全访问单例** — 新建`hive_safe_access.dart`,统一lazy-init守卫、Box缓存、并发锁、重试机制;KvStorage/CrashMonitor/CacheConfig/RssService全部接入 - **设备发现去重增强** — deviceId+IP组合键去重 + 30秒心跳超时清理定时器 **新增文件:** `hive_safe_access.dart`, `XianyanWidgetIntents.swift` **修改文件:** 6个FormPage.ets, `XianyanWidget.swift`, `home_widget_service.dart`, `export_io_native.dart`, `ohos_compatibility_helper.dart`, `kv_storage.dart`, `lan_discovery_service.dart`, `device_discovery_provider.dart` *** ## [v6.11.0] - 2026-06-04 ### 📷 集成真实扫码SDK + 鸿蒙端全面修复 #### 扫码功能完善 - 创建通用扫码页面`qrcode_scanner_page.dart`,集成`mobile_scanner: ^7.1.4` - 完整流程:相机权限 → 动画扫描线 → URL/文本/Email/电话/WiFi/vCard分类处理 → 智能结果处理 - 闪光灯开关、相册识别辅助功能,Cupertino风格界面支持动态主题 #### 鸿蒙端兼容性修复(9项) - ✅ 相机权限缺失 → AndroidManifest.xml添加CAMERA - ⚠️ 文件传输设备列表重复 → 已有去重逻辑,建议增加IP组合键 - ⚠️ 长按桌面图标无按钮列表 → 鸿蒙原生限制需改.ets代码 - ✅ HiveError Box not found → OhosCompatibilityHelper.safeOpenBox() - ⚠️ 日签保存无反应 → gal不支持OHOS,降级为分享 - ✅ 输入框不弹输入法 → requestKeyboardFocus()增强方法 - ✅ 数据管理显示0B → safeGetDirectorySize()安全读取 - ✅ 设备信息unknown → getEnhancedPlatform()/getEnhancedDeviceModel() - ✅ OhosCompatibleState Mixin快速集成 **新增文件:** `qrcode_scanner_page.dart`, `ohos_compatibility_helper.dart` **修改文件:** `profile_page.dart`, `app_routes.dart`, `route_registry.dart`, `AndroidManifest.xml` *** ## [v6.10.5] - 2026-06-02 ### 🏗️ 架构优化 + 多语言全覆盖 + 构建修复(v6.10.0 ~ v6.10.5 合并) #### 架构优化 (v6.10.0) - **MacosPlatformService统一** — 分散MethodChannel统一为新服务,Swift端扩展为10个方法处理器 - **二维码WebSocket长连接** — QrcodeWsService双通道架构(WS优先+HTTP轮询降级)+ 中继服务器 - **RSS全文阅读** — Readability算法提取全文 + 图片画廊阅读模式 - **灵动岛倒计时聚焦模式** — startCountdownActivity/update/endCountdownActivity - **自定义Lint规则** — double_angle_brackets / hardcoded_color / hardcoded_chinese - **应用图标和名称** — 全平台图标更新,iOS/macOS名称改为中文「闲言」 #### 多语言全覆盖 (v6.10.3 + v6.10.4) - **6页面全量i18n** — 账户设置(18key)、数据管理(33key)、来源(40key)、收藏(68key)、离线(67key) - **翻译字段补全** — roleNative + 7个分发渠道字段,12种语言补全 - **覆盖14种语言** — zh_cn/en/ja/zh_tw/ko/de/it/es/ar/bn/hi/pt/ru/fr #### 构建修复 (v6.10.1 + v6.10.2 + v6.10.5) - **Syncfusion Chart崩溃** — DeferredBuilder包裹35处图表延迟渲染,21个文件 - **扫码登录自动跳转** — HTTP轮询(3s) + WebSocket双通道监听 + 自动tokenLogin - **pubspec.yaml双模板** — 拆分pubspec.ohos.yaml/pubspec.macos.yaml,tools/setup_pubspec.ps1自动生成 - **AppBar标题/返回按钮修复** — 7个页面统一CupertinoNavigationBar风格 **涉及文件:** macos平台服务、路由注册、扫码登录、多语言系统(5新模块+14语言)、图表组件、pubspec模板、7个页面导航栏 *** ## [v6.9.28] - 2026-06-01 ### 🏗️ 路由架构重构 + 基础设施建设(v6.9.19 ~ v6.9.51 合并) #### 路由架构重构 (v6.9.28) — Single Source of Truth - 新增统一路由注册表`route_registry.dart`(~1000行),消除6-8个文件手动同步鸿蒙配置 - 自动生成GoRoute和OhosRouteEntry,ohos_nav_bridge从1188行缩减至245行 - 新增5个核心文件:route_def/route_registry/route_builders/ohos_route_types/ohos_placeholders #### 数据同步架构 (v6.9.23) — DataSyncEventBus - 统一事件总线替代分散StreamController,零破坏性迁移(compat兼容层) - 支持readlater/favorite两种事件类型,source追踪便于调试 #### Supabase SDK移除 (v6.9.41) — 全面切换自建API - 移除supabase_flutter依赖,5个服务重写为ApiClient调用 - PHP后端新增22个接口(Readlater 15 + FontSync 2 + PluginUpdate 5) - Admin管理后台新增5组CRUD模块(FastAdmin) #### 句子详情面板重构 (v6.9.47 + v6.9.48) - 1252行拆分为3个文件(panel/content/actions),Riverpod Notifier消除prop drilling - TTS关闭按钮、相关推荐、卡片分享图片、AnimatedSwitcher过渡动画 #### 主题系统 & UI修复 (v6.9.22 + v6.9.36) - `context.isDark`/`context.ext`便捷扩展;Sheet/Dialog硬编码颜色全面修复(7个文件) - 21项批量UI修复:emoji清理、按钮溢出、协作画布绘制bug、Android快捷方式、16KB页面支持 #### 多语言 & 功能 (v6.9.27 + v6.9.33 + v6.9.34 + v6.9.37 + v6.9.49) - 登录/注册95key i18n(TAuth)、会话流100key i18n(TChatFlow)、备案信息i18n - 功能分级标准FeatureAccessLevel(localOnly/cloudWithCloudSync/cloudRequired) - 贡献者头像墙首字占位、阅读报告本地化、内容纠错邮箱验证码 #### 鸿蒙适配 & 开发工具 (v6.9.20 + v6.9.24 + v6.9.38 + v6.9.40 + v6.9.42 + v6.9.51) - module.json5权限审计(移除9个system级权限)、schema校验修复、receive_sharing_intent配置 - bitsdojo_window→window_manager迁移、win32 6.x API迁移、Swift条件编译修复 - Android配置一致性检查脚本、翻译覆盖率检测Python脚本(1304键基准)、CanvasProvider单元测试(42用例) ## 🏷️ 软件特性功能 (v6.9.18及更早版本已完成的特性) - 🏠 **主页** — 每日拾句/句子广场/下拉刷新动画/精灵角色互动/摇一摇换句 - 🔍 **发现** — 会话流AI聊天/稍后读/闲情逸致/灵感/日签卡片/壁纸模板/进度追踪/工具中心 - 👤 **我的** — 个人中心/收藏/历史/设备管理/内容纠错/文件传输 - ⚙️ **设置** — 主题个性化/通用设置/权限管理/插件系统/实验性功能 - 🎨 **设计系统** — 动态主题(亮/暗/AMOLED)/动态圆角/GlassContainer毛玻璃/统一设计令牌 - 🔒 **隐私合规** — 协议同意后初始化权限/AndroidManifest自启动防护/外部跳转确认弹窗 - 📱 **平台适配** — Android/iOS/鸿蒙/响应式布局/NFC文件传输 - 🔄 **路由架构** — 统一路由注册表(Single Source of Truth)/GoRoute+OhosRouteEntry自动生成/中间件架构 已归档版本 v6.9.18(了解我们弹窗) / v6.9.17(语言选择动态翻译) / v6.9.16(阅读报告本地降级) / v6.9.15(安卓快捷方式修复) / v6.9.14(主题系统增强) / v6.9.13(数据同步架构) / v6.9.12(协作画布修复) / v6.9.11(概览仪表盘) / v6.9.10(阅读报告服务) / v6.9.9(翻译插件) / v6.9.8(闲情逸致) / v6.9.7(诗词设置) / v6.9.6(工具中心) / v6.9.5(文件传输) / v6.9.4(搜索映射) / v6.9.3(灵感暗色渐变) / v6.9.2(隐私政策) / v6.9.1(FeatureFlag) / v6.9.0(稍后读修复) / v6.8.9(收藏同步) / v6.8.8(图片缓存) / v6.8.7(纠错布局) / v6.8.6(闲情热力图) / v6.8.5(外部跳转) / v6.8.4(工具面板重构) / v6.8.3(导航配置) / v6.8.1(引导页多语言) / v6.8.0(实验功能) / v6.7.9-v6.7.0(多项迭代) / v6.6.172-v6.6.168(插件+翻译+OHOS) / v6.6.167-v6.6.163(汇率+异常保护+API降级) / v6.6.162-v6.6.135(多项功能迭代) / v6.6.133-v6.5.45(综合审计+隐私+热力图+工具面板) / v16.36.0-v16.36.3(插件+翻译+OHOS) / v16.35.0(性能优化8项) / 6.25.0-6.25.1(鸿蒙小组件) / 6.24.0(诗词设置) / 14.0.0-14.23.0(传输+翻译+画布+WebRTC) / 13.2.0-13.9.0(信令+本地化+主题+设置) / 6.4.1-6.4.5(鸿蒙数据库) / 5.10.0-5.13.0(鸿蒙SDK+auth) / 1.21.0-1.48.0(早期功能迭代) — 更早版本详见 git history