58 KiB
Changelog
所有重要变更均记录于此文件。格式基于 Keep a Changelog。
[v14.25.0] - 2026-05-19
新增
- 协议多语言(中文+英文)全面适配,本地端+网页端同步支持:
agreement_data.dart新增10个英文协议常量(privacyPolicyContentEn ~ devTeamContentEn),完整翻译所有协议agreement_data.dart的 getContent/getSubtitle/getUpdateDate 增加 languageId 参数,根据语言返回对应内容agreement_types.dart枚举新增 titleEn/subtitleEn 字段,新增 titleFor()/subtitleFor()/webUrlFor() 方法agreement_page.dart改为 ConsumerWidget,从 appLocaleProvider 获取当前语言,传递给数据层agreement_list_page.dart改为 ConsumerWidget,标题/副标题/分组名/页脚全部支持中英文- 网页端HTML生成脚本改造为双语版:每个HTML包含中英文两套内容,JS控制显示切换
- 网页端新增语言切换按钮(右上角毛玻璃胶囊:中文/EN),支持URL参数 ?lang=en
- 网页端 index.html 同步支持双语,英文版链接自动附加 ?lang=en
- 脚本自动提取中文(xxxContent)和英文(xxxContentEn)两套常量,分别生成HTML内容
变更
- 协议展示页面UI文案("在线版"、"最后更新日期"、"软件协议"等)根据当前语言动态切换
- 网页端"返回协议列表"按钮根据语言显示中文/英文
- 英文协议中公司名"微风暴"翻译从"Weibao Storm"更正为拼音"Weifengbao"(Mile City Pengpu Town Weifengbao Network Technology Studio)
[v14.24.0] - 2026-05-19
新增
- 协议与隐私政策V6.5综合合规更新(P0-P3优先级全部完成):
- 隐私政策新增定义章节(零、定义),明确关键术语含义
- 新增业务功能与个人信息映射表,逐项说明各功能收集的信息类型及必要性
- 补充第三方SDK详细信息表(Flutter SDK + Supabase Flutter SDK),含提供者、收集信息、使用目的、隐私政策链接
- 新增儿童年龄验证机制(14周岁以下禁止注册,注册时确认年龄)
- 明确各类信息存储期限(账号信息、用户内容、崩溃日志等7类),以表格形式展示
- 完善跨境传输条款(当前不跨境,未来需安全评估+单独同意)
- 完善个人信息保护负责人信息(邮箱:gg@0gg.cc)
- 各协议统一增加法律适用与争议解决条款(适用中国法律,管辖法院)
- 统一地址为"云南省昆明市西山区滇池度假区",增加统一社会信用代码92532526MA6PCX153W
- 免责声明增加消费者权益保留条款
- 软件介绍/新手指引增加法律声明引用
- AI功能统一标注为"规划中"
- 注销流程根据实际代码更新(3天审核期+安全验证+状态查询+倒计时)
- 软件著作权登记号2020SR0421982加入免责声明和开发团队页面
- 协议HTML网页端同步更新并上传服务器(https://tools.wktyl.com/agreements/)
- 软著证书图片展示(免责声明+开发团队页面)
- 自动化生成脚本:从Dart数据提取→Markdown转HTML→上传服务器
修复
- 修复"继续使用即同意"条款为"主动确认同意"机制
- 修复英文名称 WordsLeisure → Xianyan
- 修复账号协议与儿童隐私年龄矛盾(14岁以下禁止注册,统一标准)
- 修复accountAgreementContent三引号结束符错误(
'';→''') - 修复accountAgreementContent章节编号重复(两个"八"→"八、联系方式"+"九、法律适用")
[v14.23.0] - 2026-05-19
重构
- 全平台包名统一为
apps.xy.xianyan,替换原有不统一的com.example.xianyan和com.xianyan- Android:
build.gradle.kts的namespace/applicationId,MainActivity.kt包声明和 import,8个 Widget Provider 包声明和 import,BleAdvertiserPlugin.kt包声明和 MethodChannel - Android: Kotlin 源码目录从
com/example/xianyan和com/xianyan迁移到apps/xy/xianyan - iOS:
Info.plist的 URL Scheme 和 App Group ID,project.pbxproj的 PRODUCT_BUNDLE_IDENTIFIER,XianyanWidget.swift的 App Group ID - macOS:
AppInfo.xcconfig的 PRODUCT_BUNDLE_IDENTIFIER 和 PRODUCT_COPYRIGHT,project.pbxproj的 PRODUCT_BUNDLE_IDENTIFIER - Linux:
CMakeLists.txt的 APPLICATION_ID,.desktop和.appdata.xml文件内容和文件名重命名,3个打包脚本 - Windows:
Runner.rc的 CompanyName 和 LegalCopyright - 鸿蒙:
app.json5的 bundleName - Flutter/Dart:
widget_type.dart的 qualifiedAndroidName,home_widget_service.dart的 App Group ID,bluetooth_pairing_service.dart和hotspot_service.dart的 MethodChannel,about_page.dart的华为应用市场链接
- Android:
[v14.22.0] - 2026-05-19
修复
- Android
requestPinWidget/updateWidget调用时androidName仅传短类名(如DailySentenceProvider),home_widget插件拼接context.packageName后变成com.example.xianyan.DailySentenceProvider,与实际类包名com.xianyan.widget.DailySentenceProvider不一致导致ClassNotFoundExceptionwidget_type.dart新增qualifiedAndroidName属性,返回完整类名com.xianyan.widget.XxxProviderhome_widget_service.dart的updateWidget()增加qualifiedAndroidName参数widget_provider.dart的requestPinWidget()增加qualifiedAndroidName参数- 插件优先使用
qualifiedAndroidName,避免错误的包名拼接
- 鸿蒙
readlater_form.json的supportDimensions包含非法值"4*1",不在鸿蒙允许列表(1*2/2*2/2*4/4*4/1*1/6*4/2*3/3*3)中,导致构建校验失败- 修改为合法值
"2*4"
- 修改为合法值
验证
- 已检查全部8个鸿蒙 form 配置文件的
supportDimensions和defaultDimension,无其他非法值
修复
- HomeWidgetService
_notifyUpdate方法 ohosName 硬编码为'dailySentence',导致稍后读小组件调用时刷新错误卡片- 删除
_notifyUpdate方法,updateReadlaterCount/updateReadlaterPreview/updateDailySentence统一使用updateWidget(WidgetType)方法 - 清理不再使用的
_androidWidgetName/_iosWidgetName常量
- 删除
- 鸿蒙所有卡片未处理点击跳转事件
- 所有8个 FormPage 添加
postCardAction点击事件,传递对应 action - 所有8个 FormAbility 添加
onFormEvent方法,解析 action 后通过startAbility跳转到对应页面 - 跳转路由与 WidgetType.deepLinkRoute 保持一致
- 所有8个 FormPage 添加
AppLocale.system.locale硬编码返回Locale('zh', 'CN'),改为返回WidgetsBinding.instance.platformDispatcher.locale- 修复非中文系统用户选择"跟随系统"时始终显示中文的问题
- Android 所有8个 Widget Provider 缺少
import com.example.xianyan.R,导致Unresolved reference 'R'编译错误- Provider 在
com.xianyan.widget包下,R 类生成在com.example.xianyan包下,需显式导入
- Provider 在
CheckinProvider.kt字符串模板"连续$days天"语法错误,Kotlin 将days天视为整体标识符- 修复为
"连续${days}天",使用大括号语法明确变量边界
- 修复为
验证
CountdownProvider.kt使用java.time.LocalDate/ChronoUnit,因 minSdk=26 且已启用 desugaring,不存在兼容性问题,无需修改
[v14.20.0] - 2026-05-19
重构
- settings/presentation 目录整理:23个文件按功能域分组到4个子目录(每个≤8文件)
general/(5文件): 通用设置页面、选择器、操作、分组、模型theme/(5文件): 主题设置页面、基础/样式/预览区块、共享组件account/(4文件): 账户设置、注销、改密、安全问题privacy/(3文件): 权限管理、隐私政策、日志查看- 根目录保留6个独立页面: data/font/language/more/notification/smart_mode
- 同步更新 app_router.dart 和 ohos_nav_bridge.dart 的 import 路径
[v14.19.0] - 2026-05-19
新增
- 多语言(i18n)系统P3升级
- 语言切换动画: _LocaleTransitionWrapper组件,切换语言时淡入淡出过渡(300ms easeOut),尊重动画开关设置
- 4种新语言支持: 印地语(हिन्दी)/葡萄牙语(Português)/俄语(Русский)/法语(Français),共11种语言+跟随系统
- 语言智能排序: AppLocale.smartSorted(),根据系统语言自动将最相关语言排到前面(匹配语言+国家100分/匹配语言80分/中文50分/英文40分/其他20分)
- 翻译导入功能: TranslationIOService.importFromJson(),协同翻译ActionSheet增加"Import Translation"选项,支持粘贴JSON导入翻译
- 翻译导入UI: CupertinoAlertDialog+CupertinoTextField输入框,支持验证/确认/错误提示
修改
app_locale.dart: 增加4种语言枚举(hi/pt/ru/fr)+smartSorted()+_relevanceScore()translations.dart: 增加4种语言翻译常量(_hi/_pt/_ru/_fr)+更新getTranslations/resolveSystem/Coveragetranslation_io_service.dart: 增加importFromJson()+_importNav/_importCommon/_importProfile/_importSettingsapp.dart: 增加_LocaleTransitionWrapper语言切换动画组件language_settings_page.dart: 使用smartSorted()排序+增加Import Translation选项+导入对话框
[v14.18.0] - 2026-05-19
新增
- 文件传输Web平台适配 (P3-17)
PlatformHelper: 新增supportsFilePicker/supportsImagePicker/supportsLocalNetwork能力检测transfer_chat_file_send.dart: Web平台跳过File().lengthSync()/existsSync()等不支持操作,大文件检测和离线队列适配qr_code_tab.dart: Web平台无摄像头时显示手动输入配对码对话框,扫描按钮文案/图标自适应
- 文件传输HarmonyOS平台适配 (P3-16)
DegradationManager: screenCapture始终返回full(已使用RepaintBoundary零权限方案),新增harmonyNearby功能检测device_pairing_page.dart: 其他配对方式新增"📡 鸿蒙Nearby"卡片,非鸿蒙平台显示降级提示transfer_enums.dart: PairingMethod新增harmonyNearby枚举值
修改
platform_helper.dart: 新增3个Web能力检测getterdegradation_manager.dart: screenCapture简化为始终full,allCapabilities/isFeatureAvailable新增harmonyNearbytransfer_chat_page.dart: 新增platform_helper.dart导入(供part文件使用)
[v14.17.0] - 2026-05-19
重构
- 通用设置页面拆分为多文件结构 (1755行→5个文件,每个≤800行)
setting_models.dart(88行): 数据模型 SettingSection/SettingItem/SettingTypegeneral_settings_sections.dart(386行): 设置分组构建 + 搜索过滤general_settings_pickers.dart(650行): GeneralSettingsPickers mixin,8个CupertinoPicker弹窗general_settings_actions.dart(293行): GeneralSettingsActions mixin,操作对话框general_settings_page.dart(529行): 主页面,mixin组合
- 主题设置页面拆分为多文件结构 (1906行→5个文件,每个≤800行)
theme_shared_widgets.dart(105行): 共享组件 ThemeSectionHeader/ThemeOptionChiptheme_sections_basic.dart(692行): 预设/外观/定时深色/强调色/字体/毛玻璃/动画theme_sections_style.dart(627行): 圆角/卡片/Tab表情/Tab造型/壁纸/重置theme_sections_preview.dart(507行): 实时预览/动画演示/主题分享theme_settings_page.dart(88行): 主页面
[v14.16.0] - 2026-05-19
新增
- 多语言(i18n)系统全面升级
- 阿拉伯语RTL支持: AppLocale增加isRTL/textDirection属性,app.dart用Directionality包裹全局
- 系统语言变化监听: didChangeLocales回调+SystemLocaleVersionNotifier,"跟随系统"实时响应
- T类拆分分组: TNav(3字段)/TCommon(16字段)/TProfile(25字段)/TSettings(100字段),访问方式 t.nav.home / t.common.cancel
- 向后兼容: T类保留144个@Deprecated getter,旧代码 t.navHome 仍可用
- 参数化翻译: TFunc类(entriesCount/greeting/itemsSelected/pluralItems),7种语言复数处理
- 翻译fallback: T.withFallback()方法,缺失字段自动回退到zh_CN
- 翻译覆盖率检测: TranslationCoverage工具类,语言设置页底部显示各语言覆盖率进度条
- 协同翻译功能: 导出当前语言/全部语言翻译为JSON到剪贴板,CupertinoActionSheet操作面板
- 日期/数字格式化: localeDateFormatProvider/localeNumberFormatProvider,基于intl包
- localizationDelegates补全: 添加GlobalCupertinoLocalizations.delegate
- RTL标识: 阿拉伯语语言项显示RTL标签
- 翻译IO服务: TranslationIOService(exportToJson/exportAllToJson/validateTranslationJson)
修改
app_locale.dart: 增加isRTL/textDirection/systemLocaleVersionProvider/appTextDirectionProvider/localeDateFormatProvider/localeNumberFormatProvidertranslations.dart: T类重构为组合模式(TNav+TCommon+TProfile+TSettings),增加TFunc+TranslationCoverageapp.dart: Directionality包裹+didChangeLocales回调+_localizationsDelegates提取为常量+GlobalCupertinoLocalizationslanguage_settings_page.dart: 协同翻译ActionSheet+覆盖率面板+RTL标识+使用t.nav/t.common/t.settings分组访问translation_io_service.dart: 新增翻译导出/导入/验证服务
[v14.15.0] - 2026-05-19
新增
- 应用内屏幕共享功能 (InApp Screen Share)
InAppScreenCaptureService: 使用RepaintBoundary+toImage()截图流,无需系统权限- 支持可配置FPS(1-30)和JPEG质量(0.1-1.0)
- 帧数据通过信令通道
screen-share-frame传输,base64编码 - 帧发送节流(80ms最小间隔),防止信令洪泛
- 接收端实时解码显示,支持InteractiveViewer缩放
- ScreenSharePage新增帧信息栏(帧数/分辨率/大小/InApp标识)
重构
ScreenCaptureService: 移除MethodChannel/EventChannel,改用InAppScreenCaptureServicerequestPermission()始终返回true(无需系统权限)- 新增
setRepaintBoundaryKey/setFps/setQuality/framesStream接口
ScreenSharePage: 移除RTCVideoRenderer/RTCVideoView,改用Image.memory帧显示ScreenShareState: 新增currentFrame/frameCount字段ScreenShareNotifier: 新增_listenFrameSend/_listenFrameReceive帧收发逻辑SignalingService: 新增screenShareFrame信令类型和sendScreenShareFrame方法transfer_chat_page: 主内容区包裹RepaintBoundary,初始化时设置Keytransfer_chat_screen_share: 移除PlatformHelper.supportsScreenCapture检查,两个共享选项始终可用
移除
ScreenCaptureService中的MethodChannel/EventChannel(不再需要原生屏幕捕获)transfer_chat_page中platform_helper.dart的import(不再使用)
[v14.14.0] - 2026-05-19
重构
- 通用设置页面拆分为多文件结构 (1755行→5个文件,每个≤800行)
setting_models.dart(88行): 数据模型 SettingSection/SettingItem/SettingType,从私有类改为公开general_settings_sections.dart(386行): 设置分组构建函数 buildGeneralSettingSections + 搜索过滤 filterSettingSectionsgeneral_settings_pickers.dart(650行): GeneralSettingsPickers mixin,封装8个CupertinoPicker弹窗 + 转场模式描述组件general_settings_actions.dart(293行): GeneralSettingsActions mixin,封装缓存清理/重置/导出导入等操作对话框general_settings_page.dart(529行): 主页面,通过 mixin 组合 Pickers + Actions,保留UI构建和事件处理
[v14.13.0] - 2026-05-19
重构
- 多语言翻译系统组合模式重构 (
translations.dart)- T类拆分为组合模式:T内含4个子类字段
nav(TNav),common(TCommon),settings(TSettings),profile(TProfile) - TNav(3字段): home/discover/profile
- TCommon(16字段): cancel/ok/save/confirm/clear/reset/delete/success/failed/enabled/disabled/loading/view/search/entriesCountUnit/copyright
- TProfile(25字段): title/myFavorites/readingHistory/darkMode/accountSettings等个人中心字段
- TSettings(100字段): language/generalSettings/interaction/sound等所有设置相关字段
- 向后兼容:T类保留所有144个原有顶级字段作为@Deprecated getter委托到子类,现有
t.navHome代码不会报错 - 新增TFunc参数化翻译类:entriesCount/greeting/itemsSelected/pluralItems 4个方法,支持7种语言的复数/参数化翻译
- 新增T.withFallback()静态方法:将fallback中非空字段覆盖target中为空的字段
- 新增TranslationCoverage工具类:checkAll()返回各语言覆盖率,checkCoverage()返回缺失字段列表
- 新增translationsFuncProvider:Riverpod Provider返回TFunc实例
- 新增_resolveSystemLanguageId()辅助函数
- 7种语言常量完整保留所有翻译值
- T类拆分为组合模式:T内含4个子类字段
修改
translations.dart: T类从144个required String参数的平铺结构重构为4子类组合结构(1404行→1726行)
[v14.12.0] - 2026-05-19
新增
- 协作画布远程光标显示 (P2-12)
- 远程用户光标以彩色圆形+别名首字母覆盖层显示,不同用户自动分配不同颜色
- 光标移动使用 AnimatedOpacity 实现平滑动画
- 光标3秒无移动后自动淡出消失
- 触摸绘制时自动广播本地光标位置给远程用户
- 光标广播节流限制(10次/秒),避免信令洪泛
- 协作画布快照同步 (P2-13)
- 同步状态栏新增「同步画布」按钮,点击请求对端完整画布快照
- 同步中显示 CupertinoActivityIndicator 加载指示器
- 快照请求10秒超时自动取消
- 收到快照响应后自动合并到本地画布并结束加载状态
修改
canvas_sync_service.dart: broadcastCursor 添加100ms节流canvas_provider.dart: CanvasState 新增 cursorOpacities/isSyncing 字段,addPoint 自动广播光标,新增 requestSnapshotSync 方法,光标淡出定时器管理canvas_painter.dart: 移除远程光标绘制(改用覆盖层Widget实现动画+淡出)canvas_page.dart: 画布区域改为 Stack 布局叠加光标覆盖层,同步状态栏新增同步按钮和加载指示器,新增 _RemoteCursorWidget/_CursorPointerPainter 组件
[v14.11.0] - 2026-05-19
新增
- 多语言(i18n)系统:自定义翻译框架,支持实时切换语言无需重启
app_locale.dart: AppLocale枚举(8种: system/zh_CN/en/ja/zh_TW/es/ar/bn),含nativeName/englishName/languageCode/countryCodetranslations.dart: T翻译类(130+字段),7种语言常量,translationsProvider响应式翻译appLocaleProvider: Riverpod Provider,监听设置变化自动切换LocalesupportedLocalesProvider: 提供所有支持Locale列表- 系统语言跟随:
_resolveSystemLocale()/_resolveSystemTranslations()自动匹配系统语言,fallback到zh_CN
- 语言选择页面
language_settings_page.dart- "跟随系统"选项 + 7种语言列表(简体中文/English/日本語/繁體中文/Español/العربية/বাংলা)
- 选中语言显示✓标记+accent色标签
- "协同翻译"按钮入口(占位,后续接入翻译协作平台)
- 通用设置页面 i18n 适配: 所有硬编码中文替换为
t.xxx翻译字段 - 个人中心页面 i18n 适配: 导航/统计/快捷操作/关于弹窗等翻译
- 底部导航栏 i18n 适配: 闲言/发现/我的 翻译
- 鸿蒙端导航栏 i18n 适配: 同步翻译
- 语言偏好持久化: KvStorage
general_language键,默认值system(跟随系统) - 开发文档:
docs/i18n_dev_doc.dart— 功能描述/架构设计/数据流/使用示例/验收清单
修改
app.dart: MaterialApp/MaterialApp.router 添加locale+supportedLocales属性general_fields_provider.dart: 默认语言从zh_CN改为systemgeneral_settings_page.dart: 语言选择从CupertinoPicker改为跳转独立语言设置页profile_page.dart: 语言行显示AppLocale.nativeName,点击跳转语言设置页app_router.dart: 新增/settings/language路由
[v14.10.0] - 2026-05-19
重构
- 传输聊天页面文件拆分(1916行→3文件,每个≤800行)
transfer_chat_page.dart(729行): 主页面核心 — 状态变量/生命周期/build/消息列表/网络Ping/速度追踪/已读回执transfer_chat_screen_share.dart(688行): 屏幕共享part文件 — 双向请求/接受/拒绝/SDP/ICE/Offer卡片/网络状态辅助/对端ID收集transfer_chat_file_send.dart(617行): 文件发送part文件 — 附件选择/离线发送/大文件确认/拖拽/语音录制/画布协作/文件分享打开- 使用
part/part of指令+Extension扩展方法实现跨文件方法共享 - 主类添加
_setState()包装方法,解决扩展方法中setState的@protected限制
[v14.9.0] - 2026-05-19
新增
- Flutter端小部件管理页面优化
widget_management_page.dart: 按优先级分组展示(P0核心/P1推荐/P2实用/P3趣味),新增同步主题按钮、深度链接预览widget_type.dart: 新增deepLinkRoute/dataKeyPrefix/themeKey三个getterwidget_provider.dart: 新增pushThemeToAllWidgets()方法,addWidget支持所有类型+自动推送主题home_widget_service.dart: 新增pushThemeMode/updateFortune/updateCountdown/updatePomodoro/updateSolarTerm/updateCheckin方法,扩展深度链接回调
- iOS WidgetKit P2/P3小部件(5个新Widget)
- FortuneWidget/CountdownWidget/PomodoroWidget/SolarTermWidget/CheckinWidget
- 所有8个Widget支持深色主题(WidgetColors结构体+isDark字段)
- DailyCardWidget新增(Medium/Large尺寸)
- 鸿蒙 FormExtension P2/P3卡片(5个新FormAbility)
- FortuneFormAbility/CountdownFormAbility/PomodoroFormAbility/SolarTermFormAbility/CheckinFormAbility
- 5个ArkUI FormPage均支持深色主题(isDark状态+动态配色)
- 5个表单配置JSON(fortune_form/countdown_form/pomodoro_form/solar_term_form/checkin_form)
- module.json5注册5个新extensionAbilities
- P0/P1 FormAbility和ArkUI页面均添加isDark深色主题支持
修改
XianyanWidget.swift: 从2个Widget扩展到8个,全部支持深色主题- 鸿蒙P0/P1 FormAbility: 添加isDark读取和formData输出
- 鸿蒙P0/P1 ArkUI Pages: 添加@State isDark + 动态backgroundColor/fontColor
[v14.8.0] - 2026-05-19
新增
- Android原生小部件P2/P3(5个新Widget Provider + 深色主题支持)
FortuneProvider.kt: 每日运势小部件,展示运势文本+幸运关键词,读取fortune_text/fortune_keywordCountdownProvider.kt: 倒计时小部件,展示标题+剩余天数,读取countdown_title/countdown_target,自动计算天数差PomodoroProvider.kt: 番茄钟小部件,展示倒计时+状态(专注中/已暂停/准备开始),读取pomodoro_remaining/pomodoro_stateSolarTermProvider.kt: 节气诗词小部件,展示节气名+诗词,读取solar_term_name/solar_term_poemCheckinProvider.kt: 每日签到小部件,展示连续天数+签到状态(✅/📝),读取checkin_days/checkin_today
- 全部8个Widget Provider深色主题支持
- 读取SharedPreferences
widget_theme_mode字段(light/dark) - 根据主题自动切换light/dark布局XML
- 深色背景:
widget_background_dark.xml(#1C1C1E iOS风格深色)
- 读取SharedPreferences
- P2/P3布局XML(10个): widget_fortune/countdown/pomodoro/solar_term/checkin 各light+dark
- P0/P1深色布局XML(3个): widget_daily_sentence_dark/widget_readlater_dark/widget_daily_card_dark
- Widget配置XML(5个): fortune_info/countdown_info/pomodoro_info/solar_term_info/checkin_info
- strings.xml新增5个widget描述字符串
- AndroidManifest.xml注册5个新receiver
修改
DailySentenceProvider.kt: 新增dark主题支持,根据widget_theme_mode切换布局ReadlaterProvider.kt: 新增dark主题支持,根据widget_theme_mode切换布局DailyCardProvider.kt: 新增dark主题支持,根据widget_theme_mode切换布局
[v14.7.0] - 2026-05-19
新增
- 桌面小部件管理功能:个人中心「会员中心」替换为「桌面小部件」入口
widget_management_page.dart: 小部件管理页面,支持8种小部件类型展示+平台兼容说明+安装状态widget_type.dart: 8种小部件枚举(dailySentence/readlater/dailyCard/dailyFortune/countdown/pomodoro/solarTerm/checkin)widget_provider.dart: Riverpod Notifier状态管理,支持安装检测/添加/固定/数据推送home_widget_service.dart: 新增updateWidget(WidgetType)方法,支持按类型推送数据到指定平台app_router.dart+ohos_nav_bridge.dart: 新增/widget-management路由
- home_widget插件ohos适配增强
home_widget.dart: updateWidget/requestPinWidget新增ohosName参数home_widget_info.dart: 新增ohosFormId/ohosFormName字段
- Android原生小部件(3个P0/P1)
DailySentenceProvider.kt+ReadlaterProvider.kt+DailyCardProvider.kt: WidgetProvider- 布局XML: widget_daily_sentence/widget_readlater/widget_daily_card
- Widget配置XML: daily_sentence_info/readlater_info/daily_card_info
- AndroidManifest.xml注册3个receiver
- iOS原生小部件
XianyanWidget.swift: WidgetKit入口,DailySentenceWidget+ReadlaterWidget- Info.plist + Assets.xcassets: Widget Extension配置
- 鸿蒙原生卡片(3个P0/P1)
DailySentenceFormAbility.ets+ReadlaterFormAbility.ets+DailyCardFormAbility.ets- ArkUI页面: DailySentenceFormPage/ReadlaterFormPage/DailyCardFormPage
- 表单配置JSON: daily_sentence_form/readlater_form/daily_card_form
- module.json5注册3个extensionAbilities
修改
profile_page.dart: 会员中心→桌面小部件,图标改为CupertinoIcons.square_grid_2x2
[v14.6.0] - 2026-05-19
新增
- P3-06 拖拽发送文件:聊天页面支持DragTarget拖拽文件发送
transfer_chat_page.dart: DragTarget包裹聊天区域,拖入文件时显示DottedBorder+图标+文字提示_isDragOver状态变量 + AnimatedOpacity平滑过渡_handleDroppedFiles()验证路径后调用_sendFilesWithOfflineCheck()- 拖拽提示: 半透明遮罩 + DottedBorder(accent色) + CupertinoIcons.arrow_down_doc + "释放以发送文件"
- P3-08 消息长按上下文菜单:CupertinoContextMenu长按消息气泡弹出操作菜单
transfer_chat_bubbles.dart: ChatMessageBubble新增onCopy/onForward/onDelete/onShare/onOpen回调- 文本消息: 复制/转发/删除 | 文件消息: 打开/分享/删除 | 语音消息: 删除 | 系统消息: 无菜单
transfer_chat_page.dart: 连接回调 — 复制到剪贴板/删除消息/分享文件/打开文件/转发提示transfer_notifier.dart: 新增deleteMessage()方法,从state和数据库删除消息transfer_database.dart: 新增deleteMessage()方法,Drift ORM删除记录
[v14.5.0] - 2026-05-19
新增
- 功能降级管理器
DegradationManager:跨平台功能降级策略,优雅回退不可用功能degradation_manager.dart: 功能能力检测+降级提示+替代方案- FeatureLevel枚举: full/limited/minimal/unavailable 四级能力等级
- FeatureCapability模型: name/level/fallbackHint/alternativeMethod
- 6项功能检测: screenCapture/nfcPairing/bluetoothPairing/wifiDirect/usbTransfer/remoteInput
- isFeatureAvailable()统一查询接口
- allCapabilities/unavailableFeatures批量查询
修改
device_pairing_page.dart: 其他配对方式Tab集成DegradationManager- 蓝牙/NFC/USB配对方式双重检测: discoveryState + DegradationManager平台能力
- 不可用功能展示fallbackHint降级提示文字
- 不可用功能展示💡alternativeMethod替代方案建议
- _buildOtherMethodCard新增fallbackHint/alternativeMethod参数
transport_router.dart: 传输路由集成DegradationManager平台能力过滤- selectRoute(): USB/Wi-Fi Direct候选添加DegradationManager前置检查
- getAvailableTransports(): USB/Wi-Fi Direct传输添加DegradationManager前置检查
- sendWithFallback(): attemptOrder过滤不可用传输方式
- 新增_isTransportAvailable()辅助方法
[v14.4.0] - 2026-05-19
新增
- iOS WidgetKit 小组件扩展:
ios/XianyanWidget/目录XianyanWidget.swift: Widget Extension 入口,包含两个小组件- DailySentenceWidget(每日一句):从 App Group UserDefaults 读取
daily_sentence/daily_sentence_author - ReadlaterWidget(稍后读):从 App Group UserDefaults 读取
readlater_count/readlater_preview_text/readlater_preview_author
- DailySentenceWidget(每日一句):从 App Group UserDefaults 读取
- 两种小组件均支持 systemSmall / systemMedium 尺寸
- 使用
containerBackground(for: .widget)适配 iOS 17+ 样式 - App Group ID:
group.com.xianyan.share Info.plist: WidgetKit Extension 配置,NSExtensionPointIdentifier 为com.apple.widgetkit-extensionAssets.xcassets: 包含 AccentColor.colorset 和 AppIcon.appiconset
[v14.4.0] - 2026-05-19
新增
- Android 桌面小部件完整实现:3个Widget Provider + 布局XML + 配置注册
DailySentenceProvider: 每日精选句子小部件,展示句子+作者,点击打开APPReadlaterProvider: 稍后读小部件,展示未读数量+预览文本,点击打开APPDailyCardProvider: 精美日签卡片小部件,居中展示日期+句子+作者,点击打开APP
- Widget布局XML:
widget_daily_sentence.xml: 纵向布局,句子TextView + 作者TextView(右对齐)widget_readlater.xml: 纵向布局,未读数量(粗体) + 预览文本(2行截断)widget_daily_card.xml: FrameLayout+LinearLayout居中,日期+句子(居中4行)+作者(右对齐)
- Widget配置XML:
daily_sentence_info.xml: 3x2单元格,30分钟更新,可水平/垂直调整readlater_info.xml: 3x1单元格,30分钟更新,可水平/垂直调整daily_card_info.xml: 3x3单元格,30分钟更新,可水平/垂直调整
widget_background.xml: 白色圆角16dp背景drawablestrings.xml: 新增3个widget描述字符串资源AndroidManifest.xml: 注册3个receiver(DailySentenceProvider/ReadlaterProvider/DailyCardProvider)
修改
AndroidManifest.xml: 在<application>标签内</activity>后新增3个<receiver>声明
[v14.3.0] - 2026-05-19
新增
- 设备卡片3D倾斜效果:DeviceCard集成flutter_tilt Tilt.base交互
device_card.dart: GestureDetector内包裹Tilt.base,angle=6,moveDuration=200ms- 光照效果: LightConfig(maxIntensity: 0.3),跟随倾斜方向动态光照
- 圆角裁剪: borderRadius与卡片AppRadius.lgBorder统一
- PlatformHelper平台检测工具类:跨平台功能能力检测
platform_helper.dart: 复用platform_utils条件导入,新增能力检测- supportsScreenCapture / supportsNFC / supportsBluetooth / supportsWiFiDirect / supportsUSB
- screenCaptureMethod: 各平台屏幕捕获API名称(MediaProjection/ReplayKit/CGWindowListCreateImage等)
- platformName: 统一平台名称获取
修改
device_card.dart: Tilt.base包裹Container,保留GestureDetector外层+animate动画transfer_chat_page.dart: _showScreenShareOptions()集成PlatformHelper- 不支持屏幕捕获时Toast提示"当前平台不支持屏幕捕获"并return
- "共享我的屏幕"选项仅supportsScreenCapture为true时显示
- "观看对方屏幕"选项始终显示(接收视频全平台可用)
[v14.2.0] - 2026-05-19
新增
- Liquid Glass 风格统一:文件传输页面 Container+BoxDecoration 全部替换为 GlassContainer
device_pairing_page.dart: 其他配对方式卡片 → GlassContainer(depth: elevated)pairing_code_tab.dart: 配对码展示卡片 → GlassContainer(depth: prominent)qr_code_tab.dart: 二维码展示卡片 → GlassContainer(depth: prominent)radar_scan_tab.dart: 设备列表项 → GlassContainer(depth: base)
- 配对成功庆祝动画:三个配对Tab(pairing_code/qr_code/radar_scan)配对成功时
- CelebrationOverlay 全屏撒花效果包裹成功弹窗
- HapticService.success() 触觉反馈
- 触觉反馈集成:文件传输全流程关键交互点
- 发送消息: HapticService.light()
- 接收消息: HapticService.light() (ref.listen监听新消息)
- 文件传输完成: HapticService.success()
- 文件传输失败: HapticService.error()
- 屏幕共享请求接受: HapticService.success()
- Tab切换: HapticService.light()
- HapticService 新增 error() 方法用于传输失败等错误场景
修改
device_pairing_page.dart: GlassContainer + TabController切换触觉pairing_code_tab.dart: GlassContainer + CelebrationOverlay + HapticServiceqr_code_tab.dart: GlassContainer + CelebrationOverlay + HapticServiceradar_scan_tab.dart: GlassContainer + CelebrationOverlay + HapticServicetransfer_chat_page.dart: ref.listen监听消息变化触发触觉反馈 + 发送/屏幕共享触觉haptic_service.dart: 新增 error() 静态方法
[v14.1.0] - 2026-05-19
新增
- Lottie空状态扩展:EmptyType新增3个文件传输场景类型
noDevices— "未发现附近设备" / "请确保对方设备已开启闲言APP",含Lottie动画noTransfers— "暂无传输记录" / "发送或接收文件后将在此显示",含Lottie动画transferError— "传输出错" / "请检查网络连接后重试",含Lottie动画
- 雷达扫描空状态统一:
radar_scan_tab.dart自定义空状态替换为EmptyState(type: EmptyType.noDevices) - 传输记录空状态统一:
file_transfer_records_tab.dart自定义空状态替换为EmptyState(type: EmptyType.noTransfers) - 实时传输速度图表:
TransferSpeedChart组件- 紧凑型fl_chart折线图,高度60,嵌入聊天页输入栏上方
- 显示最近30秒速度历史,accent色线条+渐变填充
- 无坐标轴标签(紧凑模式),平滑曲线
- 左侧显示当前速度文字
- 传输中自动显示,传输结束自动隐藏
- 消息已读回执:VisibilityDetector检测远程消息可见性
- 远程消息可见>80%持续1秒后自动触发
markMessageAsRead _ReadReceiptDetector组件封装VisibilityDetector+1秒延迟+防重复触发ChatMessageBubble新增onVisible回调- 仅对未读远程消息生效,系统消息不触发
- 远程消息可见>80%持续1秒后自动触发
修改
empty_state.dart: EmptyType枚举新增noDevices/noTransfers/transferErrorradar_scan_tab.dart:_buildEmptyState()使用EmptyState组件file_transfer_records_tab.dart: 空状态使用EmptyState组件transfer_chat_bubbles.dart: ChatMessageBubble新增onVisible回调参数transfer_chat_page.dart: 集成TransferSpeedChart+VisibilityDetector已读回执+_speedHistory状态追踪
[v14.0.0] - 2026-05-19
新增
- 设备配对页面全面重构:4Tab从IP/扫码/蓝牙/其他 → 配对码/扫码/雷达/其他,接入SignalingService真实流程
- 配对码Tab (
pairing_code_tab.dart): 生成6位配对码+5分钟倒计时+复制功能 / 6位输入框自动聚焦+自动提交 / pairing-matched成功弹窗 - 扫码Tab (
qr_code_tab.dart): QrImageView生成xianyan://pair二维码 / MobileScanner相机扫描+四角装饰框 / 扫描结果解析+配对请求 - 雷达Tab (
radar_scan_tab.dart): flutter_animate脉冲雷达动画 / radarBroadcast+radarScan双信令 / 设备按matchType分组(我的设备/同一网络/同一城市/远程) / 10秒空态提示 - 其他Tab: 手动IP移入CupertinoAlertDialog弹窗 / 保留蓝牙/NFC/USB/热点/账户配对
- 配对码Tab (
- 每个Tab独立文件,主页面
device_pairing_page.dart从617行精简至~390行
修改
device_pairing_page.dart: Tab结构重构(配对码/扫码/雷达/其他),IP配对移至其他Tab弹窗,蓝牙Tab合并至其他Tab- 新增3个Tab组件文件:
pairing_code_tab.dart/qr_code_tab.dart/radar_scan_tab.dart
[v13.9.0] - 2026-05-19
新增
- 画布邀请卡片功能:当一方打开协作画布时,对方聊天页面自动显示"🎨 对方邀请你加入协作画布"卡片,含"加入画布"按钮
TransferMessageType.canvasInvite新消息类型,content 存储canvasIdChatCanvasInviteContent气泡组件,展示邀请信息+加入按钮ChatTransferCallbacks.onCanvasJoin回调,点击"加入画布"导航到CanvasPageTransferNotifier.addCanvasInviteMessage()方法,去重逻辑防止重复邀请
修复
_openCanvas()缺少信令连接检查:新增signaling.isConnected判断,未连接时显示 Toast "信令未连接,无法使用协作画布"并阻止导航- 聊天页面未监听画布加入信令:
_signalingMessageSub新增canvasJoin消息处理,收到对端canvasJoin后自动添加邀请卡片
修改
transfer_message.dart: 新增canvasInvite枚举值 +isCanvasInvitegettertransfer_chat_bubbles.dart:ChatTransferCallbacks新增onCanvasJoin回调 +ChatCanvasInviteContent组件transfer_chat_page.dart:_openCanvas()增加信令检查 +_handleCanvasJoin()/_joinCanvas()方法 + callbacks传递onCanvasJoin
[v13.8.0] - 2026-05-19
修复
- 文件传输错误消息未传播到聊天气泡:
updateFileMessageProgress()增加errorMessage可选参数,传输失败时错误详情同步更新到消息模型,ChatFileContent可正确显示具体错误原因而非通用"传输失败" - 传输异常时消息状态卡在"传输中":
executeSendTask()和_executeUsbSendTask()的 catch 块新增updateFileMessageProgress()调用,确保消息状态同步更新为failed - WsRelay 文件接收失败未更新消息状态:
handleWsRelayFileError()新增updateFileMessageProgress()调用,将消息状态更新为failed并传递错误原因 - 离线对端有IP时未正确处理:
_sendFilesWithOfflineCheck()增加信令连接性判断(signaling.isConnected && _isSignalingOnline),当对端离线但可通过信令中转时仍尝试直接传输
新增
- 离线发送对话框增加"加入离线队列"选项:
_showCloudCacheDialog()→_showOfflineSendDialog(),提供三个选项:取消/加入离线队列/暂存至云端
修改
transfer_file_handler.dart:updateFileMessageProgress()签名增加{String? errorMessage}参数transfer_signaling_handler.dart:updateFileMessageProgress类型签名同步更新,handleWsRelayFileError()增加消息状态更新transfer_chat_page.dart:_sendFilesWithOfflineCheck()离线判断逻辑优化,_showCloudCacheDialog()→_showOfflineSendDialog()
[v13.7.0] - 2026-05-19
新增
- 翻译助手网络层重构:
package:http→ 项目现有Dio封装- 新增
TranslateDioClient工具类:独立Dio实例,不走ApiClient的baseUrl和Token拦截器 - 5个翻译服务全部改用Dio:Google/Bing/LibreTranslate/MyMemory/AppWorlds
- 新增
- 用户自定义翻译API功能
- 新增
CustomTranslateApi模型:支持GET/POST、自定义参数名、响应路径、额外Header等 - 新增
CustomTranslateService服务:动态调用用户配置的翻译接口 - 新增
CustomApiNotifier状态管理:增删改查+持久化到SharedPreferences - 设置页面新增「自定义接口」区域:添加/编辑/禁用/删除自定义API
- 新增
- API测试结果增强:
ApiTestResult模型(成功/响应时间/错误信息) - 设置页面展示响应速度:每个API显示测试状态(✓/✗)+响应时间(ms/s)
- AppWorlds频率限制处理:内置2秒1次请求间隔控制
flutter_tts依赖:为翻译结果朗读功能做准备
修改
translate_provider.dart:_apis→_builtInApis+ 动态合并自定义API;testAllApis()返回ApiTestResult(含响应时间)translate_settings_page.dart: 重写设置页面,增加响应速度展示+自定义API管理+API测试结果增强appworlds_translate_service.dart: 内置_waitForRateLimit()频率限制- 降级顺序:内置API优先(bing→mymemory→appworlds→google→libre),自定义API追加到末尾
[v13.6.1] - 2026-05-19
修改
- 传输聊天气泡组件文件拆分:
transfer_chat_bubbles.dart(1434行) → 3个文件transfer_chat_bubbles.dart(~410行): 主文件,保留 ChatMessageBubble/ChatTextContent/ChatProgressContent/ChatPairingBubble/ChatSystemMessage/DeliveryStatusIndicator/ChatVoiceContent/chatDeviceAliastransfer_chat_file_content.dart(~270行): 文件传输气泡组件(ChatFileContent/ChatStatusIcon/ChatTransferControls/ChatControlButton)transfer_chat_media_content.dart(~530行): 媒体气泡组件(ChatImageContent/ChatVideoContent/_ImagePreviewPage/_VideoPlayerPage/_ZoomButton)
_chatDeviceAlias重命名为chatDeviceAlias(跨文件使用需公开)- 备份文件:
transfer_chat_bubbles.dart.bak(保留)
[v13.6.0] - 2026-05-19
新增
- 软件协议模块(
features/agreements/):10项协议/政策完整内容与展示页面- 数据层:
AgreementType公开枚举(10种协议类型)+AgreementData公开数据类(全局可调用) - 展示层:
AgreementPage通用协议展示页(支持动态主题+重要字段高亮【】/粗体**)+AgreementListPage协议列表页 - 路由:
/agreements(协议列表)+/agreement/:type(协议详情)
- 数据层:
- 10项协议内容(符合PIPL/GDPR/CCPA/COPPA等法规):
- 隐私政策(含自动化决策、安全事件处置、DPIA评估、国际数据保护章节)
- 用户服务协议(含不可抗力条款)
- 账号使用协议(地区差异化年龄门槛:中国14岁/欧盟16岁/美国13岁)
- 会员权益说明(规划阶段,暂无内购)
- 免责声明及内容版权归属
- 儿童隐私政策(含COPPA特别规定)
- 软件权限使用说明
- 软件介绍
- 新手指引
- 开发团队
修改
- 关于页面:法律信息区「隐私政策」→「软件协议」,跳转协议列表页
- 登录页面:协议弹窗占位文本 → 跳转实际协议详情页(用户协议/隐私政策)
- 路由配置:新增
/agreements和/agreement/:type路由
新增
- 翻译助手完整功能实现(会话流入口 + 翻译页面 + 设置页面 + 5个翻译API)
- 数据模型: TranslateMessage, TranslateSession, TranslateLanguage (29种语言)
- API抽象层: TranslateApiService + 5个实现 (Google/Bing/LibreTranslate/MyMemory/AppWorlds)
- 状态管理: TranslateProvider (翻译+降级+重试+未读红点) + TranslateSettingsProvider (持久化设置)
- 翻译页面: 语言对选择+快捷语言Chip+会话流消息列表+输入发送+空态+快捷翻译
- 设置页面: API选择+翻译开关+数据管理+接口测试+响应速度展示
- 会话流集成: chat_session_provider新增translate系统会话(不置顶,NEW标签)
- 路由注册: /translate + /translate-settings (GoRouter + OhosNavBridge)
- 未读红点: 翻译失败时显示红点,点击进入后清除
- API降级: 按优先级自动切换,所有API失败时显示错误+重试按钮
修改
- inspiration_page: _onSessionTap中增加translate会话的clearUnread调用
- app_router: 新增translate/translateSettings路由常量和GoRoute注册
- ohos_nav_bridge: 新增translate/translateSettings路由映射
[v13.4.0] - 2026-05-19
新增
- 传输聊天页双向屏幕共享:点击「屏幕」按钮弹出选择面板,支持「观看对方屏幕」(view)和「共享我的屏幕」(share)两种方向
- 使用 SignalingService.requestScreenShare/acceptScreenShare/rejectScreenShare 替代旧 screenShareOffer 信令
- 监听 signalingService.onScreenShareRequest 处理收到的屏幕共享请求,根据 direction 显示不同弹窗文案
- 监听 signalingService.onMessage 处理 screenShareAccept/screenShareReject 响应
修改
- transfer_chat_page: _startScreenShare → _showScreenShareOptions (CupertinoActionSheet选择面板)
- transfer_chat_page: 新增 _requestScreenShare/_listenScreenShareEvents/_handleIncomingScreenShareRequest/_acceptIncomingScreenShare/_handleScreenShareAccept/_handleScreenShareReject 方法
- transfer_chat_page: 导航栏按钮文案「共享」→「屏幕」,onTap 指向新选择面板
[v13.3.0] - 2026-05-19
新增
- 翻译助手功能规划:发现页新增翻译助手入口,会话流式翻译UI,5个免费翻译API
修改
- 全局统一命名:「灵感」→「发现」,所有用户可见文本、注释、描述统一更新
- chat_flow_page: previousPageTitle '灵感'→'发现'
- hidden_sessions_page: previousPageTitle '灵感'→'发现'
- general_settings_provider: 启动页选项 '灵感'→'发现',图标 💡→🧭
- chat_message: ChatMessageType.sentence label '灵感句子'→'发现句子'
- chat_sentence_card_bubble: '灵感句子'→'发现句子'
- discover_page: '暂无灵感'→'暂无发现',注释更新
- tool_item: '随机灵感'→'随机发现','传统色彩灵感'→'传统色彩发现'
- tool_panel: '发现更多灵感好帮手'→'发现更多好帮手'
- page_registry: name/description 更新
- 其他注释/描述中的'灵感'统一替换为'发现'
[v13.2.0] - 2026-05-19
新增
- 信令服务器: 配对码机制(pairing-code-create/join/matched),6位码5分钟有效
- 信令服务器: 雷达扫描机制(radar-broadcast/scan/devices),按IP段/城市匹配
- 信令服务器: 屏幕共享信令(screen-share-request/accept/reject/stop),支持双向
- 信令服务器: /health端点返回配对码/雷达池/屏幕共享统计
- 测试脚本: test_cross_network_pairing.py (10个场景)
- 测试脚本: test_screen_share_signaling.py (6个场景)
- 测试脚本: test_canvas_sync.py (5个场景)
- 测试脚本: test_full_e2e.py (7步全流程)
修改
- upload_signaling.py: 修复备份文件已存在时重命名失败问题
- API_FILE_TRANSFER_CORE_DOC.md: 新增3.11-3.13协议文档
验证
- 配对码创建/加入/匹配: ✅ 5/5场景通过
- 雷达广播/扫描: ✅ 5/5场景通过
- 屏幕共享信令: ✅ 6/6场景通过
- 画布同步: ✅ 5/5场景通过
- 全流程E2E: ✅ 7/7步骤通过
[6.5.1] - 2026-05-19
✨ 新增诗词设置页面与天气诗词设置页面
为今日诗词和天气诗词功能分别创建独立设置页面, 支持推送开关/时间、显示选项、气泡样式、字体大小等偏好配置。
变更内容
| 文件 | 修改 |
|---|---|
poetry_settings_page.dart |
新增今日诗词设置页面,8项设置项(推送开关/时间/推荐数量/译文/标签/推荐理由/气泡样式/字体大小) |
weather_settings_page.dart |
新增天气诗词设置页面,8项设置项(推送开关/时间/详细天气/心情标签/诗词数量/气泡样式/字体大小/城市设置) |
新增功能
- 诗词设置:StateProvider 管理设置状态,CupertinoSwitch/CupertinoSlidingSegmentedControl/CupertinoTimerPicker 控件
- 天气设置:同上 + CupertinoTextField 城市输入
- 两个页面均使用 GlassContainer 分组、AppThemeExtension 动态主题、AppTypography/AppSpacing/AppRadius 统一设计系统
- iOS 风格 CupertinoPageScaffold + CupertinoNavigationBar
[6.5.0] - 2026-05-19
✨ 天气诗词页面重构为聊天样式
将天气诗词页面从传统卡片列表布局重构为聊天对话样式, 增强交互体验,支持快捷回复、底部输入栏、设置入口等功能。
变更内容
| 文件 | 修改 |
|---|---|
weather_page.dart |
完全重写为聊天样式,新增 _ChatMessage 数据模型,7种消息类型(system/weather/mood/poetry/poemList/detail/user) |
新增功能
- 聊天气泡布局:左侧🌤️头像 + 右侧气泡,用户消息右侧显示
- 天气卡片气泡:渐变背景 + 天气icon + 温度 + 城市天气 + 4列详细数据
- 心情标签气泡:emoji + 天气心情标签
- 诗词推荐气泡:居中诗词内容 + 作者标题 + 收藏/分享按钮
- 诗词列表气泡:📖标题 + 多首诗词卡片 + keyword标签
- 详细数据气泡:2x2 GridView 展示湿度/风向/风力/AQI
- 快捷回复:天气卡片下方"换首诗"、"明天天气"、"分享"
- 底部输入栏:CupertinoTextField + 发送按钮
- AppBar新增设置按钮:跳转
/weather/settings - 全局 flutter_animate 入场动画(fadeIn + slideY)
- 骨架屏适配聊天布局
[6.4.9] - 2026-05-18
🐛 修复"我的"页面数据延迟问题 — 积分/签到/笔记数据不一致
用户在签到、发布笔记后返回"我的"页面,积分、签到天数、笔记数量显示与实际不一致。 根因:数据变更后未同步刷新
authProvider中的用户信息。
修复内容
| 文件 | 修改 |
|---|---|
profile_page.dart |
页面进入时调用 refreshUser() 刷新用户数据 |
signin_provider.dart |
签到成功后调用 refreshUser() 更新积分和签到天数 |
article_provider.dart |
发布文章成功后调用 refreshUser() 更新文章数量 |
举一反三
数据同步原则:
- 页面进入时刷新:用户中心、个人资料等页面进入时应主动刷新用户数据
- 操作后同步更新:签到、发布、删除等操作成功后应刷新相关用户数据
- Provider 联动:跨 Provider 数据依赖时,操作完成后应主动触发数据同步
[6.4.8] - 2026-05-18
🐛 修复全局 Loading 卡死 — Notifier 初始状态 isLoading: true 导致 UI 永远 loading
上一次修复(v6.4.6)将 Notifier 构造函数中的初始化移至
build()+Future.microtask(), 但PoetryState、ProgressState、CountdownState的isLoading默认值为true, 而Future.microtask()延迟了_init()的执行,导致 UI 在初始渲染时看到isLoading: true但数据尚未加载,永远显示 loading 骨架屏。
修复策略
| 类型 | 修复方式 | 示例 |
|---|---|---|
| 同步数据 | 直接在 build() 中计算并返回完整初始状态 |
InspirationNotifier |
| 异步数据 + isLoading 默认 true | Future.microtask() + 初始状态设 isLoading: false |
PoetryNotifier, ProgressNotifier, CountdownNotifier |
| 异步数据 + isLoading 默认 false | Future.microtask() + 默认初始状态 |
DiscoverNotifier, DailyCardStyleNotifier, TransferSettingsNotifier |
举一反三
Riverpod Notifier 的 build() 方法设计原则:
build()必须返回立即可用的初始状态,不应依赖异步操作设置关键 UI 状态- 如果 State 的
isLoading默认为true,build()必须返回isLoading: false,否则 UI 会卡 loading - 同步数据应直接在
build()中计算,避免不必要的异步延迟 - 异步数据加载用
Future.microtask(),但不影响初始 UI 渲染
[6.4.6] - 2026-05-18
🐛 全局修复 Riverpod Notifier 反模式 — 构造函数使用 state/ref + CanvasProvider 构建期间修改状态
两类 Riverpod 反模式全局修复: ① 多个 Notifier 在构造函数中调用
state/ref,但 Riverpod Notifier 在构造函数执行时ref/state尚未初始化 ②CanvasNotifier在 widget 生命周期(build/dispose)中直接修改state,导致 FlutterError
修复方案
- 构造函数中的初始化逻辑移至
build()方法,同步初始化直接执行,异步用Future.microtask() - CanvasProvider 4 处
state =修改包裹在Future.microtask()中 +_disposed标志防护 - 本次修复 9 个 Notifier + CanvasNotifier,加上之前修复的 8 个,已覆盖项目中所有此类反模式
修复文件清单
| Notifier | 修复内容 |
|---|---|
| GeneralSettingsNotifier | 构造函数 _initServices() → build() 中直接调用 |
| SolarTermNotifier | 构造函数 _loadData() → build() 中直接构建初始状态 |
| TransferSettingsNotifier | 构造函数 _loadFromPrefs() → build() 中 Future.microtask() |
| ProgressNotifier | 构造函数 _init() → build() 中 Future.microtask() |
| PoetryNotifier | 构造函数 loadPoetry() → build() 中 Future.microtask() |
| InspirationNotifier | 构造函数 _loadSentences() → build() 中 Future.microtask() |
| ChatConversationNotifier | 构造函数 _init() → build() 中 Future.microtask() |
| DailyCardStyleNotifier | 构造函数 _loadFromStorage() → build() 中 Future.microtask() |
| DiscoverNotifier | 构造函数 _init() → build() 中 Future.microtask() |
| CountdownNotifier | 构造函数 _loadEvents() → build() 中 Future.microtask() |
| CanvasNotifier | Future.microtask() 防护 + _disposed 标志 |
[6.4.0] - 2026-05-18
🧭 鸿蒙端全量导航修复 — 补全33条缺失路由 + 全项目96处导航调用迁移
v6.1.0 虽已创建 OhosNavBridge 和 appPush 扩展,但仅替换了 3 个文件的导航调用, 且路由映射仅覆盖 58 条路由(缺失 33 条),导致鸿蒙端大量页面无法跳转。 本次修复:①补全 OhosNavBridge 全部 89 条路由映射 ②全项目 96 处导航调用迁移为 appPush/appGo ③扩展 appPush 支持 extra 参数
核心修复
| 修改 | 文件 | 说明 |
|---|---|---|
| 补全路由映射 | ohos_nav_bridge.dart |
新增 33 条路由 + 带参数路由处理 + 占位页面 |
| extra 参数支持 | app_nav_extension.dart |
appPush/appReplace 新增 {Object? extra} 命名参数 |
| 全量导航迁移 | 28 个文件 | context.push → context.appPush、context.go → context.appGo |
[6.3.0] - 2026-05-18
🔮 恢复鸿蒙端液态玻璃效果 — 仅阉割路由,保留全部视觉特效
v6.0.0 为修复鸿蒙端白屏问题,过度阉割了液态玻璃效果,实际白屏根因是
MaterialApp.router+ 额外包导入,与液态玻璃无关。 本次修复恢复鸿蒙端全部液态玻璃视觉效果(LiquidGlassWidgets/GlassTheme/GlassBottomBar/TabIconSprite/Catcher2),仅保留路由(GoRouter)阉割。
[6.1.0] - 2026-05-14
🔌 新功能 — USB OTG 有线传输
USB OTG Host 模式文件传输,两台 Android 设备通过 USB 线缆高速传输文件。
- UsbTransportService: MethodChannel 桥接原生 USB 操作,块传输发送/接收+进度回调,USB 2.0/3.0/3.1 自适应块大小
- UsbDiscoveryService: EventChannel 监听 USB 插入/拔出事件,自动扫描已连接设备
- UsbConfirmDialog: iOS 风格确认对话框,显示设备名称/协议版本/最大速度/认证状态
- TransferFileHandler/TransferNotifier USB 集成: USB 传输全链路打通
[5.15.0] - 2026-05-16
🔌 鸿蒙适配 — 30 个三方包全量适配完成
三批次完成 30 个三方包鸿蒙适配:第一批 11 个(TPC 官方合并)、第二批 9 个(TPC 包合并+自行适配)、第三批 10 个(7 个自行编写 ohos 原生代码 + 2 个 TPC 合并 + 1 个 fluttertoast)
适配模式
- 联合插件模式: ohos 原生代码在独立
*_ohos子包,主包声明default_package - 直接插件模式: ohos 原生代码在主包
ohos/目录,pubspec 声明pluginClass
已适配 30 包清单
shared_preferences / path_provider / url_launcher / image_picker / local_auth / video_player / permission_handler / flutter_secure_storage / share_plus / battery_plus / connectivity_plus / flutter_local_notifications / file_picker / receive_sharing_intent / wakelock_plus / mobile_scanner / wifi_iot / audioplayers / record / sqflite / fluttertoast / video_compress / flutter_blue_plus / gal / network_info_plus / app_links / pro_image_editor / home_widget / nfc_manager / nearby_service
[5.9.0] - 2026-05-15
🐛 Bug修复 — 6项关键问题
- 系统分享白屏 —
Navigator.pushNamed→GoRouter.of(ctx).go - 画布 ref disposed 报错 — 缓存 Notifier 引用到
_cachedNotifier - 画布画线无法同步 — 新增
SnapshotRequestCallback,响应 snapshot 请求 - 屏幕共享不可用 — 改用
screenShareProvider.startSharing()正确发起共享 - 稍后读消息未显示 — 新增
notifyReadlaterRefresh()全局事件总线 - 输入法自动弹出 — 新增
KeyboardManager全局键盘管理器
[11.0.0] - 2026-05-12
🚀 传输扩展功能 — 送达回执 + 断点续传 + 文件分流
文件传输模块核心功能增强:消息送达回执(单条/批量已读)、WebSocket 断点续传(分块传输+断点恢复+校验)、文件分流传输(按文件大小自动选择传输通道)。
已归档版本
6.4.1-6.4.5(鸿蒙端数据库+存储迭代修复) / 5.13.0(local_auth_ohos合并) / 5.10.0(SDK升级oh-3.41.9) / 12.4.0(Tab栏个性交互) / 12.3.0(搜索三大问题修复) / 12.2.0(收藏双向同步) / 12.1.1(快捷按钮导航) / 12.1.0(USB OTG传输) / 6.3.2(登录加载闪烁修复) / 6.3.1(TextPainter异常修复) / 6.2.0(协作画布) / 6.2.1(剪贴板同步) / 11.2.0(云端暂存) / 5.33.0(智能推荐+标签云+智能模式) / 5.32.0(离线浏览缓存) / 5.31.0(通知设置) / 5.30.0(二维码登录) / 5.29.0(表单校验+本地通知) / 5.28.0(文件传输助手+我的设备) / 5.27.0(用户中心接口同步) / 5.26.0(文件传输核心架构) / 5.22.0(聊天多媒体+视觉增强) / 4.21.0(聊天会话流) / 5.11.0(通用设置重构) / 5.10.0(关于页面+图标统一) / 3.9.9(画布样式编辑) / 3.9.8(拖拽描边/文本回写/壁纸无限加载) / 3.9.7(画布圆角+导出修复) / 3.9.6(画布圆角/文字按钮卡死) / 3.9.5(Bug回归修复) / 3.9.4(本地化/HTTP明文) / 3.9.3(画布圆角/壁纸卡死) / 3.9.2(画布圆角/文字按钮/壁纸) / 3.9.1(历史卡死/同步丢失) / 3.9.0(编辑器增强) / 3.8.0 / 2.58.0(六大Bug修复) / 2.57.0(开发计划) / 2.56.0(README更新) / 2.55.1(代码质量清理) / 1.55.0(灵感页面重构) / 1.54.0(个人中心+签到Bug) / 1.53.0(分类列表+骨架屏) / 1.52.0(句子卡片不更新) / 1.51.0(句子循环重复) / 1.50.0(频道同步延迟) / 1.49.0(刷新无响应+分类同步) / 1.48.0(句子广场无限循环) / 1.47.0(API类型转换崩溃) / 1.46.0(句子来源页面) / 1.45.0(笔记自动保存) / 1.44.2(笔记Bug修复) / 1.44.1(笔记删除Bug) / 1.44.0(API集成补全) / 1.40.0(用户安全接口) / 1.39.0(卡片震动/分类切换) / 1.31.0(API功能全面接入) / 1.30.0(传统色页面重构) / 1.23.0(偷工减料修复) / 1.22.0(句子广场交互) / 1.21.0(数据管理卡死/Tab抖动) — 更早版本详见 git history