13 KiB
13 KiB
Changelog
All notable changes to this project will be documented in this file.
[0.99.6] - 2026-04-19
🐛 Bug 修复 — 帮我做决定转盘指针指向分界线
问题描述
- 转盘指针总是指向扇区分界线:旋转结束后指针停在两个扇区的交界线上,而非内容区域中心
- 根因分析:
extraSpins始终为整数(5~9),视觉旋转角度为extraSpins × 2π,永远是完整圈数,转盘每次都回到起始位置_onSpinComplete中角度计算存在* 5遗留 bug 和+ π/2错误偏移
修复方案
- 📝 修改
decision_maker_page.dart:- 采用"预选结果 + 精确角度"标准转盘方案
- 先随机选中目标扇区,再计算指针指向该扇区中心所需的精确旋转角度
- 在扇区内添加 ±30% 随机偏移,避免每次都指向正中心,更自然
- 移除
_onSpinComplete中错误的角度反算逻辑,改用预设结果
技术说明
- 标准转盘实现应先确定结果再计算动画,而非先动画再反算结果
startDegreeOffset: -90使第一个扇区从12点方向开始,计算时无需额外偏移
修改文件
lib/src/pages/tools/cooking/decision_maker_page.dart— 修复转盘旋转与结果计算逻辑
[0.99.5] - 2026-04-19
🐛 Bug 修复 — 发现页面 Dismissible 组件错误
问题描述
- 发现页面热门列表 Dismissible 报错:右滑显示操作面板后,Dismissible widget 未从树中移除,导致红色错误提示
- 错误信息:"A dismissed Dismissible widget is still part of the tree"
修复方案
- 📝 修改
discover_sections_widget.dart:- 将右滑操作的
confirmDismiss返回值从true改为false - 移除
onDismissed回调中的显示操作面板逻辑 - 改为在
confirmDismiss中直接调用_showQuickActions()并返回false - 这样 Dismissible 不会真正被 dismiss,避免 widget 树不一致的错误
- 将右滑操作的
技术说明
- Flutter 的 Dismissible 组件要求:当
confirmDismiss返回true时,必须在onDismissed中立即移除该 widget - 如果只是想展示操作面板而不删除 item,应在
confirmDismiss中处理并返回false
修改文件
lib/src/pages/discover/components/discover_sections_widget.dart— 修复 Dismissible 逻辑
[0.99.4] - 2026-04-19
✨ 新功能 — 分享记录管理页面
分享记录页面(🔗 分享管理)
- 📄 新增
share_record_model.dart:分享记录数据模型,支持文本/链接/二维码/邮件四种分享类型 - 🎮 新增
share_record_controller.dart:分享记录控制器,SharedPreferences 持久化,支持搜索/筛选/统计 - 📱 新增
share_records_page.dart:iOS 26 Liquid Glass 风格分享记录页面,支持搜索、类型筛选、左滑删除、清空、重新分享、查看菜谱详情 - 🔗 修改
app_routes.dart:新增/share-records路由常量和页面映射 - 🏠 修改
profile_home.dart:分享记录入口图标改为CupertinoIcons.share,路由指向新的分享记录页面 - 📤 修改
recipe_detail_controller.dart:分享菜谱时自动记录到分享历史
修改文件
lib/src/models/data/share_record_model.dart— 新建:分享记录模型lib/src/controllers/data/share_record_controller.dart— 新建:分享记录控制器lib/src/pages/profile/social/share_records_page.dart— 新建:分享记录页面lib/src/config/app_routes.dart— 新增路由 + 页面映射 + PageInfolib/src/pages/profile/profile_home.dart— 分享记录入口路由修正lib/src/controllers/recipe/recipe_detail_controller.dart— 分享时自动记录
[0.99.3] - 2026-04-19
✨ 新功能 — 评分记录管理页面
评分记录页面(⭐ 评分管理)
- ⭐ 新增
rating_records_page.dart:iOS 26 Liquid Glass 风格的评分记录管理页面- 评分列表:展示用户所有评分记录,包含菜谱封面、名称、分类、星级、评分等级标签
- 搜索功能:实时搜索评分记录(按菜谱名称/分类过滤)
- 评分筛选:按评分等级(5分/4分/3分/2分/1分)快速筛选
- 排序功能:支持最新/最早/高分优先/低分优先四种排序
- 批量管理:编辑模式下支持全选/批量删除评分记录
- 统计信息:顶部展示总记录数、平均分、各评分等级数量
- 导出功能:支持 JSON/CSV 导出评分记录
- 空状态:无评分时展示引导用户去发现菜谱
- 长按操作:长按评分卡片进入编辑模式
- 点击跳转:点击评分卡片跳转到对应菜谱详情页
- 📊 新增
RatingRecordModel:评分记录数据模型,支持 Hive 持久化- 包含:recipeId、recipeTitle、coverImage、categoryName、score、ratedAt、type
- 提供:scoreLabel(完美/推荐/一般/较差/不推荐)、scoreEmoji、displayDate 等便捷属性
- 支持:fromJson/toJson/copyWith 序列化和复制
- 🎮 新增
RatingRecordsController:评分记录控制器- 与 ActionController 的 ratedItems 同步,自动合并已有评分数据
- 支持 Hive 持久化存储,应用重启后数据不丢失
- 支持增删改查、搜索、筛选、排序、批量操作、统计、导出
- 🗄️ HiveService 扩展:新增 ratingRecordBox 和 CRUD 方法
- 🔗 路由注册:新增
/rating-records路由 - 🔄 profile_home.dart:评分记录入口从 favorites 路由改为 ratingRecords 路由
修改文件
lib/src/models/data/rating_record_model.dart— 新建:评分记录数据模型lib/src/controllers/data/rating_records_controller.dart— 新建:评分记录控制器lib/src/pages/profile/rating_records_page.dart— 新建:评分记录管理页面lib/src/services/data/hive_service.dart— 扩展:新增评分记录 Box 和 CRUD 方法lib/src/config/app_routes.dart— 新增路由常量和页面注册lib/src/app_binding.dart— 新增 RatingRecordsController 全局注册lib/src/pages/profile/profile_home.dart— 评分记录入口路由修正
[0.99.2] - 2026-04-19
✨ 新功能 — 帮我做决定转盘工具 + 工具中心内容扩展
帮我做决定(🎯 转盘决策工具)
- 🎯 新增
decision_maker_page.dart:转盘随机决策工具页面- 支持模板模式:内置"今天吃什么"、"喝什么"、"做还是不做"、"去哪里玩"、"选哪个"5个预设模板
- 支持自定义模式:用户自由添加/删除选项(最多12个),自动分配颜色和emoji
- 旋转动画:使用 fl_chart PieChart 绘制扇形 + RotationTransition 实现流畅旋转动画(Curves.decelerate 减速曲线)
- 结果弹出动画:ScaleTransition + FadeTransition 弹性弹出结果卡片
- 触感反馈:结果确定时 HapticFeedback.mediumImpact()
- 结果复制:一键复制决定结果到剪贴板
- 决定历史:记录最近10条决定结果,支持清空
- 指针组件:CustomPainter 绘制顶部三角形指针,带阴影和白色边框
- 🛤️ 路由注册:新增
/tools/decision-maker路由 - 📋 工具注册:在 ToolRegistry 中注册,分类为 cooking,瀑布流展示 priority:2,badge: 'NEW'
工具中心页面内容扩展
- ⭐ 精选推荐区域:横向滚动卡片展示推荐工具(帮我做决定、小妈菜园、烹饪计时器、点餐助手、每周菜单规划)
- 🕐 最近使用区域:按使用频率排序展示最近使用的4个工具,显示使用次数
- 🎬 入场动画增强:精选推荐和最近使用区域增加 SlideTransition + FadeTransition 交错动画
- 🔍 搜索状态优化:搜索时隐藏推荐/最近区域,仅展示搜索结果
修改文件
lib/src/pages/tools/cooking/decision_maker_page.dart— 新建:帮我做决定页面lib/src/pages/tools/tools_center_page.dart— 扩展:新增精选推荐/最近使用区域lib/src/models/tool_item_model.dart— 新增 decision_maker 工具项lib/src/config/app_routes.dart— 新增路由常量和页面注册
[0.99.1] - 2026-04-19
🔧 修复 — 版本号同步 + Android 应用名修正 + R8 Play Core 警告
版本号同步
- 📌 pubspec.yaml:版本号从 0.96.0+95 同步更新至 0.99.1+100,与 CHANGELOG 一致
- 📱 profile_home.dart:底部版本号显示从 v0.88.5 更新至 v0.99.1
- ⚙️ profile_settings.dart:底部版本号显示从 v0.88.5 更新至 v0.99.1
Android 应用名修正
- 🏷️ AndroidManifest.xml:
android:label从 "mom_kitchen" 改为 "小妈厨房",与应用中文名一致
R8 Play Core 缺失类警告修复
- 🛡️ proguard-rules.pro:添加 Play Core 分包安装相关类的
-dontwarn规则 - 🔧 原因:Flutter 引擎引用了
com.google.android.play.core.splitinstall.*等类,但项目未使用分包安装功能,这些类在运行时不会被调用 - ✅ 效果:抑制 R8 编译时的 12 条 Missing class 警告
修改文件
pubspec.yaml— 版本号同步 0.96.0 → 0.99.1lib/src/pages/profile/profile_home.dart— 版本号显示更新lib/src/pages/profile/profile_settings.dart— 版本号显示更新android/app/src/main/AndroidManifest.xml— 应用名改为中文android/app/proguard-rules.pro— 添加 Play Core dontwarn 规则
[0.99.0] - 2026-04-19
🐛 修复 — Android Release 包缓存失效、图片加载不出、浏览记录丢失
根因分析
Release 包开启了 R8 代码混淆(isMinifyEnabled=true),但缺少 Proguard 规则文件,
导致 Hive、SharedPreferences、CachedNetworkImage 等依赖的反射类被混淆或移除,
序列化/反序列化失败 → 所有本地缓存数据丢失 → 图片无法加载 → 浏览记录为空。
修复内容
- 🛡️ 新增
proguard-rules.pro:保护 Hive TypeAdapter、SharedPreferences、CachedNetworkImage、Dio 等反射类不被 R8 混淆 - ⚙️
build.gradle.kts:release 构建启用isMinifyEnabled=true+isShrinkResources=true并引用 proguard 规则 - 🔒
AndroidManifest.xml:添加android:allowBackup=false防止 Auto Backup 覆盖缓存;添加android:networkSecurityConfig确保 HTTPS 请求正常 - 🌐 新增
network_security_config.xml:配置网络安全策略,允许访问eat.wktyl.com的 HTTPS 资源 - 🧹 修复
RecipeImageCache.clearCache():原来传空字符串evictFromCache('')无效,改为使用DefaultCacheManager().emptyCache()正确清理
修改文件
android/app/proguard-rules.pro— 新建:Proguard 混淆规则android/app/build.gradle.kts— 启用代码压缩和混淆,引用 proguard 规则android/app/src/main/AndroidManifest.xml— 添加 allowBackup/networkSecurityConfigandroid/app/src/main/res/xml/network_security_config.xml— 新建:网络安全配置lib/src/widgets/recipe/recipe_image.dart— 修复 RecipeImageCache.clearCache() 无效实现
[0.98.10] - 2026-04-18
🔧 重构 — 删除接口 RESTful 规范化
删除接口重构(GET → DELETE)
- 🗑️ RESTful 规范:删除接口从
GET ?act=delete&id=xxx改为DELETE ?id=xxx - 🔒 CORS 配置:后端新增 DELETE 方法支持 (
Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS) - 🔄 前端适配:
RecipeShareService.deleteRecipeShare()从_dio.get()改为_dio.delete() - 📝 参数简化:删除操作不再需要
act=delete参数,直接使用 HTTP 方法语义 - 📚 文档同步:API_DOC.md 新增删除接口详细说明,包含请求/响应示例
技术改进
- ✅ 符合 RESTful 原则:使用正确的 HTTP 方法表达语义(DELETE 表示删除)
- ✅ 避免 GET 副作用:GET 请求不应有副作用,删除操作必须使用非常规方法
- ✅ 提升安全性:某些防火墙/代理会记录但不执行 GET 请求的副作用操作
- ✅ 向后兼容:后端同时支持新旧两种方式(优先检测 DELETE 方法)
修改文件
docs/api/recipe_share.php— 添加 DELETE 方法支持、更新 CORS 配置、修改文件头注释lib/src/services/data/recipe_share_service.dart— 删除方法改为 RESTful DELETEdocs/api/doc/API_DOC.md— 新增删除接口完整文档(参数、返回值、示例)
📌 已移除较早版本记录(0.98.9及之前),功能已归档至软件特性清单。
- 0.98.9: 菜谱分享本地存储 + 3天自动过期清理
- 0.98.8: 二维码分享URL生成 + PHP分享页面
- 0.98.7: 口味偏好持久化 + 菜品详情页偏好标注
- 0.98.6: 软件信息页面图标/参考文献扩充/偏好设置重写/路由修复
- 0.98.5: 软件信息页面 + 了解我们页面
- 0.98.4: 小妈菜园交互优化 + 商店布局修复