refactor: 完成项目架构重构,统一模块导入路径

- 清理大量废弃的 barrel 导出文件,移除冗余的中间导出层
- 修复所有相对路径导入错误,统一调整为扁平化模块引用
- 更新多平台 pubspec 版本号与依赖库版本
- 补充后端功能问题管理后台与脚本工具
- 调整部分页面的快捷方式文案适配新功能
- 更新部分翻译覆盖率与API文档
This commit is contained in:
Developer
2026-06-12 08:48:33 +08:00
parent 33e347dea7
commit f91be94e9c
560 changed files with 28489 additions and 14780 deletions

View File

@@ -4,6 +4,719 @@
***
## [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 +1payload→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` | 顶层包裹AppIconModeScopeimport 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/iconModeAppIconStyle新增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💧🌬💨🤍📤📖😔替换为CupertinoIconsdrop/compass/wind/heart/share/book/exclamationmark_triangle天气类型emoji保留 |
| home_sentence_card.dart | 统计emoji👁👍⭐💬替换为AppIcon+CupertinoIconseye/hand_thumbsup/star/chat_bubble内容分类emoji保留 |
| overview_dashboard.dart | 全部UI emoji替换为CupertinoIconssearch/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+CupertinoIconsToast消息emoji保留 |
| translate_page.dart | UI emoji🌐📋⚙🔊❌🔄🔍替换为AppIcon+CupertinoIconsglobe/clock/settings/speaker_2/xmark_circle/refresh/search国旗emoji保留 |
#### 技术要点
| 要点 | 说明 |
|---|---|
| AppIcon组件 | 统一使用AppIcon组件3级降级策略 CupertinoIcon→SVG→Emoji |
| 动态主题 | 通过AppIconStyleprimary/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` | 支持从外部直接定位到指定Tab0=配对码, 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
### 📝 笔记仓库 — 数量限制/离线模式/搜索增强/版本对比/同步进度/键盘管理