Files
xianyan/CHANGELOG.md
2026-06-18 03:09:19 +08:00

25 KiB
Raw Blame History

Changelog

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

保留最近 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.dartgetStoreName 方法Android 分支由 return 'Google Play' 改为 return t.about.appStore
  • 影响: profile_page.dartabout_page.dart 的"给个好评"/"评价应用"入口弹窗文案自动跟随系统语言

2. Beta 页面"填写问卷"按钮提交后隐藏逻辑跨平台生效

  • 问题: 问卷提交后按钮只在 iOS 端隐藏Android 等端不隐藏
  • 根因:
    1. _QuestionnaireSheet 不符合条件关闭时调用 _markQuestionnaireSubmitted()awaitNavigator.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.dartleisure_card_row.dartleisure_card_detail_sheet.dartleisure_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.dartt.darttranslation_io_service.dart
    • 14 种语言文件全部补充 leisure 节点翻译
    • leisure_card.dart_buildPriceBadge 使用 TLeisure 翻译
    • leisure_card_detail_sheet.dart 新增 _priceLabel 方法替代 priceType.label
    • leisure_bottom_filter.dart 使用 _FilterDef + labelGetterTLeisure 获取多语言文案

4. 纠错历史本地缓存drift

  • 需求: 纠错历史每次打开都实时请求服务器,无离线查看能力
  • 实现:
    • app_database.dart 新增 CorrectionRecords15 列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/freezedanalyzer 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 值,labellabelKey,新增 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端发现页下拉刷新时提示"松手打开",语义不准确
  • 修复: 新增翻译键 releaseToRefreshiOS端下拉提示改为"松手刷新"覆盖14种语言

3. 学习计划重构预告弹窗

  • 需求: 学习计划将在下个版本重构改名为"生活计划",需提前告知用户
  • 实现:
    • 发现页点击"学习计划"入口时弹出 CupertinoAlertDialog
    • 内容: "学习计划 将在下个版本重构改名为 生活计划 部分功能有变更"
    • 两个按钮: "确定" / "不再提醒"
    • "不再提醒"使用 KvStorage 持久化标记 app.study_plan.restructure_dont_remind,下次不再弹出
    • 新增4个翻译键: restructureTitle/restructureMessage/restructureConfirm/restructureDontRemind

4. 管理学习计划页面无法返回修复

  • 问题: 学习计划→管理学习计划页面无appbariOS端无法右滑返回
  • 根因: 使用 context.appGo() 跳转,go() 会替换路由栈导致无法返回
  • 修复: 改为 context.appPush() 使用push入栈支持iOS右滑返回手势

5. 闲情逸致"免费"标签改为"平价"

  • 问题: 闲情逸致食物标签显示"免费"二字不符合实际语义
  • 修复: LeisurePriceType.free 的label从"免费"改为"平价",同步修改筛选底部弹窗和卡片行筛选逻辑

6. 内容纠错页面全面多语言支持

  • 需求: 纠错页面所有硬编码中文需支持多语言
  • 实现:
    • 新建 t_correction.dart 翻译类型包含48个字段页面标题、类型标签、状态、来源、验证码、记录等
    • 接入 t_root.dartt.darttranslation_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=searchapp.dart 回调执行 appRouter.push('/profile')
    2. /profileStatefulShellRoute 的 branch 路由(底栏 Tabpush 会在 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 双重标记防止重复弹窗
    • PostAgreementInitializerConnectivityService.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 存储 TokendeleteAll() 补充 user_id 键名匹配

Bug5: 鸿蒙端保存到相册报错

  • 根因: 多处代码直接调用 Gal.putImageBytes/Gal.putVideo,但鸿蒙端 gal 插件不支持,调用即崩溃
  • 修复: 所有 Gal 调用点增加鸿蒙端判断,使用 OhosCompatibilityHelper.saveImageToGalleryCompat/saveVideoToGalleryCompat 通过系统分享降级
  • 影响文件: share_sheet.dartleisure_share_sheet.dartprogress_share_card.dartchina_colors_page.dartchat_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.fromDbrow.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()setFavoriteFlagsetFavoriteFlagForTarget
features/home/presentation/favorite/favorite_actions_mixin.dart removeFavorite()deleteSelected()setFavoriteFlagsetFavoriteFlagForTargetloadLocalStats() 改用 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修复

  • 拾光栏配置不实时更新_DisplayItemsSheetStatelessWidget 改为 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() 登录成功后保存/清除账户