31 KiB
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.com),Android 9+ 默认禁止明文 HTTP 流量 - Release 构建缺少 ProGuard 混淆规则,导致 Flutter 引擎相关类被错误混淆
- 应用使用 HTTP 协议(
- 修复方案:
- ✅ 创建
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.ktsandroid/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>强制类型转换失败
- API 返回的 JSON 数据类型为
- 修复方案:
- ✅ 添加
_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 中的 assets 配置为
- 影响文件:
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.png —
recipe_image.dart- 问题:所有图片都显示为远程
back.png,而非正确的菜谱图片 - 根因分析:
- 图片加载 fallback 链中包含远程
back.png作为回退 - 导致所有图片最终都回退到
back.png
- 图片加载 fallback 链中包含远程
- 修复方案:
- ✅ 移除远程
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,_parseIngredientDetailfeed_item_model.dart- 修复_parseStatisticsapi_response.dart- 修复PaginatedData.fromJsoningredient_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方法中存在异常循环:- 网络图片下载后通过头部校验(仅检查前8字节)→ 存入
_imageBytes Image.memory(_imageBytes!)解码完整数据 → 抛出Invalid image异常errorBuilder捕获 → 调用_buildErrorWidget(isDark)- ❌
_buildErrorWidget发现_imageBytes != null,再次用Image.memory(_imageBytes!)显示同一份无效数据,且无errorBuilder - 再次抛异常 → 无捕获 → Flutter红色错误面板泄露到UI
- 网络图片下载后通过头部校验(仅检查前8字节)→ 存入
- 修复方案:
- ✅
_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/此菜谱无图片链接
- 复制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
- ✅ 添加
- 图片加载链:
- ① coverUrl(API返回的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_idact=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_at、update_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)
- ✅ 搜索功能重写 — 直接调用API,iOS 26风格UI(优先级4)
- ✅ 今天吃什么动态筛选 — 分类/标签/过敏原三重筛选(优先级4)
- ✅ 热门排行HotItem模型 — 支持period/sortBy切换(优先级3)
- ✅ 首页横向滑动卡片 — PageView+ListView双模式(优先级3)
- ✅ 营养中心偏好修复 — 用户初始化+分类/标签加载(优先级3)
- ✅ 实用工具入口 — 烹饪计时/用量换算/BMI/份量缩放(优先级2)
- ✅ 页面拦截修复 — 路由守卫+PageRegistry注册(优先级2)
- ✅ 布局溢出修复 — 标签栏横向滑动+工具区横向滚动(优先级2)
- ✅ 工具中心布局溢出修复 — 移除Spacer+mainAxisExtent替代childAspectRatio(v0.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 Glass(v0.65.0)
待开发功能(详见 UNFINISHED_FEATURES.md 阶段九~十三)
阶段九:架构修复+核心Bug(P0/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
贡献指南
- 遵循 iOS 风格设计规范
- 使用主题服务统一管理颜色和字体
- 使用动画服务统一管理动画效果
- 新增功能需更新 CHANGELOG.md
- 代码提交前运行
flutter analyze确保无错误 - 新建页面必须支持 GetX 状态管理