### 变更详情
1. **多语言国际化**:新增`rejectAndExit`翻译键,覆盖14种语言的拒绝退出文案
2. **鸿蒙端适配**:
- 修复USB事件监听报错,仅Android端启用原生USB监听
- 调整小部件管理页交互,鸿蒙端跳过Beta弹窗并显示"敬请期待"提示
- 适配通用设置页和功能检查的鸿蒙端toast替代弹窗逻辑
- 调整句子详情页"编辑"按钮的鸿蒙端交互
3. **隐私合规优化**:
- 移除剪贴板定时轮询,改为被动触发模式,仅在用户主动进入稍后读页面时检查剪贴板
- 移除Android端非核心权限,精简权限声明
- 新增启动页SplashActivity作为协议守门人,从根本上阻止敏感插件在协议前初始化
- 为Android端引导页新增双按钮布局,优化未勾选协议时的用户操作引导
4. **依赖与代码清理**:
- 修复macOS端flutter_secure_storage插件导入路径
- 简化字体导入逻辑,移除冗余的readAsBytes降级逻辑
- 更新CHANGELOG文档,记录版本变更细节
180 KiB
Changelog
所有重要变更均记录于此文件。格式基于 Keep a Changelog。
[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.dartlib/core/services/feature/feature_flag_service.dartlib/features/mine/settings/presentation/general/general_settings_page.dartlib/features/mine/profile/presentation/profile_page.dartlib/features/widget/presentation/widget_management_page.dartlib/features/file_transfer/services/discovery/usb_discovery_service.dart
[v6.36.0] - 2026-06-10
🔒 隐私合规 — 剪贴板读取改为被动触发 + Android引导页双按钮
问题描述
- 用户同意隐私协议后,
ClipboardMonitorService立即以3秒定时轮询读取剪贴板,违反"非对应场景不得读取剪贴板"的合规要求 - Android端引导页仍使用勾选框方式,与原生隐私协议对话框的双按钮风格不一致
堆栈证据:
java.lang.Exception
at android.content.ClipboardManager.getPrimaryClipDescription(Native Method)
at A.e.onMethodCall(Unknown Source:312)
修复内容
1. ClipboardMonitorService改为被动触发(核心修复)
| 变更 | 说明 |
|---|---|
移除Timer.periodic3秒轮询 |
不再主动定时读取剪贴板 |
新增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中修复
问题描述
- 安卓端未同意隐私声明前,
sensors_plus等插件在onAttachedToActivity时已读取传感器,违反隐私合规要求 - 引导页未勾选协议时按钮显示不明确,用户无法直观感知"拒绝"操作
- 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个
recommendedToolsgetter 增加.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),
_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/backgroundChannel,处理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解析 + 分享功能实现
变更说明
- 修复XML正则解析逻辑:重写
_parseXml方法,改为层级感知解析 — 先定位根元素,再在根元素内部提取直接子节点(非递归),统计直接子节点标签频率确定行标签,避免外层容器标签干扰。新增_extractDirectChildren方法支持同名嵌套和自闭合标签处理 - 实现分享功能:
_onShare方法从空壳改为完整实现 — 无频道时提示用户、单频道直接分享、多频道弹出选择器;三种分享模式(配置+数据/仅配置/内容分析报告)均调用ShareExportService.shareChannel完成实际分享,包含空数据和异常处理
影响范围
| 模块 | 变更 |
|---|---|
| file_parser_service | XML解析逻辑重写,新增 _extractDirectChildren/_isTagStart/_XmlChild |
| import_source_page | 分享功能实现,新增 _shareWithMode/_doShare/_showNoChannelTip/_modeLabel |
[v6.24.0] - 2026-06-10
📝 笔记模块国际化 + 动态主题适配
变更说明
- 新增 TNote 翻译类型:定义 108 个翻译键,覆盖笔记模块全部硬编码中文文本
- 14 种语言全量更新:zh_cn/zh_tw/en/ja/ko 完整翻译,de/fr/es/it/pt/ru/ar/hi/bn 使用英文回退(待机器翻译)
- 笔记列表页国际化:30+ 处硬编码中文替换为翻译键,NoteSortMode/NoteGroupMode 枚举 label 改为翻译方法
- 笔记编辑页国际化:27 处硬编码中文替换,静态数组改为动态方法(_noteTypes/_sourceTypes/_fontFamilies)
- 笔记统计面板国际化:11 处硬编码替换,StatelessWidget→ConsumerWidget
- 笔记导出工具国际化:13 处硬编码替换,方法签名增加 TNote 参数
- 笔记置顶弹窗国际化:8 处硬编码替换,showPinDialog 增加 TNote 参数
- 筛选/共享组件国际化:NoteFilterTabs/NoteEmptyState/NoteFooter/NoteDateHeader/NoteTypeBadge/NoteSourceRow 全部国际化
- translation_io_service 同步更新:新增 _tNoteToMap/_importNote/_checkNoteFieldsSync 映射方法
- 动态主题验证:所有页面已使用 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 审计 + 空值安全
变更说明
- 注销页面国际化补全:TAccountSettings 新增 45 个翻译 key,覆盖全部硬编码中文,14 种语言全部更新
- 退出选项国际化:TProfile 新增 4 个翻译 key(exitSubProject/exitApp/exitAccount/closeAppToDesktop),14 种语言全部更新
- StatefulBuilder 陷阱审计:排查项目 15 个 StatefulBuilder 用法,全部正确无陷阱(唯一有 bug 的 note_list_page.dart 已在上版本修复)
- 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
🔧 多页面功能修复与增强 — 注销页国际化 + 退出选项 + 运行模式标签 + 拾光栏增强 + 置顶开关修复
变更说明
- 注销账户页面重构:所有 emoji 替换为 CupertinoIcons,添加多语言支持(导航栏标题/取消按钮等使用翻译系统),动态主题适配(硬编码颜色替换为主题扩展色)
- 我的页面快捷操作增加退出选项:新增"退出子项目"、"退出闲言"、"退出闲言账号"(仅登录时显示)、"关闭闲言返回桌面"四个退出选项
- 软件信息页面增加运行模式标签:检测更新按钮右侧新增 Release/Debug 模式标签,根据
dart.vm.product自动判断显示 - 拾光栏增强:增加可点击区域(上下左右 padding),首次点击前显示红色小圆点提示(点击后消失并持久化),拾光配置 Sheet 新增星期几/周几显示
- 修复笔记置顶开关 Bug:
_showPinDialog中currentPinned变量从 StatefulBuilder builder 内部移至外层闭包,修复开关无法切换的问题
影响范围
| 模块 | 变更 |
|---|---|
| 注销页面 | emoji→CupertinoIcons,多语言,动态主题 |
| 我的页面 | 快捷操作 dialog 增加 4 个退出选项 |
| 软件信息 | CheckUpdateItem 增加 Release/Debug 标签 |
| 拾光栏 | 点击区域扩大,小红点提示,星期几显示 |
| 笔记页面 | 修复"在发现中置顶"开关状态丢失 Bug |
[v6.21.0] - 2026-06-10
🗑️ 移除传感器相关功能 — 删除 sensors_plus 依赖 + 摇一摇功能下线
变更说明
- 移除 sensors_plus 三方库:从 pubspec.yaml / pubspec.macos.yaml / pubspec.ohos.yaml 三个模板中移除 sensors_plus 依赖及鸿蒙端本地包覆写
- 删除 ShakeDetector 服务:移除
lib/core/services/device/shake_detector.dart,删除摇一摇检测器单例及处理器栈模式 - 移除摇一摇权限:从
AppPermission枚举中移除shake虚拟权限,移除isShakeEnabled/setShakeEnabled方法 - 移除路由观察者:删除
ShakeScopeObserver,不再监听路由作用域切换 - 移除生命周期管理中的摇一摇:
AppLifecycleGate不再管理 ShakeDetector 的启停 - AR视图改为纯动画模式:
DailyCardArView移除加速度传感器监听,改为手势+动画驱动 - 移除设置页摇一摇开关:通用设置中移除"摇一摇换句"开关项
- 移除权限管理页摇一摇卡片:删除
_ShakePermissionCard组件 - 移除引导页摇一摇选项:个性化页面不再提供摇一摇开关
- 移除音效类型:
SfxType枚举中移除shake类型 - 清理存储层:移除
shakeEnabled/nsHomeShakeEnabled存储键 - 清理翻译系统:移除 14 个语言文件中的摇一摇相关翻译键(共 9 个键/语言)
- 更新三方库清单: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完善 + 性能优化
变更说明
- ReadLaterNotifier 职责拆分:将UI状态(搜索/筛选/排序/选择/拖拽)从
ReadLaterState抽离至独立的ReadLaterUiNotifier,数据层与UI层解耦 - 新增组合Provider:
readLaterFilteredProvider(筛选条目)、readLaterFoldersProvider(文件夹缓存)、readLaterTagStatsProvider(标签统计缓存),消除FutureBuilder和同步阻塞调用 - i18n完善:49个硬编码中文字符串迁移至多语言系统(
TReadLater新增49个翻译键),支持中英文 - BuildContext安全:所有异步操作后增加
mounted检查,防止跨async使用已销毁的Context - 拖拽文件完善:
handleDroppedFiles支持图片/视频/音频/文档/链接等6种文件类型识别和添加 - 列表动画优化:长列表仅前20项使用交错延迟动画,避免性能问题
- 主题感知卡片:暗色模式下卡片背景使用半透明效果,增强层次感
- 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 ViewModellib/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检查/Providerlib/features/home/presentation/providers/readlater/readlater_page_ops_mixin.dart— i18n替换/mounted检查/拖拽完善/Providerlib/features/home/presentation/providers/readlater/readlater_page_ai_mixin.dart— i18n替换/mounted检查lib/features/home/presentation/providers/readlater_page.dart— 适配新Providerlib/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
📋 引导页优化 — 安卓端页面顺序调整 + 协议页滚动进度条
变更说明
- 软件协议页增加滚动进度条:协议内容区域新增垂直滚动进度条(进度百分比+Scrollbar),方便用户了解阅读进度
- 安卓端页面顺序调整:首次启动时,软件协议页为第一页,欢迎与指引为第二页(其他端不变)
- 安卓端从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改为falseGeneralStorage.shakeEnabled默认值从true改为false- 首页启动 ShakeDetector 前增加
PermissionService.isShakeEnabled检查 - 通用设置页开启「摇一摇换句」时,若权限未授权则弹窗引导去权限管理页
- 前后台恢复摇一摇时增加权限检查
- 引导页开启摇一摇时同步设置 PermissionService 权限
修改文件
lib/core/services/auth/permission_service.dart— 默认值改为 falselib/core/storage/app_storage.dart— 默认值改为 falselib/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— 新建,独立管理空间对话框Activityandroid/.../MainActivity.kt— 移除对话框逻辑,改为检测 intent extraandroid/.../AndroidManifest.xml— manageSpaceActivity 指向 ManageSpaceActivityandroid/.../res/values/styles.xml— 新增 ManageSpaceActivityTheme(透明)android/.../res/values-night/styles.xml— 暗色模式透明主题
[v6.16.0] - 2026-06-09
🐛 Bug修复 — 安卓端管理空间对话框不弹出
问题描述
安卓端「应用信息 → 管理空间」点击后,原生对话框未弹出。
根因分析
- Activity主题不兼容:
LaunchTheme继承自Theme.Light.NoTitleBar,不包含对话框样式,AlertDialog.Builder在此主题下无法正常创建对话框 - 冷启动时序问题:原代码在
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— 新增 ManageSpaceDialogThemeandroid/app/src/main/res/values-night/styles.xml— 新增暗色 ManageSpaceDialogThemeandroid/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 SlideActionTyperoute_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— 新增 sendLocationlib/features/discover/providers/chat_provider.dart— 新增 sendLocationMessagelib/features/discover/presentation/widgets/chat/chat_flow_input_bar.dart— 完善三个空壳 onTaplib/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修复 — 平台过滤全关闭后仍返回内容 + 后台分类快捷开关状态未更新
问题描述
- 核心Bug: 后台将所有平台/分类关闭后,主页句子广场和句子卡片依旧有内容返回
- 后台Bug: 分类快捷开关批量启用/禁用后,列表勾选状态未更新
根因分析
- API端:
list/mix/recommend等方法在过滤后无启用分类时,回退到硬编码默认分类(如poetry/wisdom等),绕过了平台过滤 - API端:
trending/random/refresh/refresh_content完全没有平台过滤逻辑 - API端:
list指定具体频道时无平台过滤 - API端: 大部分方法只从GET参数读取platform,未从
X-Platform请求头读取(Flutter端很多调用只通过请求头传递) - 后台端: 分类快捷面板checkbox未初始化为数据库中的
is_enabled状态,操作后也未更新
修复内容
Feed.php(API控制器)- 8个方法修复:
list()— 全平台关闭时返回空列表而非回退到硬编码分类;指定频道时增加平台过滤;缓存key加入platformchannels()— 所有频道禁用时不显示"推荐"频道trending()— 新增platform参数和平台过滤逻辑recommend()— 新增platform参数和平台过滤;用户偏好也按平台过滤;缓存key加入platformrandom()— 新增platform参数和平台过滤逻辑mix()— 全平台关闭时返回空列表而非回退到硬编码分类refresh()— 新增platform参数和平台过滤逻辑refresh_content()— 新增platform参数和平台过滤逻辑- 新增
_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_typesdocs/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和功能优化,包括开关样式按钮、分类多选、内容数量显示、平台图标点击切换等。
新增后台接口
- toggle_platform
POST /admin.php/feed_weight/toggle_platform— 列表页点击平台图标直接切换开关 - batch_category_enable
POST /admin.php/feed_weight/batch_category_enable— 多选分类批量启用/禁用 - content_count
GET /admin.php/feed_weight/content_count?feed_type=xxx— 获取分类内容条数
UI优化
- 平台快捷开关: 改为iOS风格开关样式按钮(绿色=开启,灰色=关闭)
- 分类快捷开关: 改为多选checkbox列表,支持批量启用/禁用
- 全局操作: 改为开关样式,显示分类和平台信息
- 启用状态列: 平台图标改为可点击的圆形开关按钮,支持一键切换
- 内容数量列: 新增"内容数"列,显示每个分类的内容条数(万级显示)
- 禁用分类显示: 开启平台后,禁用状态的分类依旧显示❌已禁用
Bug修复
- random_content: 修复表名映射(chengyu→cy, cidian→zc)和
$this->success()参数顺序错误 - content_count: 修复
strpos()错误,改用原生SQL查询 - quick_platform: 未指定ids时只操作is_enabled=1的分类,禁用分类保持不变
修改文件
docs/toolsapi/application/admin/controller/FeedWeight.php— 新增3个接口,修复success参数,原生SQL替代Db::namedocs/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、流量占比、是否对照组)
新增后台功能
- 实验列表页: 显示实验名称、目标平台、状态标签(草稿/运行中/已暂停/已结束)、流量占比、变体数量、操作按钮
- 新建实验: 实验名称、标识、描述、目标平台(下拉选择)、流量占比、计划时间、变体配置(动态添加,含权重覆盖弹窗)
- 编辑实验: 预填已有数据,运行中实验仅允许修改描述和结束时间
- 实验状态流转: 草稿→启动→暂停→恢复→结束,含校验(至少2个变体、流量占比总和100%、必须有对照组)
- 变体权重配置: 弹窗选择要覆盖的分类,设置权重值和启用状态,JSON格式存储
- 删除实验: 仅草稿状态可删除
新增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— 后台JSdocs/toolsapi/application/admin/lang/zh-cn/ab_test.php— 语言包
修改文件
docs/toolsapi/application/api/controller/Feed.php— 新增ab_test_config接口和_getAbTestConfig方法
weight_config 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—currentPlatformgetter 增加 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 方法,改用 DeepLinkResolverlib/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项)
- 修复页面报错:index.html模板
{:foreach}语法错误改为{foreach} - random_content性能优化:
ORDER BY RAND() LIMIT 1替代COUNT+OFFSET - 事务包裹:
quick_all_platforms/quick_all_categories/batch_platform/reset_defaults/sync均加事务 - SQL注入防护:
random_content/sub_categories加白名单校验(_isValidTable()) - 缓存清理完善:清除所有平台维度的缓存key + 模板编译缓存
- platform_count排序优化:MySQL JSON_EXTRACT函数替代PHP内存排序
- 快捷操作批量选择:选中分类后快捷平台操作只影响选中的分类
- 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
✨ 新功能 — 推荐权重管理后台全面升级
功能描述
后台推荐权重管理页面全面升级:启用状态列显示平台图标、平台开关交互修复、快捷操作面板、内容类型中文显示、表头排序、随机内容预览、子类查询等。
变更清单
- 启用状态列改为显示平台图标: 列表页不再显示"启用/禁用"文字,改为显示7个平台emoji图标,开启的图标正常显示,关闭的图标半透明+分隔线
- 修复平台开关点击无反应: 根因是ThinkPHP模板引擎无法用
$row.platform_data[$key]访问变量key的数组元素,改为JavaScript动态生成平台开关按钮 - 平台数量排序: 新增"平台数"列,显示"开启数/7",支持点击排序
- 禁用状态下不可编辑平台开关: 编辑视图中is_enabled=0时,平台开关变灰不可点击,切换启用状态时自动联动
- 快捷操作面板: 列表页新增"快捷操作"按钮,展开面板包含:
- 一键开启/关闭某平台(7个平台×开/关=14个按钮)
- 一键启用/禁用某分类(下拉选择+启用/禁用)
- 全局操作:全部开启/关闭平台、全部启用/禁用分类
- 内容类型显示中文名: nameMap从17种扩展到44种,所有内容类型显示emoji+中文名
- 表头排序: ID/内容类型/推荐权重/展示权重/推送上限/启用状态/平台数 均支持点击排序
- 随机内容预览: 编辑视图新增"随机一条"按钮,AJAX获取该分类的随机一条数据
- 子类查询: 编辑视图新增"查看子类"按钮,显示该分类的总条数、字段列表、子类分组统计
新增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_enabledJSON参数,设置每个平台的开关状态 - 批量操作: 支持全选/全不选/反选/按平台切换
- 视图: 新增"平台操作"下拉菜单,支持一键操作;编辑页面新增平台开关按钮组(全选/反选/按平台切换)
- 恢复默认: 重置时所有平台开关恢复为开启
API变更
- 新增接口:
GET /api/feed/platform_config— 获取当前平台的内容分类配置 - 扩展接口:
channels/list/mix/weight_config新增platform参数,支持按平台过滤 - 平台传递: 支持
X-Platform请求头 +platformURL参数双重传递 - install接口: 新增分类时自动设置
platform_enabled默认值(所有平台开启) - 数据库:
fa_feed_weight_config表新增platform_enabledVARCHAR(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.phpdocs/toolsapi/application/admin/model/FeedWeightConfig.phpdocs/toolsapi/application/admin/view/feed_weight/index.htmldocs/toolsapi/application/admin/lang/zh-cn/feed_weight.phpdocs/toolsapi/application/api/controller/Feed.phplib/core/network/api_interceptor.dartlib/features/home/services/feed_service.dartlib/features/home/models/feed_model.dartlib/features/home/providers/home_feed_mixin.dartdocs/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上触发布局约束错误
根因分析
- LoginPage:
Center包裹SingleChildScrollView,在CupertinoPageScaffold中导致无限高度约束 - LoginPage:
PageView在Column中缺少高度约束(PageView需要有限高度才能布局) - 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.dartlib/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: 新增
systemIcongetter,系统会话图标映射 - 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.dartlib/features/home/presentation/providers/readlater/readlater_entry_widgets.dartlib/shared/widgets/media/thumbnail_image.dartlib/features/discover/models/chat_session.dartlib/features/discover/providers/chat_session_provider.dartlib/features/discover/presentation/widgets/session/session_row.dartlib/features/discover/presentation/widgets/session/session_search_bar.dartlib/features/discover/presentation/widgets/session/session_popup_menu.dartlib/features/discover/presentation/pages/chat/hidden_sessions_page.dartlib/features/home/presentation/providers/sentence_detail_sheet.dartlib/features/discover/presentation/widgets/chat_bubble/chat_bubble.dartlib/features/mine/settings/presentation/privacy/data_collection_info_page.dart
[v6.7.3] - 2026-06-08
🐛 修复 — Android端系统TTS不可用问题
问题描述
- Android端系统TTS引擎显示为不可用
- 点击播放按钮后一直转圈,无法朗读
- 仅在线TTS在Android上可用,鸿蒙端系统TTS和在线TTS均正常
根本原因
flutter_tts在Android端需要等待TTS引擎异步初始化完成,但代码未等待引擎就绪就调用speak()_initialized标志设置过早,在引擎实际就绪之前就标记为已初始化speak()方法没有超时机制,引擎未就绪时可能永远挂起,导致UI一直转圈- 缺少系统TTS失败时的自动回退机制
修复内容
- TtsService: 新增
_engineReady引擎就绪状态,通过getEngines/getLanguages验证引擎可用性 - TtsService: 新增
_waitForEngineReady()方法,Android端初始化时等待引擎就绪(最多5秒超时) - TtsService:
speak()添加8秒超时机制,防止无限挂起 - TtsService: 新增
onError错误事件流,通知UI层系统TTS失败 - TtsService: 新增
isEngineReadygetter,供外部检查引擎就绪状态 - TtsService: 新增初始化锁
_initCompleter,防止并发初始化 - TtsPlayerSheet: 新增系统TTS错误监听,失败时自动回退到在线TTS
- TtsPlayerSheet:
_startPlaying()增加引擎就绪检查,未就绪时直接回退 - TtsPlayerBar: 新增系统TTS错误监听和回退逻辑
- TtsPlayerBar:
_togglePlay()增加引擎就绪检查 - PluginHealthService: 改进TTS健康检查,先初始化再检查引擎就绪状态
- TtsPluginPage: 预览朗读增加引擎就绪检查,不可用时自动切换到在线TTS
- TtsPluginPage: 健康状态指示器增加系统TTS不可用提示
修改文件
lib/core/services/audio/tts_service.dartlib/shared/widgets/plugin/tts_player_sheet.dartlib/shared/widgets/media/tts_player_bar.dartlib/features/mine/settings/services/plugin_health_service.dartlib/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 和 AppGroupIdios/Runner.xcodeproj/project.pbxproj— 新增 ShareExtension targetios/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 + _MiniWaveformPainterlib/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
🐛 修复 — 句子广场选择分类后仍显示混合句子
问题
选择具体分类(如"古诗词")后,句子列表仍显示"推荐"模式的混合数据,而非所选分类的句子。
原因
selectType()切换分类时未清空旧句子列表,新数据加载期间仍显示旧的混合数据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_enabledsource_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宽度+Semanticslib/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— 全局快捷键+Semanticslib/shared/widgets/feedback/login_guard_widget.dart— i18n+onLogin+Semanticslib/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— 硬编码→i18nlib/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— 硬编码中文替换为 i18nlib/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— 新增搜索状态Providerlib/features/mine/profile/presentation/profile_page.dart— 添加搜索按钮入口lib/features/mine/signin/presentation/signin_page.dart— 部署LoginGuardWidgetlib/features/note/presentation/note_list_page.dart— 部署LoginGuardWidgetlib/features/mine/achievement/presentation/achievement_page.dart— 部署LoginGuardWidgetlib/features/daily_fortune/presentation/daily_fortune_page.dart— 部署LoginGuardWidgetlib/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, exportFailedTSettings(flat): featureExtension, plugin, pluginSubtitle, dailyReminder, dailyReminderSubtitle, reminderTime, reminderTimeSubtitle, developer, logLevel, logLevelSubtitleTSettingsInteraction: sfxFeedback, sfxFeedbackSubtitle, sfxStyle, sfxStyleSubtitle, shakeToSwitch, shakeToSwitchSubtitleTSettingsDisplay: screenAlwaysOn, screenAlwaysOnSubtitle, screenAlwaysOnOff, screenAlwaysOnReading, screenAlwaysOnAlways, screenAlwaysOnTitle, reopenOnboarding, reopenOnboardingSubtitle, navBarPosition, navBarPositionSubtitle, navBarPositionLeft, navBarPositionTitle, splitViewRatio, splitViewRatioSubtitle, splitViewRatioTitle, splitViewEnabled, splitViewEnabledSubtitle, shaderBackground, shaderBackgroundSubtitleTSettingsPrivacy: nearbyDiscovery, nearbyDiscoverySubtitleTSettingsAdvanced: 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 getterslib/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 getterslib/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修复 — 密保问题注册显示"服务器内部错误"
修复:跳过邮箱验证+密保问题注册时,点击完成注册显示"服务器内部错误"
后端根因:
tool_user表缺少gold字段,setInc('gold', 50)抛出未捕获PDOException → HTTP 500sec_question/sec_answer通过$extend传入User::create(),若字段不存在则INSERT失败- 注册后操作(验证状态/积分/金币)无try-catch保护,任何异常导致500
后端修复 (UserSecurity.php v10.2.1):
sec_question/sec_answer不再放入$extend,改为注册成功后单独UPDATE(带try-catch)gold字段操作增加容错:检测字段是否存在,不存在则跳过- 注册后所有操作包裹在整体try-catch中,确保任何失败不影响注册结果
- 数据库迁移:
tool_user表新增gold INT(10) UNSIGNED DEFAULT 0字段
客户端修复:
UserSecurityService.register()新增on ApiException catch分支,捕获ApiClient转换后的异常- 当检测到服务端内部错误(500/内部/服务器错误)时,自动尝试用注册凭据登录
- 若登录成功,确认注册已完成,返回用户信息(注册视为成功)
- 若登录也失败,才抛出原始错误
_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监听_ModalScopeStatusInheritedWidget 变化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 调度 postFrameCallbacklib/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(() {})强制重建。该方案存在两个隐患:deactivate可能被框架在 build 阶段触发 → 抛 "setState() or markNeedsBuild() called during build"- 错误的 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" 错误 - 修复:
- 重构
_buildActionButton不再包Expanded,由调用方决定是否用Expanded包裹 - 在
_buildActionButtons中显式使用Expanded作为 Row 的直接子节点,分享按钮的AnimatedScale/AnimatedOpacity仅包裹按钮内容 - 顺手为按钮文本添加
Flexible+maxLines: 1+overflow: ellipsis防止长文本溢出
- 重构
- 影响范围:每日心情页面卡片展开后的分享按钮交互
修改文件
lib/shared/widgets/charts/safe_chart_widget.dart— 移除 deactivate 中的 setStatelib/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 - 修复:
- 移除
AnimatedCrossFade,改用直接条件渲染(isExpanded ? expanded : collapsed),从根本上避免两个子 widget 同时存在 - 移除
.animate()入场动画,消除 flutter_animate GlobalKey 冲突 - 移除
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();移除 GlobalKeylib/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() ?? 0data['field'] as int? ?? 0→(data['field'] as num?)?.toInt() ?? 0data?['field'] as int? ?? 0→(data?['field'] as num?)?.toInt() ?? 0json['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 → SafeChartWidgetlib/features/mine/settings/presentation/privacy/permission_management_page.dart— DeferredBuilder → SafeChartWidgetlib/features/mine/achievement/presentation/achievement_page.dart— DeferredBuilder → SafeChartWidgetlib/features/tool_center/leisure/presentation/pages/leisure_settings_sections.dart— DeferredBuilder → SafeChartWidgetlib/features/mine/settings/presentation/plugin/translate_plugin_page.dart— DeferredBuilder → SafeChartWidgetlib/features/discover/presentation/pages/readlater_stats_page.dart— DeferredBuilder → SafeChartWidget(6处)lib/features/check/presentation/check_page.dart— DeferredBuilder → SafeChartWidgetlib/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 查找 RepaintBoundarylib/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+fromMaplib/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处内层 Expandedlib/features/home/presentation/home_daily_card.dart— Tilt 添加 enableGestureTouch: falselib/features/daily_card/presentation/daily_card_page.dart— Tilt 添加 enableGestureTouch: falselib/features/file_transfer/presentation/widgets/device_card.dart— Tilt 添加 enableGestureTouch: falselib/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— 使用 onboardingReviewlib/features/mine/settings/presentation/general/general_settings_page.dart— 使用 onboardingReviewlib/features/mine/settings/presentation/more_settings_page.dart— 使用 onboardingReview =======
🐛 安卓端长按桌面图标快捷方式闪退修复
问题
安卓端长按桌面图标,点击弹出的快捷方式(主题个性化/通用设置),App直接卡死闪退。鸿蒙端和iOS端正常。
根因
quick_actions_android插件在冷启动时,initialize()回调可能在 GoRouter 完全初始化之前被调用- 此时
appRouter.push(route)执行时路由系统未就绪,抛出未捕获异常导致闪退 _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是 RiverpodProvider<GlobalKey>,全局只创建一个 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— 移除detailCardKeyProviderlib/features/home/presentation/panels/sentence_detail_panel.dart— 新增实例级_cardKey,传递给子组件lib/features/home/presentation/panels/sentence_detail_content.dart— 接收cardKey参数替代全局 Providerlib/features/home/presentation/panels/sentence_detail_actions.dart— 接收cardKey参数替代全局 Providerlib/features/progress/presentation/progress_beautify_page.dart— 修复_argslate 初始化错误 =======
🐛 鸿蒙端多场景卡死修复
问题
- SearchType.validateAll 逐条日志导致鸿蒙端IDE卡死 — 每个不支持的类型单独调用
Log.w(),产生大量日志输出(11条重复格式警告),在鸿蒙端debug模式下导致IDE卡死 - MissingPluginException 卡死 —
checkPendingManageStorage方法在鸿蒙端没有原生实现,调用时抛出MissingPluginException - 个人中心页面卡死 —
_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<String, GlobalKey>按日期索引,每个 FortuneRecord 拥有独立 GlobalKey - 影响范围:运势卡片展开/收起、分享截图功能
修改文件
lib/features/auth/models/user_model.dart— 新增getIsActiveByTimegetterlib/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.mdv9 — 删除差异对照表中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种语言文件同步更新 - 日志量精简 —
appLoggerprinter 改为简洁模式(关闭颜色/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— 补充 moduleNameohos/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 overridepubspec.macos.yaml— 同步补充4个依赖 + quill_native_bridge_windows path overridepubspec.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.nearbyP2plib/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登录,修复注册流程
审核被拒问题修复
- Guideline 2.1 — NFC功能需演示视频 → 移除全部NFC功能代码、权限声明和依赖(flutter_nfc_kit、ndef)
- Guideline 4 — 登录跳转外部浏览器 → 移除"Web登录"按钮(原跳转
https://tools.wktyl.com/web-login至系统浏览器) - Guideline 2.1(a) — 注册收不到验证码 → 修复注册流程:点击"下一步"进入验证码步骤时自动发送邮件验证码并启动倒计时,无需手动点击"重新发送"
- 蓝牙功能移除 → 蓝牙仅用于设备发现(非数据传输),已有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/蓝牙配对服务和UIlib/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文件中的相关引用:
- permission-usage.html — 移除"蓝牙权限"章节(原第五节),重新编号后续章节(附近设备权限→第五节,网络权限→第六节,权限管理原则→第七节,权限变更→第八节,联系方式→第九节,法律适用→第十节),版本号 V6.5 → V6.6
- privacy-policy.html — 业务功能映射表中"文件传输助手"的权限从"蓝牙/位置/附近设备权限"更新为"位置/附近设备权限",版本号 V6.6 → V6.7
- 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 编译运行关键问题修复
修复问题
- Hive 初始化失败导致 KvStorage 全部降级 — 根因:
HiveSafeAccess使用hive_flutter的Hive.initFlutter()初始化,但用hive_ce的Hive.openBox()打开 Box,两个包的 Hive 单例不同,导致所有 Box 打开失败:- 统一所有代码使用
hive_flutter包,替换全部hive_ce引用 - 涉及 8 个文件的 import 替换
- 统一所有代码使用
- KvStorage 未初始化警告 —
GeneralSettingsNotifier.build()同步调用约 48 次KvStorage.getBool/getString/getInt,当 Hive 初始化失败时产生大量警告:- 改为延迟加载模式(与
ThemeSettingsNotifier一致),先返回默认值,再通过Future.microtask从存储加载
- 改为延迟加载模式(与
- macOS Release 构建签名失败 —
Release.entitlements中keychain-access-groups需要开发者证书签名:- 设置
CODE_SIGN_IDENTITY = "-"(ad-hoc 签名) - 移除
keychain和keychain-access-groupsentitlements
- 设置
- macOS Impeller 未启用 —
LiquidGlassLayer需要 Impeller 渲染引擎,macOS 默认使用 Skia:- 在
Info.plist中添加FLTEnableImpeller = true启用 Impeller
- 在
- MissingPluginException: checkPendingManageStorage — 数据管理 MethodChannel 仅鸿蒙平台实现:
_initDataManagementChannel()添加!pu.isOhos判断,非鸿蒙平台跳过
- RenderFlex overflow 弹窗 — 布局溢出错误在 debug 模式下显示红色溢出指示器:
main.dart中FlutterError.onError拦截overflowed错误,仅打印日志不弹窗
- 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_flutterlib/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-hocmacos/Runner/Release.entitlements— 移除 keychain 权限macos/Runner/Info.plist— 启用 Impeller
[v6.19.1] - 2026-06-05
🐛 Bug修复 — FontSyncService API返回数据类型解析错误
修复问题
- FontSyncService 类型转换崩溃 —
fetchOnlineFonts()中result['data'] as List<dynamic>?抛出异常:- API
/api/font_sync/list返回data: {"fonts": [...], "count": N},data是Map而非List - 修复为兼容 Map 和 List 两种格式,优先从
data.fonts取字体列表 - 修复前:iPad运行时抛出
type '_Map<String, dynamic>' is not a subtype of type 'List<dynamic>?' in type cast,导致字体同步失败回退到本地数据
- API
修改文件
lib/features/mine/settings/services/font_sync_service.dart— 修复data字段类型解析逻辑
[v6.19.0] - 2026-06-05
📋 结构化日志 — LogCategory 按模块控制日志级别
新增功能
- LogCategory 枚举 — 在
logger.dart中新增LogCategory枚举,支持 17 个模块分类:- UI、网络、路由、存储、设备、认证、传输、搜索、图表、触觉、状态、服务、同步、离线、引导、推送、通用
- 每个分类有独立的默认日志级别(如 chart/haptic 默认 warning 减少噪音)
- 分类级别控制 — 支持动态调整每个分类的日志级别:
LogCategory.setLevel()设置单个分类级别LogCategory.setAllLevels()批量设置所有分类级别LogCategory.resetLevels()重置为默认级别LogCategory.exportCustomLevels()/importCustomLevels()支持持久化
- Log 方法扩展 —
Log.d/i/w/e/f方法新增可选LogCategory? category参数:- 向后兼容:不传 category 默认为
LogCategory.general - 日志输出自动添加分类标签(如
[网络],[路由]) - 分类级别过滤:低于分类当前级别的日志不输出到控制台(仍记录到内存缓冲区)
- 向后兼容:不传 category 默认为
- LogEntry 扩展 —
LogEntry新增category字段,支持按分类筛选 - 日志查看器分类筛选 — 日志查看器页面新增分类过滤栏,支持按模块筛选日志
- 日志级别设置页面 — 在通用设置"开发者"分组中新增"日志级别"入口:
- 展示所有分类及其当前级别
- 点击分类弹出级别选择器
- 提供"全部Debug"和"重置默认"快捷操作
- 自定义级别标记"自定义"标签
修改文件
lib/core/utils/logger.dart— 添加 LogCategory 枚举、修改 Log 方法签名、LogEntry 添加 categorylib/core/router/app_router.dart— Log 调用添加 LogCategory.routerlib/core/router/ohos_nav_bridge.dart— Log 调用添加 LogCategory.routerlib/core/router/ohos_route_types.dart— Log 调用添加 LogCategory.router/authlib/core/services/device/haptic_service.dart— Log 调用添加 LogCategory.hapticlib/core/services/device/device_info_service.dart— Log 调用添加 LogCategory.device/networklib/features/home/providers/home_provider.dart— Log 调用添加 LogCategory.providerlib/features/file_transfer/providers/transfer_notifier.dart— Log 调用添加 LogCategory.transferlib/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 支持
新增功能
- 无障碍服务 — 创建
AccessibilityService单例,管理系统无障碍状态检测、语义调试开关、语义标注辅助方法 - 通用设置-无障碍分组 — 在通用设置页面"显示"分组后新增"♿ 无障碍"分组,包含:
- 语义调试开关(开发者选项,可手动切换)
- 高对比度指示(跟随系统,只读)
- 减少动画指示(跟随系统,只读)
- 粗体文本指示(跟随系统,只读)
- 关键页面Semantics标注 — 为以下组件添加
Semantics(label/hint/value)标注,支持 iOS VoiceOver 和鸿蒙 TalkBack:- 首页句子卡片(
SentenceCard)— 朗读句子内容、作者、互动状态 - 排行榜项卡片(
RankItemCard)— 朗读排名、用户名、等级、数值 - 日签卡片页面(
DailyCardPage)— 朗读日签内容,保存/分享按钮标注
- 首页句子卡片(
- 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/setterlib/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 工具中心部分页面显示"不支持此页面" — 为缺少ohosBuilder的路由添加鸿蒙端页面构建器
- 1.2 长按桌面图标无快捷按钮 — module.json5添加shortcuts配置(主题个性化+通用设置)
- 1.3 我的设备下线/移除报错"验证未通过" — 鸿蒙端跳过LocalAuthentication生物识别,直接弹确认对话框
- 1.7 账户洞察鸿蒙端设备识别异常提示 — 鸿蒙端显示"部分设备可能会出现识别异常"蓝色提示条
- 1.9 HapticService降级警告 — 鸿蒙端直接跳过flutter_vibrate检测,日志降级为debug级别
- 1.11 鸿蒙端设备显示"未知设备" — 增加manufacturer/hardware/device字段回退链,Web端精确识别浏览器
通用修复
- 1.5 句子详情外部搜索内容为空 — 使用_resolveDisplayText()获取最合适的搜索文本
- 1.8 重新打开引导页没反应 — 先重置onboarding完成状态再导航
- 1.10/1.12 RenderChartFadeTransition disposed错误 — DeferredBuilder添加disposed标志+图表页面mounted检查
- 2 工具中心搜索类型不支持 — 更新搜索类型映射与API一致
- 2.1 预置词搜索 — ToolListPage/ToolSearchPage/HanziToolPage添加热门搜索标签
- 3 文章广场点击文章不显示内容 — 清除旧数据+完善错误状态展示
- 4 RenderFlex overflow弹窗改为日志 — overflow错误仅记录Log.w不传递给原始处理器
- 6 引导页完成按钮loading优化 — loading状态动态切换文字(正在准备/加载/初始化/即将完成)
- 7 日签卡片保存分享按钮移到appbar — 保存分享移到navigationBar trailing
- 8 文件传输配对码页面缺少Appbar — 替换为始终可见的返回按钮
- 9 减少不必要的日志打印 — 缓冲区减半+Log.i节流5秒+路由日志降级
- 10 排行榜隐私保护 — 所有排行类型<50人时显示隐私提示,序号用*代替
- 11 离线模式/收藏页面重复图标 — 移除dialog重复icon+修复双emoji问题
Web端修复
- 5.1 引导页协议链接不跳转 — 使用rootNavigator确保跨ShellRoute导航
- 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_vibratelib/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— 移除重复iconlib/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— 保存分享移到appbarlib/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
🔧 工具中心三合一修复 — 鸿蒙端路由 + 搜索类型 + 预置词搜索
问题
- 鸿蒙端工具中心部分页面显示"不支持此页面" —
hanzi-tool、calc-tool、tool-list三个关键路由缺少ohosBuilder,导致 OhosNavBridge 无法匹配路由,显示"鸿蒙端暂不支持此页面" - 搜索类型不支持 —
SearchType.changshi的值为'cs'(对应 searchall 接口),但 hanzi/search 接口实际支持changshi类型,导致搜索返回"不支持的搜索类型" - 缺少预置词搜索 — 工具中心页面无热门搜索词引导,用户需要手动输入关键词,体验不佳
修复
- 鸿蒙端路由 — 为
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 传递 presetKeywordslib/core/router/ohos_placeholders.dart— buildToolListOhosWidget/buildNickToolOhosWidget 传递 presetKeywordslib/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 属性和热门搜索标签UIlib/features/discover/presentation/pages/tool_search_page.dart— 新增 presetKeywords 属性和热门搜索标签UIlib/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离线构建回退
问题
- sqlite3_flutter_libs无法从sqlite.org下载 — CMake构建时尝试从sqlite.org下载SQLite源码,因网络不可达导致构建失败
- 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<void>的异步函数,在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保护
问题
Platform._operatingSystem不支持 — Web端dart:io的Platform类不可用,多个文件直接使用Platform.isAndroid/Platform.isIOS等导致运行时Unsupported operation异常path_providerMissingPluginException — Web端getApplicationSupportDirectory()/getTemporaryDirectory()等无原生实现,多个文件直接调用导致异常- Catcher2 Zone mismatch —
main()中runZonedGuarded与 Catcher2 内部runZonedGuarded嵌套导致 Zone 不一致警告 - 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:ioAPI - 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— 移除外层 runZonedGuardedlib/core/services/catcher2_config_service.dart— 添加 navigatorKeylib/core/services/device/device_info_service.dart— Platform → pulib/core/utils/platform/ohos_compatibility_helper.dart— kIsWeb 保护lib/core/utils/platform/platform_io_native.dart— 新增 platformVersionImpllib/core/utils/platform/platform_io_stub.dart— 新增 platformVersionImpllib/core/utils/platform/platform_utils.dart— 新增 platformVersionlib/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 → pulib/features/home/presentation/date_config_sheet.dart— Platform → pulib/core/services/notification/notification_service.dart— Platform → pulib/core/services/notification/local_notification_service.dart— Platform → pulib/features/home/presentation/home_sentence_card.dart— kIsWeb 保护lib/features/onboarding/presentation/widgets/mesh_gradient_background.dart— Platform → pulib/core/services/auth/permission_service.dart— Platform → pulib/shared/widgets/media/safe_cached_image.dart— kIsWeb 保护lib/features/home/services/cache_service.dart— pathSeparator → '/'lib/shared/widgets/feedback/share_sheet.dart— Platform → pulib/features/tool_center/leisure/presentation/widgets/leisure_share_sheet.dart— Platform → pulib/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端编译+运行修复 — 登录闪退+编译错误+平台兼容
问题
- 登录闪退 — Windows端输入账户密码后点击登录,应用崩溃闪退
- 根因:
FlutterSecureStorageWindows.write()中_backwardCompatible.delete()未 await,在 Windows 上MethodChannelFlutterSecureStorage未注册原生实现,抛出MissingPluginException成为未处理异步异常 - 次因:
SecureStorage缺少 Windows 降级方案(macOS 有 SharedPreferences 替代,Windows 没有)
- 根因:
- 编译错误 — 多个文件使用
kIsWeb但未导入package:flutter/foundation.dart - 语法错误 —
more_settings_page.dart工厂重置方法中多余}导致 try-catch 结构破坏 - 平台兼容 —
Platform.isAndroid在progress_share_card.dart中未通过pu封装使用 - 桌面端兼容 —
QuickActionsService在桌面端调用移动端 API - 设备注册 —
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.dartgeneral_fields_provider.dartchat_file_service.dartdata_export_service.dartchat_audio_service.dartreadlater_device_sync_service.dart
修改文件:
packages/flutter_secure_storage_windows/lib/src/flutter_secure_storage_windows_ffi.dartlib/core/storage/secure_storage.dartlib/features/auth/providers/auth_provider.dartlib/core/services/device/quick_actions_service.dartlib/features/progress/presentation/progress_share_card.dartlib/features/mine/settings/presentation/more_settings_page.dartlib/features/mine/settings/providers/general_settings_provider.dartlib/features/mine/settings/providers/sub/general_fields_provider.dartlib/features/discover/services/chat_file_service.dartlib/core/services/data/data_export_service.dartlib/features/discover/services/chat_audio_service.dartlib/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.dartlib/core/services/data/backup_service.dartlib/core/services/data/settings_export_service.dartlib/core/services/data/image_cache_metadata_service.dartlib/core/network/api_client.dart
[v6.16.4] - 2026-06-04
🐛 鸿蒙端编译修复 — Form小组件不兼容API清理
问题
鸿蒙端 flutter build hap 编译失败,81个错误,根因:
- Form小组件使用了不支持的API —
bindContextMenu、MenuItem、Placement、onLongPress、vibrator在鸿蒙Form(卡片)环境中不可用 - 缺少图标资源 —
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.etsohos/entry/src/main/ets/formability/pages/CheckinFormPage.etsohos/entry/src/main/ets/formability/pages/DailySentenceFormPage.etsohos/entry/src/main/ets/formability/pages/ReadlaterFormPage.etsohos/entry/src/main/ets/formability/pages/DailyCardFormPage.etsohos/entry/src/main/ets/formability/pages/FortuneFormPage.etsohos/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.dartshare_sheet.dart,leisure_share_sheet.dart,progress_share_card.dart,chat_video_bubble.dart,china_colors_page.dartexport_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.dartprogress_beautify_page.dart,signin_page.dart,app_lock_pattern_setup.dart,image_cache_page.dart,chat_flow_page.dart,weather_settings_page.darthot_search_page.dart,security_question_page.dart,change_password_page.dart,sentence_detail_sheet.dartapp_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