Files
kitchen/CHANGELOG.md
2026-04-11 22:55:27 +08:00

31 KiB
Raw Blame History

Changelog

All notable changes to this project will be documented in this file.

[0.88.1] - 2026-04-11

Enhanced — 软件特性功能完善

  • 功能状态审核与完善

    • 购物清单 - 已完成:菜谱详情页"购物"按钮可添加食材到购物清单
    • 过敏原检测 - 已完成AllergenChecker完整实现包含11类过敏原关键词映射和检测逻辑
    • 烹饪笔记 - 已完成CookingNotePage完整实现支持按菜谱关联笔记
    • 份量缩放 - 已完成:菜谱详情页"缩放"按钮可传递食材到serving_scaler_page
    • 食材详情查询 - 已完成:包含营养信息、选购技巧、存储提示、关键营养素、最佳时令等
    • 每周菜单规划 - 已完成七日横向滑动日历、三餐分配、购物清单、Hive持久化
    • 热量追踪+营养分析 - 已完成:包含环形图、柱状图、饼图(营养素占比+餐次分布)、折线图(热量趋势)
    • AI菜谱推荐 - 已完成:基于用户偏好、浏览历史、收藏记录的智能推荐
    • 就寝提醒 - 已完成:智能推荐就寝时间、睡前进食提醒、健康小贴士
  • 📝 文档更新

    • 更新UNFINISHED_FEATURES.md软件特性功能汇总表
    • 修正不实标记,准确反映功能完成状态
    • 新增v0.88.x功能条目

[0.88.0] - 2026-04-11

Added — 阶段十三AI+规划高级功能

  • 13.1 AI菜谱推荐lib/src/services/recommendation_service.dart, lib/src/pages/home/home_page.dart

    • 功能:基于用户偏好、浏览历史、收藏记录的智能菜谱推荐
    • 实现
      • 创建RecommendationService推荐服务
      • 基于PreferenceController的用户偏好分类、标签、过敏原
      • 基于FavoritesController的收藏记录
      • 基于浏览历史记录
      • 实现个性化推荐算法(协同过滤+热度加权)
      • 支持相似菜谱推荐
    • UI更新
      • 首页添加"为你推荐"Tab
      • Tab切换今日推荐/为你推荐
      • 推荐结果横向滑动卡片展示
    • 影响文件
      • lib/src/services/recommendation_service.dart (新建)
      • lib/src/pages/home/home_page.dart (修改)
  • 13.2 每周菜单规划lib/src/pages/tools/weekly_menu_planner_page.dart

    • 功能:日历视图规划一周饮食,自动生成购物清单
    • 实现
      • 创建WeeklyMenuModel数据模型
      • 创建WeeklyMenuController控制器
      • 七日横向滑动日历视图
      • 每日早/中/晚三餐分配菜谱
      • 从菜谱列表选择添加到对应餐次
      • 自动汇总生成购物清单
      • 支持食材勾选状态
      • Hive持久化存储菜单数据
    • UI设计
      • iOS风格日历组件
      • 餐次卡片展示(早餐/午餐/晚餐)
      • 购物清单弹窗
      • 菜谱选择器
    • 影响文件
      • lib/src/models/weekly_menu_model.dart (新建)
      • lib/src/controllers/weekly_menu_controller.dart (新建)
      • lib/src/pages/tools/weekly_menu_planner_page.dart (新建)
  • 13.3 食材用量换算增强lib/src/pages/tools/serving_scaler_page.dart

    • 功能:支持多种单位换算(已在之前版本实现)
    • 实现
      • 重量单位:克/千克/磅/盎司/斤/两
      • 容量单位:毫升/升/杯/汤匙/茶匙/fl oz
      • 计数单位:个/根/片/瓣/条/块/把/勺/滴
      • 常用换算快捷参考表
    • UI更新
      • 添加单位换算Tab
      • 分类选择器(重量/容量/计数)
      • 单位选择器
      • 换算结果展示
    • 影响文件
      • lib/src/pages/tools/serving_scaler_page.dart (已实现,无需修改)
  • 13.4 就寝提醒lib/src/pages/profile/bedtime_reminder_page.dart

    • 功能:根据晚餐时间推荐健康作息
    • 实现
      • 创建BedtimeReminderController控制器
      • 晚餐时间选择器
      • 智能推荐就寝时间晚餐后3小时
      • 睡前进食提醒睡前2小时内不宜进食
      • 提醒设置开关
      • 提前提醒设置15-60分钟
      • Hive持久化存储设置
      • 健康小贴士展示
    • UI设计
      • 晚餐时间卡片
      • 推荐就寝时间展示
      • 提醒设置卡片
      • 睡前进食提醒卡片(动态警告)
      • 健康小贴士卡片
    • 影响文件
      • lib/src/controllers/bedtime_reminder_controller.dart (新建)
      • lib/src/pages/profile/bedtime_reminder_page.dart (新建)

Changed — 路由配置更新

  • 🔄 app_routes.dart — 添加新页面路由
    • 添加 weeklyMenuPlanner 路由
    • 添加 bedtimeReminder 路由
    • 注册对应的GetPage
    • 影响文件lib/src/config/app_routes.dart

[0.87.0] - 2026-04-11

Fixed — 阶段三十九Android Release 包白屏问题修复

  • 🐛 39.1 Android Release 包安装后白屏android/app/build.gradle.kts, android/app/src/main/AndroidManifest.xml
    • 问题:安卓端打包 release 安装后打开白屏debug 包正常
    • 根因分析
      • 应用使用 HTTP 协议(http://eat.wktyl.comAndroid 9+ 默认禁止明文 HTTP 流量
      • Release 构建缺少 ProGuard 混淆规则,导致 Flutter 引擎相关类被错误混淆
    • 修复方案
      • 创建 proguard-rules.pro 文件,添加 Flutter 引擎和插件混淆规则
      • 创建 network_security_config.xml,允许 eat.wktyl.com 域名使用 HTTP 明文流量
      • 修改 build.gradle.kts,在 release 构建中启用代码混淆和资源压缩
      • 修改 AndroidManifest.xml,添加网络安全配置引用
    • 影响文件
      • android/app/proguard-rules.pro (新建)
      • android/app/src/main/res/xml/network_security_config.xml (新建)
      • android/app/build.gradle.kts
      • android/app/src/main/AndroidManifest.xml

[0.86.0] - 2026-04-11

Fixed — 阶段三十八:多项问题修复与功能优化

  • 🐛 38.1 搜索结果点击卡死闪退recipe_repository.dart, recipe_model.dart

    • 问题:点击搜索结果跳转到详情页时,应用卡死闪退
    • 根因分析
      • API 返回的 JSON 数据类型为 Map<dynamic, dynamic>
      • 代码中使用 as Map<String, dynamic> 强制类型转换失败
    • 修复方案
      • 添加 _safeMap_safeMapOrNull 辅助方法
      • 修复 fetchFull, search, fetchIngredients 等方法中的类型转换
      • 修复 _parseStatistics, _parseMeta, _parseNutrition 等解析方法
      • 修复 NutritionInfo.fromList 中的类型过滤问题
    • 影响文件recipe_repository.dart, recipe_model.dart
  • 🐛 38.2 菜品详情页笔记功能卡死闪退cooking_note_page.dart

    • 问题:点击笔记按钮跳转到笔记页面时,应用卡死闪退
    • 根因分析
      • 页面中控制器获取逻辑过于复杂
      • 存在未使用的 _buildErrorView_buildErrorBody 方法
    • 修复方案
      • 简化控制器获取逻辑,直接使用 Get.find<CookingNoteController>()
      • 移除冗余的错误处理代码
      • 统一使用 _controller 变量
    • 影响文件cooking_note_page.dart

Added — 阶段三十八:新功能

  • 38.3 主页顶部按时段问候语home_page.dart
    • 功能:主页顶部右侧显示按时段变化的问候语
    • 交互:点击问候语切换显示时段/提示语,循环切换
    • 时段划分
      • 清晨 (5-7时): "清晨好" / "清晨了,呼吸新鲜空气"
      • 早上 (7-9时): "早上好" / "早上好,元气满满"
      • 上午 (9-12时): "上午好" / "上午好,努力工作"
      • 中午 (12-14时): "中午好" / "中午了,吃顿好的"
      • 下午 (14-17时): "下午好" / "下午了,喝杯咖啡"
      • 傍晚 (17-19时): "傍晚好" / "傍晚了,休息一下"
      • 晚上 (19-22时): "晚上好" / "晚上好,放松身心"
      • 深夜 (22-5时): "夜深了" / "深夜了,注意身体"
    • 影响文件home_page.dart

[0.85.0] - 2026-04-11

Fixed — 阶段三十七Assets 路径配置错误修复

  • 🐛 37.1 Assets 目录路径配置错误pubspec.yaml, recipe_image.dart
    • 问题:运行时报错 Error: unable to find directory entry in pubspec.yaml: assets/data/photos/
    • 根因分析
      • 实际目录结构是 assets/photos/error.png
      • pubspec.yaml 配置的是 assets/data/photos/
      • recipe_image.dart 中引用的路径也是 assets/data/photos/error.png
    • 修复方案
      • 修正 pubspec.yaml 中的 assets 配置为 assets/photos/
      • 修正 recipe_image.dart 中的路径为 assets/photos/error.png
    • 影响文件pubspec.yaml, recipe_image.dart

[0.84.0] - 2026-04-11

Fixed — 阶段三十六:图片加载验证逻辑优化

  • 🐛 36.1 图片全部显示error.png网络图片无法加载recipe_image.dart
    • 问题:服务器上 {picId}a.jpg 图片存在,但所有图片都显示本地 error.png
    • 根因分析
      • _canDecodeImage 方法中的 buffer.dispose()codec.dispose() 之后调用
      • 在某些情况下,这可能导致解码验证失败
      • 解码验证过于严格,导致有效图片被拒绝
    • 修复方案
      • 移除 _canDecodeImage 解码验证方法
      • 仅保留 _isValidImageData 头部校验(检查 JPEG/PNG/GIF/WebP/BMP 魔数)
      • 添加详细调试日志,便于追踪加载流程
      • 更新 fallback 链:coverUrl → {picId}a.jpg → {picId}b.jpg → {picId}.jpg → 本地error.png → 空白
    • 影响文件recipe_image.dart

[0.83.0] - 2026-04-11

Fixed — 阶段三十五:图片加载逻辑优化

  • 🐛 35.1 图片显示不正确全部显示back.pngrecipe_image.dart
    • 问题:所有图片都显示为远程 back.png,而非正确的菜谱图片
    • 根因分析
      • 图片加载 fallback 链中包含远程 back.png 作为回退
      • 导致所有图片最终都回退到 back.png
    • 修复方案
      • 移除远程 back.png 回退
      • 更新 fallback 链:coverUrl → {picId}a.jpg → {picId}b.jpg → {picId}.jpg → 本地error.png → 空白
      • 直接使用本地 error.png 作为最终回退
    • 影响文件recipe_image.dart

[0.82.0] - 2026-04-11

Fixed — 阶段三十四:搜索结果点击卡死闪退修复

  • 🐛 34.1 搜索结果点击导致应用崩溃recipe_model.dart, feed_item_model.dart, api_response.dart, ingredient_model.dart
    • 问题:点击搜索结果跳转到详情页时,应用卡死闪退
    • 根因分析
      • RecipeModel.fromJson 等模型解析方法中使用 as Map<String, dynamic> 强制类型转换
      • 当 API 返回的数据类型为 Map<dynamic, dynamic> 时,强制转换失败抛出异常
      • 异常未被捕获,导致应用崩溃
    • 修复方案
      • as Map<String, dynamic> 替换为安全的类型检查 is Map<String, dynamic>
      • 添加 Map<String, dynamic>.from(v) 作为降级处理
      • 使用 try-catch 包裹解析逻辑,防止异常传播
      • 使用 whereType<T>() 过滤掉解析失败的项
    • 影响文件
      • recipe_model.dart - 修复 _parseIngredients, _parseList, _parseIngredientDetail
      • feed_item_model.dart - 修复 _parseStatistics
      • api_response.dart - 修复 PaginatedData.fromJson
      • ingredient_model.dart - 修复 _parseStatistics

[0.81.0] - 2026-04-11

Fixed — 阶段三十三多项UI与数据问题修复

  • 🐛 33.1 主页搜索框顶部多余视图移除home_page.dart

    • 问题:主页标题和搜索框之间存在多余的视图
    • 修复:移除重复的搜索按钮组件,清理冗余代码
    • 影响文件home_page.dart
  • 🐛 33.2 发现页面推荐添加菜谱/食材选项卡discover_page.dart

    • 问题:发现页面推荐部分缺少菜谱和食材切换选项
    • 修复
      • 添加 GlassSegmentedControl 组件切换菜谱/食材
      • 新增食材分类数据加载 _ingredientCategories
      • 根据选择类型显示对应分类列表
    • 影响文件discover_page.dart
  • 🐛 33.3 菜品详情页使用完整API获取数据recipe_detail_page.dart

    • 问题:菜品详情页使用 act=detail 接口数据不完整picId 显示无
    • 修复:改用 fetchFull() 方法调用 act=full 接口获取完整数据
    • 影响文件recipe_detail_page.dart
  • 🐛 33.4 首页下拉刷新手势识别修复home_page.dart

    • 问题:下拉刷新手势识别不正确
    • 修复
      • 移除 CustomScrollView 的 ScrollController
      • 添加 BouncingScrollPhysics 改善手势体验
    • 影响文件home_page.dart
  • 🐛 33.5 下拉刷新数据不更新修复recipe_repository.dart

    • 问题:下拉刷新后列表数据不更新,一直显示相同内容
    • 修复:在 API 调用中添加 forceRefresh 参数,强制刷新缓存
    • 影响文件recipe_repository.dart

[0.80.0] - 2026-04-11

Fixed — 阶段三十二:全局图片异常 + 底部导航栏黑块修复

  • 🐛 32.1 全页面 Exception: Invalid image 彻底修复recipe_image.dart

    • 问题:搜索页、用餐时段页、分类浏览页等所有使用 RecipeImage 的页面均出现红色异常文本
    • 根因(深度分析)
      • _isValidImageData() 仅检查前8字节头部无法检测截断/损坏的图片文件
      • 损坏数据通过头部校验 → 存入缓存 → Image.memory 解码失败 → 异常泄露
      • _buildErrorWidget 引用已确认无效的 _imageBytes → 二次异常 → 无 errorBuilder → 泄露到UI
    • 彻底修复方案
      • 新增 _canDecodeImage() 完整解码验证(instantiateImageCodecFromBuffer),下载后真实验证图片可解码性
      • 新增独立状态 _displayHasError 隔离显示错误与数据状态,防止状态污染
      • _onDisplayError() 立即清除无效 _imageBytes = null,防止复用
      • _loadLocalErrorFallback() 不再将无效数据存入 _imageBytes
      • 提取 _buildSafeImageWidget() 统一管理 Image.memory + errorBuilder
      • 所有 fallback 路径最终指向 _buildBlankPlaceholder 🍽️,彻底切断异常链
    • 影响文件recipe_image.dart
  • 🐛 32.2 底部 Tab 栏下层黑块移除navigation_widgets.dart

    • 问题:主页底部 Tab 栏(首页/收藏/发现/我的)下方出现黑色条带,亮色模式下尤为明显
    • 根因MainTabView 使用 Column 布局,GlassNavBar(毛玻璃半透明)作为 Column 子项位于底部。半透明的 nav bar 后方暴露了 Column 剩余区域的不一致背景色
    • 修复方案
      • 将布局从 Column 改为 Stack + Positioned(bottom:0) 浮层结构
      • 页面内容区IndexedStack填充上方全部空间
      • 导航栏浮于最上层,外层 Container 背景色完整覆盖底层
      • 消除 nav bar 与页面内容之间的背景缝隙/黑块
    • 影响文件navigation_widgets.dart

[0.79.0] - 2026-04-11

Fixed — 阶段三十一:搜索页相似推荐图片异常修复

  • 🐛 31.1 搜索页相似推荐显示"Exception: Invalid image"recipe_image.dart
    • 问题:搜索无结果时,相似推荐列表的食谱卡片图片区域显示红色错误文本Exception: Invalid image
    • 根因_buildErrorWidget方法中存在异常循环
      1. 网络图片下载后通过头部校验仅检查前8字节→ 存入_imageBytes
      2. Image.memory(_imageBytes!)解码完整数据 → 抛出Invalid image异常
      3. errorBuilder捕获 → 调用_buildErrorWidget(isDark)
      4. _buildErrorWidget发现_imageBytes != null,再次用Image.memory(_imageBytes!)显示同一份无效数据,且无errorBuilder
      5. 再次抛异常 → 无捕获 → Flutter红色错误面板泄露到UI
    • 修复方案
      • _buildErrorWidget改用_localErrorBytes本地error.png替代_imageBytes
      • 新增_buildBlankPlaceholder方法,提取空白占位逻辑
      • errorBuilder链路全部指向安全的占位组件彻底切断异常循环
      • 即使本地error.png加载失败也会降级为🍽️文字占位
    • 影响文件recipe_image.dart

[0.78.0] - 2026-04-11

Added — 阶段三十:图片信息卡片功能增强

  • 31.1 新增复制图片URL按钮recipe_detail_page.dart
    • 需求在复制Picid按钮右边添加复制图片URL按钮
    • 功能实现
      • 📋 "复制Picid"按钮 - 复制picId到剪贴板
      • 🔗 "复制URL"按钮 - 复制图片链接到剪贴板
      • 💬 点击按钮显示Toast气泡提示
    • UI优化
      • 两个按钮并排显示间距8px
      • 使用GestureDetector实现独立点击事件
      • 按钮样式统一:主题色背景+圆角
    • Toast提示
      • 复制Picid成功Picid 已复制: 7640 ✅
      • 复制URL成功图片URL已复制 ✅
      • 无效操作:此菜谱无有效 Picid / 此菜谱无图片链接
    • 影响文件recipe_detail_page.dart

[0.77.0] - 2026-04-11

Fixed — 阶段二十九:详情页图片加载修复

  • 🐛 30.1 详情页封面图加载失败recipe_detail_page.dart
    • 问题详情页封面图显示error.png网络图片未正确加载
    • 根因_buildCoverImage方法使用RecipeImage.full时未传递picId参数
    • 修复方案
      • 添加picId: _recipe!.picId参数传递
      • RecipeImage组件使用picId构建正确的图片URL
    • 图片加载链
      • ① coverUrlAPI返回的cover字段
      • ② {picId}a.jpg高清图
      • ③ {picId}b.jpg标清图
      • ④ {picId}.jpg原图
      • ⑤ back.png网络默认图
      • ⑥ error.png本地错误图
    • 影响文件recipe_detail_page.dart

[0.76.0] - 2026-04-11

Optimized — 阶段二十八API接口优化

  • 29.1 优化详情页接口调用recipe_repository.dart
    • 背景api.php?act=detail 现已支持 pic_id 字段
    • 优化方案
      • fetchDetailWithPicId 改用 api.php?act=detail 接口
      • 移除对 api_what_to_eat.php 的依赖
      • 统一使用主接口,降低维护成本
    • API更新
      • api.php?act=detail - 现已支持pic_id字段
      • api.php?act=list - 列表接口,轻量级
      • api_feed.php - 信息流接口,轻量级
    • 主页信息流
      • 已使用轻量级接口(api_feed.php + api.php?act=list
      • 避免使用全字段接口(act=full
    • 影响文件recipe_repository.dart, docs/api/doc/APP_GUIDE.md

[0.75.0] - 2026-04-11

Fixed — 阶段二十七Picid数据加载问题修复

  • 🐛 28.1 Picid显示为无的根本原因修复recipe_detail_page.dart
    • 问题菜谱详情页Picid依旧显示"无",图片无法正确加载
    • 根因:使用fetchDetail方法act=detail获取数据该接口不返回pic_id字段
    • 修复方案
      • 新增fetchDetailWithPicId方法,使用api_what_to_eat.php?act=detail接口
      • 该接口返回包含pic_id的完整数据,且比act=full更快
      • 减少服务器负载,提升响应速度
      • 🔍 添加详细调试日志输出picId/cover/code/status等字段
    • API对比
      • act=detail - 返回基础信息,不含pic_id
      • act=full - 返回完整信息,包含pic_id但慢
      • api_what_to_eat.php?act=detail - 返回详情含pic_id推荐使用
    • 测试验证
      • 创建test_pic_id_validation.dart脚本验证API接口
      • 验证结果api_what_to_eat.php返回pic_id=7640
      • 图片链接测试7640a.jpg/7640b.jpg可访问back.png可访问
    • 影响文件recipe_detail_page.dart, recipe_repository.dart, scripts/test_pic_id_validation.dart

[0.74.0] - 2026-04-11

Enhanced — 阶段二十六:图片链接完整显示

  • 27.1 显示完整图片链接列表recipe_detail_page.dart
    • 需求:显示所有图片链接,包括高清/标清/原图/默认图
    • 功能实现
      • 📋 显示完整的图片链接列表(按优先级排序)
      • ① Cover - API返回的cover字段如果有
      • ② 高清 - {picId}a.jpg
      • ③ 标清 - {picId}b.jpg
      • ④ 原图 - {picId}.jpg
      • ⑤ 默认 - back.png
    • UI优化
      • 每个链接前显示标签(①②③④⑤)
      • 链接使用等宽字体monospace
      • 支持选中复制单个链接
      • 点击卡片复制Picid
    • 技术细节
      • 使用 imageUrls.asMap().entries.map() 遍历列表
      • 标签使用Container + 主题色背景
      • 链接使用SelectableText支持选中
    • 影响文件recipe_detail_page.dart

[0.73.0] - 2026-04-11

Fixed — 阶段二十五Picid功能Bug修复

  • 🐛 26.1 Picid显示为0的问题recipe_detail_page.dart

    • 问题所有菜谱的Picid都显示为0
    • 根因API返回的pic_id字段可能不存在或为null_parseInt返回默认值0
    • 修复方案
      • 添加有效性检查:hasValidPicId = picId != null && picId > 0
      • 无效Picid时显示"无"不显示0
      • 无有效Picid时图片链接显示"暂无图片链接"
      • 🔍 添加调试日志输出picId实际值
    • 影响文件recipe_detail_page.dart
  • 🐛 26.2 点击复制卡死闪退recipe_detail_page.dart

    • 问题点击Picid卡片复制时应用卡死闪退
    • 根因ToastService.show可能因ThemeService未注册而崩溃
    • 修复方案
      • 新增 _showCopyToast() 方法安全显示Toast
      • 添加mounted检查防止Widget已销毁
      • Clipboard.setData包裹try-catch防止异常
      • 失败时显示友好提示而非崩溃
    • 影响文件recipe_detail_page.dart

[0.72.0] - 2026-04-11

Added — 阶段二十四:菜谱详情页功能增强

  • 25.1 Picid显示和复制功能recipe_detail_page.dart
    • 需求在菜谱详情页用户名称下方显示图片信息和Picid
    • 功能实现
      • 🖼️ 新增图片信息卡片,显示在作者卡片下方
      • 📋 显示Picid编号可选中复制
      • 🔗 显示图片链接(可选中复制)
      • 📋 点击卡片一键复制Picid到剪贴板
      • 💬 复制成功后显示Toast提示
    • UI设计
      • 卡片式设计,带主题色边框
      • 右上角显示"点击复制"提示标签
      • Picid使用等宽字体monospace高亮显示
      • 图片链接支持多行显示
    • 技术细节
      • 导入 flutter/services.dart 使用 Clipboard
      • 使用 SelectableText 支持文本选中
      • 无Picid时显示"无",但仍显示图片链接
    • 影响文件recipe_detail_page.dart

[0.69.0] - 2026-04-11

Enhanced — 阶段二十一:菜谱详情页完整数据展示

  • 22.1 RecipeModel 新增 status 字段 + 时间戳智能解析recipe_model.dart

    • 新增 status 字段,解析 API 返回的状态值0=正常/1=草稿/2=禁用)
    • 重构 _parseTimestamp 方法,支持多种时间戳格式:
      • 13位毫秒级时间戳直接使用
      • 10位秒级时间戳×1000转毫秒
      • 12位补齐至毫秒级×10或×100自动校正
    • 自动年份校验转换结果不在2000-2100范围时尝试修正
    • 兼容字段名:create_time/created_atupdate_time/updated_at
  • 22.2 菜谱详情页显示完整API数据recipe_detail_page.dart

    • 新增状态标识:带颜色标签显示菜谱状态(正常/⏸️草稿/🚫禁用)
    • 时间信息完善:创建时间 + 更新时间(自动格式化为可读日期)
    • 数据完整性确保API返回的所有字段都在UI中展示
    • 状态行使用iOS风格标签设计不同状态对应不同颜色
  • 🐛 22.3 时间戳转换Bug修复

    • 问题12位时间戳如146085838541被错误识别为秒级
    • 原因:判断条件 >1e12 对12位数值失效
    • 修复按位数长度精确判断12位时补零并验证年份范围
    • 测试验证146085838541 → 2016-04-17 09:59
  • 22.4 测试脚本scripts/test_recipe_detail_parsing.dart

    • 覆盖所有新增字段的解析测试
    • 验证时间戳转换准确性
    • 确认分类食材/作者/状态等数据完整性

[0.62.0] - 2026-04-10

Fixed — 营养中心崩溃修复

  • 🐛 营养中心报告按钮卡死闪退nutrition_center_page.dart / nutrition_report_page.dart

    • 添加 MealRecordController 初始化错误处理
    • 添加 null 检查,避免空指针异常
    • 导航时添加 try-catch 错误捕获
    • 显示友好的错误提示页面
  • 🐛 热门排行数据显示"暂无数据"hot_repository.dart

    • 添加详细调试日志,方便排查问题
    • 优化数据结构兼容性处理
    • 修复 period 参数传递错误
    • 添加错误提示和降级处理

Optimized — 性能优化

  • 今天吃什么动态筛选优化what_to_eat_controller.dart / what_to_eat_page.dart

    • 添加筛选条件调试日志
    • 优化空结果提示(显示已选筛选条件数量)
    • 改进错误信息显示
  • 启动加载优化home_page.dart

    • 添加骨架屏组件SkeletonLoader
    • 实现 12 秒超时保护
    • 添加缓存优先策略

Added — 测试工具

  • 🧪 接口验证脚本scripts/verify_nutrition_api.dart

    • 验证 API 接口连通性
    • 测试热门排行数据
    • 性能基准测试5 次迭代)
    • 彩色输出和详细统计
  • 📊 性能优化报告scripts/NUTRITION_PERFORMANCE.md

    • 接口验证结果汇总
    • API 接口文档摘要
    • 实际性能测试结果
    • 优化建议和验收标准
  • 📚 脚本工具说明scripts/README.md

    • 使用方法指南
    • 故障排查手册
    • 测试结果记录

Test Results — 测试结果

  • 接口连通性: 100% 成功率
  • 🟡 平均响应时间: 1393ms一般
  • 稳定性: 波动 < 100ms
  • 📈 优化空间: 目标 < 500ms

开发进度

已完成功能

  • 主题服务ThemeService+ 动态主题色 + 卡片滑动方向设置
  • 动画服务AnimationService
  • 国际化支持en, zh, zh_Hant
  • 权限管理服务
  • 自适应布局系统
  • GetX 全局状态管理
  • 标准组件库
  • 路由守卫系统
  • 繁体中文语言切换 + 弹窗/Toast 样式配置
  • 核心错误修复DeviceType/类型提升/空值检查等)
  • API 基础设施baseUrl + 模型 + Repository— 阶段一
  • 核心数据接入(首页真实数据)— 阶段二
  • 信息流 + 推荐系统 — 阶段三
  • 互动功能:点赞/推荐/浏览 — 阶段四
  • 用户偏好系统 — 阶段五
  • "今天吃什么"功能 — 阶段六
  • 热门排行 + 在线统计 — 阶段七
  • 缓存优化 + 离线支持 — 阶段八
  • API v2.0.0 迁移 — 13个接口文件精简到9个端点整合优先级5
  • 8个严重Bug修复 — 主页/搜索/收藏/口味偏好/热门排行/详情页优先级5
  • 搜索功能重写 — 直接调用APIiOS 26风格UI优先级4
  • 今天吃什么动态筛选 — 分类/标签/过敏原三重筛选优先级4
  • 热门排行HotItem模型 — 支持period/sortBy切换优先级3
  • 首页横向滑动卡片 — PageView+ListView双模式优先级3
  • 营养中心偏好修复 — 用户初始化+分类/标签加载优先级3
  • 实用工具入口 — 烹饪计时/用量换算/BMI/份量缩放优先级2
  • 页面拦截修复 — 路由守卫+PageRegistry注册优先级2
  • 布局溢出修复 — 标签栏横向滑动+工具区横向滚动优先级2
  • 工具中心布局溢出修复 — 移除Spacer+mainAxisExtent替代childAspectRatiov0.60.0
  • 浑水摸鱼功能补全 — 烹饪笔记+过敏原检测+份量缩放+菜单持久化+收藏添加+购物清单+食材营养+餐次饼图v0.64.0
  • 工具中心 — 数据模型+控制器+搜索/分类/频率统计+联网指示优先级4
  • 过敏原检查 — API数据加载+分类浏览+等级提示优先级3
  • 用餐时段推荐 — 时段自动推荐+分类搜索优先级3
  • 每周菜单规划 — 七日选择器+三餐规划+搜索/收藏选择优先级3
  • 食材详情查询 — 营养信息+分类+关联菜谱优先级3
  • 营养追踪仪表盘 — 首页环形图+四项指标优先级5
  • 搜索列表/今天吃什么Bug修复 — 空值检查+布局溢出优先级4
  • 统一 Controller Binding 注册 — AppBinding全局管理+移除重复注册优先级4
  • 崩溃修复 — 收藏页Obx崩溃+详情页营养全0检测v0.61.0
  • 阶段任务补全(12/13/14/16) — 分享菜谱+搜索热词API+单位换算+过敏原替代+点赞评分+浏览量统计+收藏页Liquid Glassv0.65.0

待开发功能(详见 UNFINISHED_FEATURES.md 阶段九~十三)

阶段九:架构修复+核心BugP0/P1

  • 🔴 热门排行点击跳转详情优先级5
  • 🔴 首页改用 Repository 层优先级5
  • 🟡 合并收藏功能去重优先级4
  • 🟡 合并搜索控制器去重优先级4
  • 🟡 多语言词条扩充优先级4
  • 🟢 聊天页面功能化或移除优先级3

阶段十代码质量提升P1/P2

  • 🟡 HiveService 数据迁移机制优先级3
  • 🟡 统一错误处理 AppException优先级4
  • 🟡 离线缓存策略优先级4
  • 🟢 DesignTokens 与 ThemeService 解耦优先级3

阶段十一:烹饪模式+营养仪表盘P1

  • 🟢 🍳 烹饪模式(步骤引导+计时器+语音播报优先级5
  • 🟢 📊 营养追踪仪表盘首页环形图优先级5
  • 🟢 🛒 菜谱食材一键加入购物清单优先级4
  • 🟢 📖 菜谱步骤图文模式优先级4

阶段十二:社交+通知增强P2

  • 🔵 📱 分享菜谱优先级4
  • 🔵 🔔 烹饪提醒通知优先级3
  • 🔵 🔍 搜索建议/热词优先级3
  • 🔵 📸 拍照记录优先级3

阶段十三AI+规划高级功能P3

  • 🔵 🤖 AI 菜谱推荐优先级2
  • 🔵 📅 每周菜单规划优先级3
  • 🔵 🧮 食材用量换算增强优先级2
  • 🔵 🌙 就寝提醒优先级1

技术栈

  • 框架: Flutter
  • 状态管理: GetX
  • 响应式布局: flutter_adaptive_scaffold
  • 动画系统: animations
  • 国际化: flutter_localizations + intl
  • 权限管理: permission_handler

贡献指南

  1. 遵循 iOS 风格设计规范
  2. 使用主题服务统一管理颜色和字体
  3. 使用动画服务统一管理动画效果
  4. 新增功能需更新 CHANGELOG.md
  5. 代码提交前运行 flutter analyze 确保无错误
  6. 新建页面必须支持 GetX 状态管理