Files
kitchen/CHANGELOG.md
Developer 3c90407bb5 3d
2026-04-25 01:18:50 +08:00

13 KiB
Raw Blame History

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修复

修复: 主题跟随系统切换不实时生效

  • 问题: 开启"跟随系统"后,切换系统深色模式,应用未实时切换
  • 根因: GetCupertinoAppObx 闭包内未直接访问 isDarkMode.value,导致 GetX 未追踪到主题状态变化
  • 修复: 在 main.dartObx 闭包内显式引用 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缺少toJsonexportToJson() 直接序列化 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 同时检查 favoriteTypefavorite_type
    • 文件: lib/src/services/data/business/data_export_service.dart

优化 — 数据导出格式重构

重构: 导出JSON增加元数据标识

  • 新增: 全量导出和单源导出均添加 _meta 元数据字段
    {
      "_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监听OverscrollNotificationStack+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 实现,支持手势左右滑动
  • GlassSegmentedControlPageView 双向联动

涉及文件

  • 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_pageisLoading 判断改用 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.0Opacity 要求值在 [0.0, 1.0] 范围
  • 修复: opacity: value.clamp(0.0, 1.0)

涉及文件

  • anti_controller.dart — 所有修改数据方法添加 update() 调用
  • anti_main_page.dartGetBuilder + 局部 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_expressionas 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_inferencevar 改为具体类型 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