# Changelog 所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。 > 保留最近 10 个版本(v6.80.0 ~ v6.89.0)。更早版本已归档至软件特性功能文档。 *** ## [v6.89.0] - 2026-06-17 ### 🛠 评分弹窗商店名称多语言 + Beta问卷按钮隐藏跨平台修复 #### 1. "给个好评"弹窗商店名称由硬编码"Google Play"改为多语言"应用商店" - **需求**: Android 端点击"给个好评"后,跳转确认弹窗显示硬编码英文"Google Play",未接入多语言系统,风格不统一 - **实现**: - `t_about.dart` 新增 `appStore` 翻译字段(构造函数 + 字段定义 + toMap + fromMap) - 14 种语言文件全部补充 `appStore` 翻译: - zh_cn: 应用商店 / zh_tw: 應用商店 / en: App Store / ru: Магазин приложений - pt: Loja de aplicativos / ko: 앱 스토어 / ja: アプリストア / it: App Store - hi: ऐप स्टोर / fr: App Store / es: Tienda de aplicaciones / de: App Store - bn: অ্যাপ স্টোর / ar: متجر التطبيقات - `app_store_service.dart` 的 `getStoreName` 方法:Android 分支由 `return 'Google Play'` 改为 `return t.about.appStore` - **影响**: `profile_page.dart` 和 `about_page.dart` 的"给个好评"/"评价应用"入口弹窗文案自动跟随系统语言 #### 2. Beta 页面"填写问卷"按钮提交后隐藏逻辑跨平台生效 - **问题**: 问卷提交后按钮只在 iOS 端隐藏,Android 等端不隐藏 - **根因**: 1. `_QuestionnaireSheet` 不符合条件关闭时调用 `_markQuestionnaireSubmitted()` 未 `await`,`Navigator.pop` 可能在 SharedPreferences 写入完成前执行 2. Sheet 关闭后仅依赖 `_loadQuestionnaireSubmitted()` 异步重读 SharedPreferences 更新 UI,跨平台存在时序差异(iOS NSUserDefaults 内存同步快,Android SharedPreferences.apply 异步落盘) - **修复**: - `_QuestionnaireSheet` 的两处关闭按钮改为 `Navigator.pop(context, true)` 返回已提交标记 - `_showQuestionnaire` 接收 Sheet 返回值,`submitted == true` 时立即 `setState` 更新 `_questionnaireSubmitted`,不再依赖 SharedPreferences 时序 - 不符合条件关闭分支改为 `async` + `await _markQuestionnaireSubmitted()`,并在 await 前获取 `Navigator.of(context)` 避免 `use_build_context_synchronously` - 保留 `_loadQuestionnaireSubmitted()` 作为兜底,确保与持久化状态最终一致 - **效果**: 所有平台(iOS/Android/Windows/macOS)问卷提交后按钮立即隐藏 #### 修改文件 | 文件 | 变更 | |---|---| | `l10n/types/t_about.dart` | 新增 `appStore` 字段(构造/定义/toMap/fromMap) | | `l10n/languages/*.dart` (14 个) | 补充 `appStore` 多语言翻译 | | `core/services/app_store_service.dart` | Android 端商店名称改用 `t.about.appStore` | | `features/settings/presentation/experimental_features_page.dart` | 问卷 Sheet 返回值即时更新 UI + await 修复时序 | *** ## [v6.88.0] - 2026-06-17 ### ✨ 闲情逸致价格档位扩展 + 纠错历史本地缓存 + 学习计划详情页 #### 1. 价格档位从单一"平价"扩展为"平价/中等/高档"三档 - **需求**: 原价格仅"平价/付费/商业/未知"四档,无法精准区分中等与高档消费 - **实现**: - `LeisurePriceType` 枚举从 4 值扩展为 6 值:`budget`(平价🆓) / `mid`(中等💰) / `premium`(高档💎) / `paid`(付费💳) / `commercial`(商业🏪) / `unknown`(未知❓) - 新增 `fromIdCompat` 静态方法,将旧 `free` ID 兼容映射为 `budget`,保证存量数据可读 - `label` 字段改为 `labelKey`(翻译键),避免硬编码中文 - `priceLabel`/`heatLabel` 标记 deprecated,新增 `priceLabelKey`/`heatLabelKey` - **影响**: `leisure_card.dart`、`leisure_card_row.dart`、`leisure_card_detail_sheet.dart`、`leisure_bottom_filter.dart` #### 2. 价格筛选联动数量统计 - **需求**: 筛选时用户无法预知各档位有多少卡片匹配 - **实现**: - `leisure_bottom_filter.dart` 新增 `_computeFilterCounts` 方法,从 `leisureTimelineProvider` 遍历所有节点卡片 - 9 个筛选项(花期/美食/高海拔/风险/平价/中等/高档/日出/观海)均显示匹配数量角标 - 数量为 0 时不显示角标,避免视觉噪音 - 修复 `node.foodCards`/`node.playCards` 不存在的 bug,改用 `node.allCards` 扩展 getter #### 3. 闲情逸致全模块多语言支持 - **需求**: "平价"等价格标签仍为硬编码中文,未接入翻译系统 - **实现**: - 新建 `t_leisure.dart` 翻译类型,包含 25 个字段(价格档位/筛选标签/热度等级/重构提示) - 接入 `t_root.dart`、`t.dart`、`translation_io_service.dart` - 14 种语言文件全部补充 `leisure` 节点翻译 - `leisure_card.dart` 的 `_buildPriceBadge` 使用 `TLeisure` 翻译 - `leisure_card_detail_sheet.dart` 新增 `_priceLabel` 方法替代 `priceType.label` - `leisure_bottom_filter.dart` 使用 `_FilterDef` + `labelGetter` 从 `TLeisure` 获取多语言文案 #### 4. 纠错历史本地缓存(drift) - **需求**: 纠错历史每次打开都实时请求服务器,无离线查看能力 - **实现**: - `app_database.dart` 新增 `CorrectionRecords` 表(15 列:type/sourceType/sourceId/content/username/email/sourceUrl/switchVal/isLocal/isAnonymous/isSynced/createtime/localCreatedAt/updatedAt) - schemaVersion 从 19 升至 20,新增 `_migrateToV20` 迁移方法(建表 + 时间倒序索引) - `AppDatabase` 新增 7 个 CRUD 方法:`insertCorrectionRecord`/`insertCorrectionRecords`/`getCorrectionRecords`/`deleteCorrectionRecord`/`clearCorrectionRecords`/`getCorrectionRecordCount`/`replaceCorrectionRecords` - `correction_provider.dart` 重构: - 新增 `CorrectionItem` 视图模型,统一本地与服务端字段(`fromServerMap`/`fromDb`/`toCompanion`) - `CorrectionState` 新增 `isLoadingFromCache`/`isSyncing` 状态 - `build()` 启动时异步加载本地缓存 - `loadCorrections()` 改为"先读本地 → 立即渲染 → 再请求服务器 → 全量替换本地" - `submitCorrection()` 成功后写入本地;网络异常时也写入本地(标记 `isSynced=false`) - 新增 `clearLocalCache()` 方法 - `correction_page.dart` 的 `_buildRecordItem` 改用 `CorrectionItem` 强类型 - 因项目 `dart_style`/`freezed` 与 `analyzer 12.1.0` 不兼容导致 `build_runner` 无法运行,手动编写 `app_database.g.dart` 中的 `$CorrectionRecordsTable`/`CorrectionRecord`/`CorrectionRecordsCompanion` 三个类 #### 5. 学习计划预告弹窗"了解详情"详情页 - **需求**: 预告弹窗仅文字提示,用户无法了解具体变更内容 - **实现**: - `t_study_plan.dart` 新增 3 个翻译字段:`restructureDetails`/`restructureDetailsTitle`/`restructureDetailsBody` - 14 种语言文件全部补充 studyPlan 的 3 个新字段 - `discover_page.dart` 弹窗新增"了解详情"按钮(三按钮布局:不再提醒/了解详情/确定) - 新增 `_showStudyPlanRestructureDetails` 方法:底部弹窗展示详情标题、正文、提示卡片 - 详情页使用 `CupertinoButton.filled` 确认按钮,毛玻璃风格容器 #### 修改文件 | 文件 | 变更 | |---|---| | `features/tool_center/leisure/models/leisure_card.dart` | 价格枚举扩展为 6 值,`label`→`labelKey`,新增 `fromIdCompat` | | `features/tool_center/leisure/presentation/widgets/leisure_bottom_filter.dart` | 接入 TLeisure 翻译,新增 9 筛选项 + 数量统计,修复 `allCards` bug | | `features/tool_center/leisure/presentation/widgets/leisure_card_row.dart` | 筛选逻辑适配新价格键,兼容旧中文键 | | `features/tool_center/leisure/presentation/widgets/leisure_card.dart` | `_buildPriceBadge` 使用 TLeisure,新增 `_priceLabel` | | `features/tool_center/leisure/presentation/widgets/leisure_card_detail_sheet.dart` | 新增 `_priceLabel` 方法替代 `priceType.label` | | `core/storage/database/app_database.dart` | 新增 `CorrectionRecords` 表 + V20 迁移 + 7 个 CRUD 方法 | | `core/storage/database/app_database.g.dart` | 手动添加 `CorrectionRecords` 相关 drift 生成代码 | | `features/correction/correction_provider.dart` | 重构:新增 `CorrectionItem` + 本地缓存逻辑 | | `features/correction/presentation/correction_page.dart` | `_buildRecordItem` 改用 `CorrectionItem` 强类型 | | `l10n/types/t_leisure.dart` | 新建:闲情逸致翻译类型(25 字段) | | `l10n/types/t_study_plan.dart` | 新增 3 个重构详情翻译字段 | | `l10n/types/t_root.dart` | 接入 `TLeisure` | | `l10n/types/t.dart` | 导出 `t_leisure.dart` | | `l10n/translation_io_service.dart` | 接入 `leisure` 节点导入导出 | | `l10n/languages/*.dart` (14 个语言文件) | 补充 `leisure` 节点 + studyPlan 的 3 个新字段 | | `features/discover/presentation/pages/home/discover_page.dart` | 弹窗新增"了解详情"按钮 + `_showStudyPlanRestructureDetails` 方法 | *** ## [v6.87.0] - 2026-06-17 ### ✨ 多平台应用商店统一服务 + 多处交互优化 + 纠错页多语言 #### 1. AppStore 地区不支持问题修复 - **根因**: iOS端"我的→给个好评"直接拼接固定URL,未根据当前语言地区生成正确的App Store链接,导致部分用户看到"所在地区不支持"错误 - **修复**: 新建 `AppStoreService` 统一应用商店服务,根据 `Locale.countryCode` 生成对应地区的App Store URL - iOS: `https://apps.apple.com/{region}/app/id6771828376`(应用ID: 6771828376) - Android: `market://details?id=apps.xy.xianyan` 或 Play Store 网页回退 - 鸿蒙: 华为应用市场 - Windows: `https://apps.microsoft.com/detail/9nqcv5gz10wnb?hl={lang}-{region}`(Product ID: 9nqcv5gz10wnb) - macOS: 与iOS相同逻辑 - **影响**: profile_page.dart、about_page.dart 的"给个好评"入口统一使用 `AppStoreService.getStoreUrlByLocale()` #### 2. 发现页下拉提示文案优化 - **问题**: iOS端发现页下拉刷新时提示"松手打开",语义不准确 - **修复**: 新增翻译键 `releaseToRefresh`,iOS端下拉提示改为"松手刷新",覆盖14种语言 #### 3. 学习计划重构预告弹窗 - **需求**: 学习计划将在下个版本重构改名为"生活计划",需提前告知用户 - **实现**: - 发现页点击"学习计划"入口时弹出 `CupertinoAlertDialog` - 内容: "学习计划 将在下个版本重构改名为 生活计划 部分功能有变更" - 两个按钮: "确定" / "不再提醒" - "不再提醒"使用 `KvStorage` 持久化标记 `app.study_plan.restructure_dont_remind`,下次不再弹出 - 新增4个翻译键: `restructureTitle`/`restructureMessage`/`restructureConfirm`/`restructureDontRemind` #### 4. 管理学习计划页面无法返回修复 - **问题**: 学习计划→管理学习计划页面无appbar,iOS端无法右滑返回 - **根因**: 使用 `context.appGo()` 跳转,`go()` 会替换路由栈导致无法返回 - **修复**: 改为 `context.appPush()` 使用push入栈,支持iOS右滑返回手势 #### 5. 闲情逸致"免费"标签改为"平价" - **问题**: 闲情逸致食物标签显示"免费"二字不符合实际语义 - **修复**: `LeisurePriceType.free` 的label从"免费"改为"平价",同步修改筛选底部弹窗和卡片行筛选逻辑 #### 6. 内容纠错页面全面多语言支持 - **需求**: 纠错页面所有硬编码中文需支持多语言 - **实现**: - 新建 `t_correction.dart` 翻译类型,包含48个字段(页面标题、类型标签、状态、来源、验证码、记录等) - 接入 `t_root.dart`、`t.dart`、`translation_io_service.dart` - 14种语言文件全部补充 `correction` 节点翻译 - `correction_page.dart` 所有硬编码中文替换为翻译调用: - 类型选项/内容类型选项使用key映射 + `_contentTypeLabel`/`_correctionTypeLabel` 辅助方法 - 提交校验、空内容、无效ID、提交成功/失败提示 - 数学验证码弹窗(安全验证、提示、占位符、取消、确认、错误) - 纠错记录弹窗(标题、空状态、联系邮箱反馈) - 记录卡片(类型、内容类型、状态:待处理/已处理/已拒绝/未知、来源:本地/管理员) - 修复记录卡片在长文本时的溢出问题(Text改用Flexible+ellipsis) #### 修改文件 | 文件 | 变更 | |---|---| | `core/services/app_store_service.dart` | 新建:统一应用商店跳转服务,支持iOS/Android/鸿蒙/Windows/macOS多平台多地区 | | `features/profile/presentation/profile_page.dart` | `_launchAppStore` 改用 `AppStoreService` | | `features/profile/presentation/about_page.dart` | `_onRateApp` 增加 `WidgetRef` 参数,改用 `AppStoreService` | | `features/discover/presentation/pages/home/discover_page.dart` | 下拉提示改用 `releaseToRefresh`;新增 `_showStudyPlanRestructureDialog` | | `features/study_plan/presentation/study_plan_page.dart` | `appGo` 改为 `appPush` 修复返回导航 | | `features/tool_center/leisure/models/leisure_card.dart` | `free` label 从"免费"改为"平价" | | `features/tool_center/leisure/presentation/widgets/leisure_bottom_filter.dart` | 筛选项"免费"改为"平价" | | `features/tool_center/leisure/presentation/widgets/leisure_card_row.dart` | 筛选逻辑"免费"改为"平价" | | `features/correction/presentation/correction_page.dart` | 全页面硬编码中文替换为翻译调用 | | `l10n/types/t_correction.dart` | 新建:纠错页翻译类型(48字段) | | `l10n/types/t_root.dart` | 接入 `TCorrection` | | `l10n/types/t.dart` | 导出 `t_correction.dart` | | `l10n/types/t_discover_base.dart` | 新增 `releaseToRefresh` 字段 | | `l10n/types/t_study_plan.dart` | 新增4个重构预告翻译字段 | | `l10n/translation_io_service.dart` | 接入 `correction` 节点导入导出 | | `l10n/languages/*.dart` (14个语言文件) | 补充 `releaseToRefresh`、4个重构预告字段、`correction` 节点完整翻译 | *** ## [v6.86.0] - 2026-06-17 ### 🐛 修复安卓桌面搜索快捷方式白屏问题 #### Bug: 在闲言其他页面点击桌面"搜索"快捷方式后白屏,只显示底栏,搜索框不弹出 - **根因**: 1. `QuickActionsService._resolveRoute('action_search')` 返回 `/profile?action=search`,`app.dart` 回调执行 `appRouter.push('/profile')` 2. `/profile` 是 `StatefulShellRoute` 的 branch 路由(底栏 Tab),`push` 会在 shell 之外创建新的 ProfilePage 实例,导致白屏只显示底栏 3. `ProfilePage.pendingSearch` 是 static 变量,但 ProfilePage 的 `initState` 只在首次构建时触发。底栏使用 `indexedStack` 会预构建 ProfilePage,热启动时 `initState` 不会再触发,`pendingSearch` 标记永远不会被消费,搜索框不弹出 - **修复**: 1. `QuickActionsService._resolveRoute('action_search')` 改为返回特殊标记 `action:search`,不再返回带参数路由 2. `app.dart` 新增 `_handleSearchShortcut()` 方法:使用 `appRouter.go('/profile')` 切换到 profile Tab(而非 push),延迟 500ms 后直接在 root context 弹出 `SpotlightSearchOverlay` 3. 兼容冷启动和热启动:冷启动时 go 切换 Tab 后直接弹搜索框;热启动时同样直接弹搜索框,不依赖 ProfilePage 的 initState 4. 鸿蒙端:`OhosNavBridge.push` 切换页面后延迟 600ms 弹出搜索浮层 #### 修改文件 | 文件 | 变更 | |---|---| | `core/services/device/quick_actions_service.dart` | `_resolveRoute('action_search')` 返回 `action:search` 标记;更新文件头注释 | | `app/app.dart` | 新增 `_handleSearchShortcut()` 方法;搜索快捷方式不再 push 路由,改用 go 切换 Tab + 直接弹 SpotlightSearchOverlay;移除未使用的 ProfilePage import,新增 SpotlightSearchOverlay import | *** ## [v6.85.0] - 2026-06-17 ### ✨ 新增Token过期智能续期提示功能 - **TokenRefreshWatcher**: 监听网络恢复事件,自动尝试Token续期,续期失败则弹窗引导重新登录 - 监听 `ConnectivityService.onTypeChange`,当从离线恢复到在线时自动触发Token检查 - 调用 `TokenService.checkToken()` 检测Token有效性,无效时自动调用 `TokenService.refreshToken()` 续期 - 续期失败弹出Cupertino风格弹窗,提供"稍后"和"重新登录"两个选项 - 使用 `_dialogShowing` + `KvStorage` 双重标记防止重复弹窗 - 在 `PostAgreementInitializer` 中 `ConnectivityService.init()` 之后启动,确保依赖就绪 #### 修改文件 | 文件 | 变更 | |---|---| | `core/services/auth/token_refresh_watcher.dart` | 新建Token续期监听器服务 | | `core/services/post_agreement_initializer.dart` | 在ConnectivityService初始化后启动TokenRefreshWatcher | *** ## [v6.84.0] - 2026-06-17 ### 🐛 修复鸿蒙端6个核心Bug:认证失败 + 保存相册 + 粘贴不工作 #### Bug1-4: 鸿蒙端所有需要认证的接口返回401未授权 - **根因**: `SecureStorage._useSharedPreferences` 仅判断 macOS/Windows,鸿蒙端使用 `flutter_secure_storage` 但其原生 MethodChannel 未实现,导致 Token 无法读写。所有需要认证的接口(修改密码、密保问题、注销账号、删除设备)均返回401 - **修复**: `_useSharedPreferences` 增加 `pu.isOhos` 判断,鸿蒙端降级使用 `SharedPreferences` 存储 Token;`deleteAll()` 补充 `user_id` 键名匹配 #### Bug5: 鸿蒙端保存到相册报错 - **根因**: 多处代码直接调用 `Gal.putImageBytes`/`Gal.putVideo`,但鸿蒙端 gal 插件不支持,调用即崩溃 - **修复**: 所有 `Gal` 调用点增加鸿蒙端判断,使用 `OhosCompatibilityHelper.saveImageToGalleryCompat`/`saveVideoToGalleryCompat` 通过系统分享降级 - **影响文件**: `share_sheet.dart`、`leisure_share_sheet.dart`、`progress_share_card.dart`、`china_colors_page.dart`、`chat_video_bubble.dart` #### Bug6: 鸿蒙端任意输入框粘贴无反应 - **根因**: Flutter 标准 TextInputPlugin 长按粘贴使用 `flutter/platform` 通道的 `Clipboard.getData` 方法,鸿蒙端 Flutter 引擎 C++ 层未实现此方法,导致粘贴操作静默失败 - **修复**: 在原生端 `EntryAbility.ets` 注册 `flutter/platform` 通道的剪贴板方法拦截器,将 `Clipboard.getData`/`setData`/`hasStrings` 路由到鸿蒙原生 pasteboard API;非剪贴板方法调用 `result.notImplemented()` 交由引擎默认处理;Dart 端 `ClipboardBridge` 新增 `installOhosClipboardInterceptor()` 和 `setData()` 方法 #### 修改文件 | 文件 | 变更 | |---|---| | `core/storage/secure_storage.dart` | `_useSharedPreferences` 增加 `pu.isOhos` 判断;`deleteAll()` 补充 `user_id` 键名 | | `core/utils/platform/clipboard_bridge.dart` | 新增 `installOhosClipboardInterceptor()` 和 `setData()` 方法 | | `core/utils/platform/ohos_compatibility_helper.dart` | 新增 `saveVideoToGalleryCompat()` 视频保存兼容方法 | | `shared/widgets/feedback/share_sheet.dart` | `_saveToGallery()` 鸿蒙端使用 `OhosCompatibilityHelper` 降级 | | `features/tool_center/leisure/.../leisure_share_sheet.dart` | `_saveToAlbum()` 鸿蒙端使用 `OhosCompatibilityHelper` 降级 | | `features/progress/.../progress_share_card.dart` | 保存相册鸿蒙端使用 `OhosCompatibilityHelper` 降级 | | `features/discover/.../china_colors_page.dart` | 保存色卡鸿蒙端使用 `OhosCompatibilityHelper` 降级 | | `features/discover/.../chat_video_bubble.dart` | 保存视频鸿蒙端使用 `OhosCompatibilityHelper` 降级 | | `main.dart` | 新增 `ClipboardBridge.installOhosClipboardInterceptor()` 调用 | | `ohos/.../EntryAbility.ets` | 注册 `flutter/platform` 通道剪贴板方法拦截器;新增 `Clipboard.setData` 方法;新增平台通道剪贴板方法(返回Flutter期望格式) | *** ## [v6.83.0] - 2026-06-17 ### 🐛 修复收藏功能两个核心Bug:主页收藏后收藏页不显示 + 取消收藏后数据残留 #### Bug1: 主页句子卡片收藏后,我的收藏页面不显示 - **根因1**: `getFavoriteCount()` 从 `translateFavorites` 表计数,而非 `sentences` 表的 `isFavorite=true`,导致收藏页面 `_totalFavCount` 为0,显示空状态而非本地收藏列表 - **根因2**: `HomeSentence.fromDb` 将 `row.isFavorite` 错误赋值给 `isLiked` 而非 `isFavorited`,导致从DB加载的句子收藏状态丢失 - **修复**: 新增 `getSentenceFavoriteCount()` 从sentences表统计;修复 `fromDb` 字段映射 `isLiked: row.isLiked, isFavorited: row.isFavorite` #### Bug2: 我的收藏取消收藏后数据仍在(本地DB和UI未同步更新) - **根因**: `setFavoriteFlag(targetId.toString(), false)` 传入纯数字ID(如"123"),但sentences表存复合ID(如"feed_123"),导致UPDATE匹配0行 - **修复**: 新增 `setFavoriteFlagForTarget(targetType, targetId, value)` 方法,同时尝试复合ID和纯数字ID两种格式;3处调用点全部替换 #### 增强: 收藏页面取消收藏后主页句子状态同步 - **问题**: 收藏页面取消收藏后,主页句子卡片的收藏图标不更新 - **修复**: `FavoriteNotifier.toggleFavorite` 成功后调用 `notifyFavoriteRefresh()`;`HomeNotifier` 监听 `favoriteRefreshStream`,收到事件后从DB批量同步句子 `isFavorited` 状态 #### 修改文件 | 文件 | 变更 | |---|---| | `core/storage/database/app_database.dart` | 新增 `setFavoriteFlagForTarget()` 兼容复合ID和数字ID;新增 `getSentenceFavoriteCount()` 从sentences表统计收藏数 | | `features/home/favorite_repository.dart` | `toggleFavorite()` 中 `setFavoriteFlag` → `setFavoriteFlagForTarget` | | `features/home/presentation/favorite/favorite_actions_mixin.dart` | `removeFavorite()` 和 `deleteSelected()` 中 `setFavoriteFlag` → `setFavoriteFlagForTarget`;`loadLocalStats()` 改用 `getSentenceFavoriteCount()` | | `features/home/providers/home_sentence_model.dart` | `fromDb` 修复字段映射:`isLiked: row.isLiked, isFavorited: row.isFavorite`(原 `isLiked: row.isFavorite`) | | `features/home/providers/favorite_provider.dart` | `toggleFavorite()` 成功后调用 `notifyFavoriteRefresh()` 通知主页 | | `features/home/providers/home_provider.dart` | 新增 `_favoriteRefreshSub` 监听收藏刷新事件;新增 `_syncFavoriteStateFromDb()` 批量同步句子收藏状态 | *** ## [v6.82.0] - 2026-06-17 ### 🐛 修复拾光栏配置开启后不实时更新 + 节气日历与实际日期不一致 #### Bug修复 - **拾光栏配置不实时更新**:`_DisplayItemsSheet` 从 `StatelessWidget` 改为 `ConsumerWidget`,内部直接 `ref.watch(dateDisplayProvider)` 监听配置变化,确保在子Sheet中切换开关后UI立即同步更新(之前子Sheet通过构造函数接收config快照,Provider更新后子Sheet无法感知) - **节气日期表排序错误**:2025/2026年节气数据中小寒(1月)、大寒(1月)排在列表末尾,导致 `getCurrentTerm()` 遍历时1月日期覆盖6月日期,6月17日错误返回大寒而非芒种。已将数据按年内时间顺序重排(小寒→大寒→立春→…→冬至) - **2026年雨水日期修正**:2月18日 → 2月19日 - **getCurrentTerm跨年边界**:年初(1月1-4日)未到小寒时,取上一年最后一个节气(冬至),避免返回null #### 修改文件 | 文件 | 变更 | |---|---| | `features/solar_term/solar_term_core.dart` | 节气日期表按时间顺序重排(小寒大寒移至年初);修正2026雨水日期(18→19);`getCurrentTerm()` 增加跨年边界处理 | | `features/home/presentation/date_config_sheet.dart` | `_DisplayItemsSheet` 改为 `ConsumerWidget`,内部watch Provider实时更新;`_showDisplayItemsSheet()` 简化参数 | *** ## [v6.81.0] - 2026-06-17 ### 📱 软件信息页面 — 设备类型卡片增加系统版本号显示 #### 功能描述 - 在软件信息页面的「设备信息」卡片中,设备类型后增加括号显示系统版本号 - 例如:桌面端 (macOS 15.0)、移动端 (Android 14)、移动端 (iOS 18.0)、桌面端 (Windows 10 (23H2))、移动端 (鸿蒙 5.0)、桌面端 (Linux 6.1) - Web 端不显示系统版本(保持原有行为) #### 修改文件 | 文件 | 变更 | |---|---| | `core/services/device/device_info_service.dart` | 新增 `getSystemVersion()` 异步方法,支持 Android/iOS/macOS/Windows/Linux/鸿蒙各平台系统版本获取;新增 `_extractOhosVersion()` 和 `_extractKernelVersion()` 辅助方法 | | `features/profile/presentation/app_info_sections.dart` | `DeviceInfoSection` 新增 `_systemVersion` 状态和 `_loadSystemVersion()` 方法;设备类型 `GridInfoItem` 的 value 改为 `$deviceType ($_systemVersion)` 格式 | *** ## [v6.80.0] - 2026-06-17 ### ✨ 登录页新增「记住账户」功能 #### 功能描述 - 登录页面密码登录模式下,新增「记住账户」复选框,勾选后登录成功会保存账户名 - 下次打开登录页时自动填充已保存的账户名并勾选「记住账户」 - 取消勾选后登录成功会清除已保存的账户信息 #### 修改文件 | 文件 | 变更 | |---|---| | `l10n/types/t_auth.dart` | 新增 `rememberAccount` 翻译键字段 | | `l10n/languages/zh_cn.dart` | 新增中文翻译:记住账户 | | `l10n/languages/en.dart` | 新增英文翻译:Remember Account | | `features/auth/presentation/login_form_sections.dart` | `PasswordFormSection` 新增 `isRemembered`/`onToggleRemember` 参数,将忘记密码按钮改为 Row 布局(左:记住账户复选框,右:忘记密码) | | `features/auth/presentation/login_page.dart` | 新增 `_rememberAccount` 状态、`_saveRememberAccount()` 方法;`_loadLastLoginAccount()` 读取 `remember_account` 偏好;`_handlePasswordLogin()` 登录成功后保存/清除账户 |