258 lines
13 KiB
Markdown
258 lines
13 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to this project will be documented in this file.
|
||
|
||
|
||
## [0.99.42] - 2026-04-25
|
||
|
||
### ✨ 新增 — 导出功能增强(4项改进)
|
||
|
||
#### 新增: 用户自选保存路径
|
||
- **变更**: 导出文件时弹出系统文件选择器,用户自行选择保存位置
|
||
- **实现**: 使用 `FilePicker.saveFile()` 替代静默写入 Download 目录
|
||
- **影响**: DOCX/PDF/自定义导出 均已支持路径选择
|
||
- **文件**: `lib/src/widgets/recipe_detail/interaction/recipe_export_button.dart`
|
||
|
||
#### 新增: 系统分享功能
|
||
- **变更**: 导出成功后弹出对话框,支持「📤 分享给朋友」按钮
|
||
- **实现**: 使用 `Share.shareXFiles()` 调用系统分享接口
|
||
- **支持格式**: PDF、DOCX 均可分享至微信/邮件/其他应用
|
||
- **文件**: `lib/src/widgets/recipe_detail/interaction/recipe_export_button.dart`
|
||
|
||
#### 修复: PDF中文乱码(??? 问题)
|
||
- **问题**: PDF使用 Helvetica + WinAnsiEncoding,不支持中文字符 → 全部显示为 ???
|
||
- **根因**: `docs_gee/pdf_generator.dart` 仅支持PDF Base 14字体(Helvetica/Times/Courier),无CJK支持
|
||
- **修复**:
|
||
- 扩展 `PdfGenerator` 构造函数,新增 `embeddedFontBytes` / `embeddedBoldFontBytes` 参数
|
||
- 当传入TTF/OTF字体时,自动创建 CIDFont Type0 + Identity-H 编码
|
||
- 内嵌 NotoSansSC 字体到PDF文档
|
||
- **验证**: `scripts/test_pdf_export_verify.dart` 验证脚本确认 FontDescriptor/CIDFontType2/Identity-H 正确嵌入
|
||
- **文件**: `packages/docs_gee/docx_generator/lib/src/pdf_generator.dart`
|
||
|
||
#### 新增: PDF封面图片嵌入
|
||
- **功能**: 导出PDF时自动在文档顶部嵌入菜品封面图
|
||
- **实现**:
|
||
- 从 `DefaultCacheManager` 缓存读取已下载的封面图(不重新下载)
|
||
- 若无缓存则输出空白(不阻塞导出流程)
|
||
- 图片居中显示,尺寸根据文件大小自适应(200-450pt)
|
||
- **新增参数**: `coverImageBytes` / `coverImageWidth` / `coverImageHeight`
|
||
- **文件**: `packages/docs_gee/docx_generator/lib/src/pdf_generator.dart`, `lib/src/widgets/recipe_detail/interaction/recipe_export_button.dart`
|
||
|
||
|
||
## [0.99.41] - 2026-04-24
|
||
|
||
### 🐛 修复 — 3项重要Bug修复
|
||
|
||
#### 修复: 主题跟随系统切换不实时生效
|
||
- **问题**: 开启"跟随系统"后,切换系统深色模式,应用未实时切换
|
||
- **根因**: `GetCupertinoApp` 的 `Obx` 闭包内未直接访问 `isDarkMode.value`,导致 GetX 未追踪到主题状态变化
|
||
- **修复**: 在 `main.dart` 的 `Obx` 闭包内显式引用 `themeService.isDarkMode.value`,确保主题变化触发重建
|
||
- **文件**: `lib/main.dart`
|
||
|
||
#### 修复: 统计面板数字显示0
|
||
- **问题**: 运营数据大屏中,当数据为0时直接显示"0",不符合展示要求
|
||
- **修复**: `_formatNumber` 方法增加 `n <= 0` 判断,最少显示"1"
|
||
- **文件**: `lib/src/pages/profile/data/stats_dashboard_page.dart`
|
||
|
||
#### 修复: 数据导出JSON导入无法识别 (3个子问题)
|
||
- **问题1: UTF-8编码错误** — `FilePicker` 读取文件使用 `String.fromCharCodes`,不正确处理UTF-8中文
|
||
- **修复**: 改用 `utf8.decode(bytes, allowMalformed: true)`,确保中文内容正确解码
|
||
- **文件**: `lib/src/pages/profile/tools/data_export_page.dart`
|
||
- **问题2: MealRecordModel缺少toJson** — `exportToJson()` 直接序列化 Model 对象,输出 `Instance of 'MealRecordModel'` 而非有效JSON
|
||
- **修复**: 为 `MealRecordModel` 添加 `toJson()` 和 `fromJson()` 方法;`MealRecordController.exportToJson()` 改用 `.map((e) => e.toJson())` 序列化
|
||
- **文件**: `lib/src/models/data/record/meal_record_model.dart`, `lib/src/controllers/data/meal_record_controller.dart`
|
||
- **问题3: _inferDataSource字段名不匹配** — 收藏导出使用 `favorite_type`(下划线),但推断逻辑只检查 `favoriteType`(驼峰)
|
||
- **修复**: `_inferDataSource` 同时检查 `favoriteType` 和 `favorite_type`
|
||
- **文件**: `lib/src/services/data/business/data_export_service.dart`
|
||
|
||
### ✨ 优化 — 数据导出格式重构
|
||
|
||
#### 重构: 导出JSON增加元数据标识
|
||
- **新增**: 全量导出和单源导出均添加 `_meta` 元数据字段
|
||
```json
|
||
{
|
||
"_meta": {
|
||
"app": "cute_kitchen",
|
||
"version": 2,
|
||
"exportTime": "2026-04-24T12:00:00",
|
||
"format": "full" | "single",
|
||
"source": "favorites"
|
||
},
|
||
"favorites": [...]
|
||
}
|
||
```
|
||
- **优化**: `previewImport` 增加元数据验证,拒绝非本应用导出的数据
|
||
- **优化**: `ImportPreview` 增加 `error` 字段,导入失败时显示具体原因
|
||
- **优化**: V1格式(无_meta)向下兼容,仍可识别
|
||
- **验证**: `scripts/test_export_import.dart` 45项测试全部通过
|
||
|
||
|
||
## [0.99.40] - 2026-04-24
|
||
|
||
### ✨ 新增 — 血液酒精含量(BAC)计算器
|
||
|
||
#### 新增: BAC计算器页面
|
||
- **功能**: 输入体重/饮酒量/酒精度/已过时间,计算血液酒精含量
|
||
- **算法**: Widmark公式,男性r=0.68,女性r=0.55,代谢率0.015%/小时
|
||
- **选填**: 性别、空腹状态,提高准确度
|
||
- **单位切换**: 已喝酒量支持 毫升↔斤↔公斤 三态切换(1斤=500ml, 1公斤=1000ml)
|
||
- **快捷选择**: 啤酒(5°)/葡萄酒(12°)/白酒(52°)/烈酒(40°)/酒心巧克力(5°)/自酿米酒(15°)/自酿果酒(12°)/自定义
|
||
- **结果卡片**: BAC核心结果、醉酒等级条、法律标准(中国)、醒酒时间、酒精摄入详情、安全提示
|
||
- **知识弹窗**: 📖按钮展示自我意识判断/醉酒症状识别/科学解酒方法/酒驾危害/免责声明
|
||
- **数据保存**: 💾按钮保存输入数据到本地
|
||
- **文件**: `lib/src/pages/tools/health/bac/` (bac_calculator.dart, bac_cards.dart, bac_page.dart)
|
||
- **验证**: `scripts/test_bac_calculator.dart` 40项测试全部通过
|
||
|
||
#### 新增: 参考文献页面增加酒精计算数据来源
|
||
- Widmark公式与BAC (Wikipedia)
|
||
- 中国酒驾醉驾标准 (GB 19522-2010)
|
||
- WHO酒精代谢与健康
|
||
- 🍺 酒精计算分类条目增加「计算器」跳转按钮
|
||
|
||
### ✨ 优化 — 身体分析页面5项需求实现 + 溢出修复
|
||
|
||
#### 修复: Tab页面底部溢出 1084px
|
||
- **根因**: 3个Tab使用 `Column` 布局,内容超出 `SizedBox` 固定高度(900-1200px)
|
||
- **修复**: Tab内部改用 `SingleChildScrollView` 支持滚动
|
||
- **新增**: 每个Tab底部增加 👈 左右滑动切换提示
|
||
|
||
#### 修复: Tab滑到底后无法滑回顶部
|
||
- **根因**: 外层 `ListView` 与内层 `SingleChildScrollView` 嵌套滚动冲突,向上滑动时外层抢占手势
|
||
- **修复**: 分析结果展示时改用 `Column` + `Expanded` 布局,PageView独立占据剩余空间,彻底消除嵌套滚动
|
||
- **优化**: 结果页面顶部改为紧凑信息栏(性别/年龄/身高/体重)+ 🔄重新分析按钮,节省空间
|
||
|
||
#### 新增: 趣味统计 - 各星球体重
|
||
- **功能**: 展示用户在9个天体(水星/金星/地球/火星/木星/土星/天王星/海王星/月球)上的体重
|
||
- **数据**: 基于各行星相对地球的平均重力加速度计算
|
||
- **UI**: 使用 Wrap 布局的 Chip 样式展示,地球高亮标记
|
||
|
||
#### 新增: 有氧运动(燃脂)心率计算卡片
|
||
- **功能**: 在核心指标Tab中BMI卡片后新增 ❤️🔥 燃脂最佳心率卡片
|
||
- **展示**: 渐变背景大字显示最佳心率区间 xx-xx bpm,标注为最大心率的60%~70%
|
||
|
||
#### 优化: 摄入需求/蛋白质根据BMI智能显示
|
||
- **逻辑**: 偏瘦(BMI<18.5)隐藏减脂选项,肥胖(BMI≥28)隐藏增肌选项
|
||
- **影响**: GoalCaloriesCard 和 ProteinCard 均已适配
|
||
|
||
#### 新增: Tab滑动边缘发光动画
|
||
- **效果**: 在第1个Tab继续左滑时,左边缘显示主题色渐变发光;最后1个Tab右滑同理
|
||
- **实现**: NotificationListener监听OverscrollNotification,Stack+Positioned叠加边缘发光层
|
||
|
||
#### 删除: BMI计算器页面
|
||
- **原因**: 身体分析页面已完整覆盖BMI计算功能及更多指标
|
||
- **影响文件**: 删除 bmi_calculator_page.dart,移除 app_routes.dart 中 bmiCalculator/toolsBmi 路由和 PageRegistry
|
||
- **联动**: 体重管理页面 BMI 跳转按钮改为跳转身体分析页面
|
||
|
||
#### 优化: 重新分析按钮展开编辑框
|
||
- **改动**: 点击"🔄 重新分析"时,同时展开输入区域并取消隐藏状态
|
||
|
||
#### 需求1: 修复按钮状态不实时更新
|
||
- **问题**: 输入身高/年龄/体重后,"开始分析"按钮仍为禁用状态,需额外操作才能激活
|
||
- **根因**: `onChanged` 仅在 `_hasResult == true` 时调用 `setState()`,首次输入不触发重建
|
||
- **修复**: `onChanged` 始终调用 `setState()`,按钮状态实时响应输入
|
||
|
||
#### 需求2: AppBar 增加隐私与算法说明
|
||
- 在导航栏右侧增加 ℹ️ 图标按钮
|
||
- 点击弹出 `CupertinoAlertDialog`,包含:
|
||
- 🔒 隐私声明:所有数据仅在本地计算,不会联网上传
|
||
- 📐 算法来源:Harris-Benedict / Mifflin-St Jeor / US Navy / Karvonen 等
|
||
- ⚠️ 免责声明:仅供学习参考,禁止医用、禁止商用
|
||
|
||
#### 需求3: 参考文献页面增加身体分析数据来源
|
||
- 新增 7 条 🧬 身体分析分类参考文献:
|
||
- Harris-Benedict BMR 公式 (Wikipedia)
|
||
- Mifflin-St Jeor BMR 公式 (PubMed)
|
||
- US Navy 体脂率估算法 (US Navy)
|
||
- Karvonen 心率区间公式 (Wikipedia)
|
||
- WHO BMI 分类与肥胖标准 (WHO)
|
||
- 中国居民膳食营养素参考摄入量 2023版 (中国营养学会)
|
||
- Mosteller 体表面积计算公式 (Wikipedia)
|
||
|
||
#### 需求4: 基础信息卡片增加保存/隐藏按钮
|
||
- 💾 保存按钮:将填写信息写入 SharedPreferences,下次打开自动填充
|
||
- 👁️ 隐藏/显示按钮:切换输入区域显示状态,数据保留仅隐藏表单
|
||
|
||
#### 需求5: 核心指标/科学指数/趣味统计支持左右滑动
|
||
- 将 Tab 切换改为 `PageView` 实现,支持手势左右滑动
|
||
- `GlassSegmentedControl` 与 `PageView` 双向联动
|
||
|
||
#### 涉及文件
|
||
- `body_analysis_page.dart` — 全部5项需求实现
|
||
- `references_page.dart` — 新增7条身体分析参考文献
|
||
|
||
---
|
||
|
||
## [0.99.39] - 2026-04-24
|
||
|
||
### 🐛 修复 — 排敏助手页面一直转圈 + 闪退 + Obx异常
|
||
|
||
#### 问题1: 页面一直转圈(无法加载)
|
||
- **根因**: `GetBuilder` 不监听 `RxBool isLoading` 变化,`_loadData()` 完成后 `isLoading.value = false` 无法触发重建
|
||
- **修复**: `AntiController._loadData()` 完成后调用 `update()`;`anti_main_page` 中 `isLoading` 判断改用 `Obx` 局部包裹
|
||
|
||
#### 问题2: Obx "improper use" 异常
|
||
- **根因**: 将整个页面用 `Obx` 包裹,但部分页面未直接访问 `.obs` 变量,GetX 无法追踪
|
||
- **修复**: 所有页面改回 `GetBuilder` + controller 中所有数据修改方法添加 `update()` 调用
|
||
|
||
#### 问题3: 点击"开始记录"闪退
|
||
- **根因**: 只有 `antiMain` 路由有 `binding` 注册 `AntiController`,其他6个子路由缺少 binding,导航时 `Get.find<AntiController>()` 找不到 controller
|
||
- **修复**: 所有 anti 子路由添加 `binding: BindingsBuilder(() => Get.lazyPut(() => AntiController(), fenix: true))`
|
||
|
||
#### 问题4: Opacity 断言错误
|
||
- **根因**: `Curves.easeOutBack` 回弹曲线值超过1.0,`Opacity` 要求值在 [0.0, 1.0] 范围
|
||
- **修复**: `opacity: value.clamp(0.0, 1.0)`
|
||
|
||
#### 涉及文件
|
||
- `anti_controller.dart` — 所有修改数据方法添加 `update()` 调用
|
||
- `anti_main_page.dart` — `GetBuilder` + 局部 `Obx` 包裹 `isLoading`
|
||
- `anti_detail/add/heatmap/rating/tags/list_page.dart` — 改回 `GetBuilder`
|
||
- `app_routes.dart` — 所有 anti 路由添加 binding + fenix: true
|
||
- `anti_empty_state.dart` — opacity clamp 修复
|
||
|
||
---
|
||
|
||
## [0.99.38] - 2026-04-24
|
||
|
||
### 🧹 清理 — 排敏模块(anti) 135项分析警告清零
|
||
|
||
#### 修复Warnings (5项)
|
||
- `_isSubmitting` 未使用 → 添加到保存按钮防重复提交逻辑
|
||
- `dead_code` / `dead_null_aware_expression` → `as String` 改为 `as String?`
|
||
- `_hoveredIndex` 未使用 → 移除
|
||
- `isHalfFilled` 未使用 → 移除
|
||
|
||
#### 修复Deprecated (119项)
|
||
- `withOpacity()` 全部替换为 `withValues(alpha:)` (14个文件)
|
||
|
||
#### 修复Info (11项)
|
||
- `use_build_context_synchronously` → 添加 `mounted` 检查 + `// ignore` 注释
|
||
- `prefer_final_fields` → `_selectedTags` 改为 `final`
|
||
- `unnecessary_import` → 移除冗余 `cupertino.dart` 导入
|
||
- `strict_top_level_inference` → `var` 改为具体类型 `AllergenElimination`
|
||
|
||
---
|
||
|
||
## [0.99.37] - 2026-04-24
|
||
|
||
### ✨ 新增 + 🐛 修复 — 身体分析新增9项指标 + Conicity Index单位修复
|
||
|
||
#### 新增指标
|
||
- 🔬 **科学指数Tab** +4项:
|
||
- 🏋️ FFMI 无脂肪质量指数 + 标准化FFMI + 等级判定
|
||
- 📐 Ponderal 体重指数(Rohrer指数,BMI改进版)
|
||
- ⚡ 基础代谢效率 (BMR/kg)
|
||
- 🔔 锥度指数 (Conicity Index,需腰围)
|
||
- 🎮 **趣味统计Tab** +5项:
|
||
- 🫁 一生呼吸总次数
|
||
- 👁️ 一生眨眼总次数
|
||
- 🧴 一生皮肤细胞脱落量
|
||
- 🍽️ 一生消耗食物总重量
|
||
- 🚶 一生行走距离估算
|
||
|
||
#### 🐛 Bug修复
|
||
- 修复 Conicity Index 计算公式中 waist 单位错误(cm→m),原结果偏大约1000倍
|
||
|
||
#### 验证
|
||
- 新增 `scripts/test_body_analysis.dart` 算法验证脚本(59项测试全部通过)
|
||
- 运行: `dart run scripts/test_body_analysis.dart`
|