17 KiB
17 KiB
Changelog
All notable changes to this project will be documented in this file.
[0.96.1] - 2026-04-15
🐛 修复 — Flutter调试安装APK卡住 / Release构建找不到APK
Bug修复
- 🐛 修复
flutter run调试时 APK 安装一直卡在 "Installing build\app\outputs\flutter-apk\app-debug.apk..." 的问题- 原因:
local.properties中残留flutter.buildMode=release/flutter.versionName/flutter.versionCode等自动生成属性,干扰 Flutter 工具的构建模式判断和 APK 路径查找 - 修复:清理
local.properties中的自动生成属性(这些属性由 Flutter 构建时自动写入,不应持久化) - 修复:卸载设备上旧版本应用 +
flutter clean清理构建缓存
- 原因:
- 🐛 修复
flutter build apk --release构建后报 "Gradle build failed to produce an .apk file" 的问题- 原因:
android/build.gradle.kts中的构建目录重定向(newBuildDir→../../build)是 Flutter 新版模板的正确设计,误删后导致 APK 路径不匹配 - 修复:恢复
build.gradle.kts中的newBuildDir重定向逻辑,确保 APK 输出到<项目根>/build/app/outputs/flutter-apk/
- 原因:
[0.96.0] - 2026-04-15
📧 菜谱邮件分享功能 — 发送菜谱详情到邮箱
新增功能
- 🆕 邮件分享按钮 — 菜谱详情页底部新增"📧 发送菜谱到邮箱"按钮
- 点击弹出底部对话框,支持3种发送线路选择
- 🚀 官方线路1 (gg@0gg.cc via free.mboxhosting.com)
- ✉️ 官方线路2 (2821981550@qq.com via smtp.qq.com)
- 🔧 自定义SMTP(用户填写服务器/账号/密码/端口)
- 支持纯文本+HTML双格式邮件,包含菜谱标题、简介、食材、步骤、营养信息
- HTML邮件采用iOS风格设计(渐变头部、圆角卡片、营养网格布局)
- 邮件标题格式:🍳 {菜谱名称} — 小妈厨房菜谱分享
- 输入校验:邮箱格式、必填项检查
- 发送状态反馈:发送中显示loading、成功/失败Toast提示
- 🆕 EmailService — 基于
mailer库的SMTP邮件发送服务- 多线路支持:官方线路1/线路2/自定义SMTP
- 支持异常捕获:MailerException/SocketException/通用异常
- Logger日志记录发送结果
- 发送成功/失败自动记录到 EmailHistoryController
- 🆕 发件记录页面 — 足迹页统计栏新增📧发件记录入口
- 记录列表展示:菜谱标题、收件人、线路、状态、时间
- 左滑删除单条记录
- 清空全部记录
- 点击查看详情弹窗(收件人/发件人/服务器/线路/主题/状态/错误信息)
- 点击"查看菜谱"跳转菜谱详情
- 统计头部:总记录数 + 成功/失败数量标签
- 🆕 EmailRecordModel — 邮件发送记录模型(SharedPreferences JSON持久化)
- 🆕 EmailHistoryController — 邮件记录控制器(最多200条记录)
Dependencies
- 新增: mailer ^7.1.0
影响文件
pubspec.yaml— 添加 mailer 依赖lib/src/services/data/email_service.dart— 新建邮件发送服务(多线路+历史记录)lib/src/widgets/recipe_detail/interaction/recipe_email_button.dart— 新建邮件按钮组件lib/src/models/data/email_record_model.dart— 新建邮件记录模型lib/src/controllers/data/email_history_controller.dart— 新建邮件记录控制器lib/src/pages/profile/social/email_history_page.dart— 新建发件记录页面lib/src/pages/profile/social/footprints_page.dart— 统计栏增加发件记录入口lib/src/pages/home/recipe_detail_page.dart— 底部添加邮件按钮lib/src/config/app_routes.dart— 注册 /email-history 路由
[0.95.0] - 2026-04-14
🔄 MiniCardPage 滑动引擎重构 — 引入 flutter_card_swiper
重构
- 🔄 自定义手势系统移除 — 移除 GestureDetector + 3个AnimationController(exit/enter/bounce)+ 手动拖拽追踪(_dragX/_dragY) 的自实现滑动系统
- 🔄 引入 flutter_card_swiper ^7.2.0 — 使用专业 Tinder 风格卡片滑动库替代自实现
- CardSwiper 内置:滑动动画、回弹效果、堆叠缩放、旋转角度
- CardSwiperController 支持程序化控制:swipe(direction)、undo()、moveTo(index)
- onSwipe/onUndo 回调统一处理 like/dislike/撤销逻辑
- 配置:threshold=80, maxAngle=20, scale=0.92, duration=300ms, numberOfCardsDisplayed=2
删除代码(-158行)
_exitAnimController / _enterAnimController / _bounceAnimController— 3个AnimationController/_dragX / _dragY / _isDragging / _isAnimatingExit / _exitDirection / _exitStartX / _exitStartY— 手势状态变量/_swipeRight() / _swipeLeft() / _startExitAnimation() / _onExitComplete() / _goPrev() / _bounceBack() / _buildSwipeLabel()— 7个手势方法
新增代码(+30行)
CardSwiperController _swiperController— 程序化控制器_handleSwipe(previousIndex, currentIndex, direction)— 统一滑动回调_handleUndo(previousIndex, currentIndex, direction)— 撤销回调CardSwiperwidget 替代原GestureDetector + Transform嵌套
保留功能(100%不变)
- ✅ 分类筛选 / 搜索 / 网格视图切换
- ✅ 收藏 / 分享 / 详情跳转 / 全屏查看器
- ✅ 图片预加载 / 本地缓存 / SharedPreferences持久化
- ✅ MiniCardImageView 组件(液态玻璃效果)
- ✅ MiniCardViewer 全屏查看器
Dependencies
- 新增: flutter_card_swiper ^7.2.0
影响文件
pubspec.yaml— 添加 flutter_card_swiper 依赖lib/src/pages/discover/mini_card/mini_card_page.dart— 核心重构(1262行→1104行,减少12.5%)lib/src/pages/discover/mini_card/mini_card_image_view.dart— 分类描述提升为独立显眼行(fontSm + 85%透明度 + 2行显示)
补充修复(v0.95.0-hotfix)
- 🐛 卡片右侧空白 — CardSwiper padding 从
horizontal:16改为EdgeInsets.zero,内部 width 从maxW-32改为constraints.maxWidth - 🎨 底部层叠效果 — 布局从 Column 重构为 Stack,底部操作栏使用
Positioned(bottom:0)+BackdropFilter(sigma:20)+ 渐变遮罩(0→0.95),卡片视觉延伸至按钮下方 - 🏷️ 分类栏 —
_buildCategoryChips已正确遍历_meta.categories.entries,显示全部11个分类(✨全部 🥬素菜 🥩荤菜 🦞水产 🌅早餐 🍚主食 🍲汤与粥 🧃饮品 🍰甜品 📦半成品加工 🪙酱料) - 📝 分类描述 — MiniCardImageView 已通过
_meta.descriptions[recipe.category]获取对应分类描述,独立行显示
[0.94.0] - 2026-04-14
🎬 迷你卡片动画系统重构 — 滑出飞走+入场弹性+回弹弹簧+图片预加载+缓存
优化
- 🎬 滑出飞走动画 — 拖拽超过阈值后,卡片带旋转+位移飞出屏幕(easeIn加速),不再瞬间跳变
- 🎬 入场弹性动画 — 新卡片从 scale 0.88→1.0 + opacity 0→1 弹性进入(easeOutBack回弹曲线)
- 🎬 回弹弹簧动画 — 拖拽未达阈值时,卡片平滑弹回原位(easeOut减速),不再硬切
- 🎬 下一张卡片联动 — 滑出过程中,下一张卡片从 scale 0.92→1.0 + opacity 0.6→1.0 逐渐浮现
- 🖼️ 图片预加载 — 切换卡片时 precacheImage 预加载后续3张图片,消除转圈等待
- 🖼️ CachedNetworkImage 替换 — MiniCardImageView/MiniCardViewer/MiniCardPage 全部替换 Image.network → CachedNetworkImage
- 磁盘缓存 maxWidthDiskCache/maxHeightDiskCache: 800/1200
- 内存缓存 memCacheWidth/memCacheHeight: 800
- fadeIn 300ms easeOut 渐入效果
- 🎬 滑出动画期间禁止拖拽 — 防止动画中重复触发滑动手势
Bug修复
- 🐛 动画控制器未绑定 — 原 _likeAnimController/_nopeAnimController 创建后从未驱动任何动画,卡片切换全靠 setState 硬切
- 🐛 图片无缓存 — Image.network 每次切换都重新请求网络,导致转圈加载
影响文件
lib/src/pages/discover/mini_card/mini_card_page.dart— 动画系统重构+CachedNetworkImage+预加载lib/src/pages/discover/mini_card/mini_card_image_view.dart— CachedNetworkImage替换lib/src/pages/discover/mini_card/mini_card_viewer.dart— CachedNetworkImage替换
[0.93.0] - 2026-04-14
🎨 视觉拉满 + 滚动卡顿修复 + 布局Bug修复
优化
- 🎨 液态玻璃效果拉满 — 迷你卡片3层BackdropFilter+光感折射+荤素标签玻璃效果
- 🎨 底部栏恢复毛玻璃 — 瀑布流底部状态栏恢复BackdropFilter(sigmaX/Y:20)+渐变+边框
- 🖼️ CachedNetworkImage — 迷你卡片图片改用CachedNetworkImage,避免滚动时重复网络请求
- 🏗️ ValueNotifier隔离 — 副栏显隐状态改用ValueNotifier,不再触发全局setState重建瀑布流
- 🏗️ merge保留缓存 — DiscoverData.merge()保留已有flattenedItems缓存并追加新项,避免重新shuffle导致滚动跳动
- 🏗️ RepaintBoundary — 迷你卡片添加RepaintBoundary隔离渲染,不影响其他卡片绘制
Bug修复
- 🐛 滚动卡顿 — 移除_applyPendingDiscoverIfAny中的clearCache()调用,避免滚动中列表重新shuffle
- 🐛 Column溢出 — 错误页和空数据页改用SingleChildScrollView包裹,防止溢出
- 🐛 SliverMasonryGrid null check — 空chunk不再创建SliverMasonryGrid,防止null check错误
- 🐛 tag_discover_card溢出 — 标签类型和数量文字添加Flexible包裹,防止Row溢出
- 🐛 image_viewer_page — _extractImageUrl改为imageUrlExtractor回调参数,修复未定义方法错误
- 🐛 discover_waterfall Colors — 添加material导入,修复Colors未定义错误
- 🐛 主页缓存恢复 — _loadDiscover已有数据时使用merge而非替换,保持列表顺序稳定
影响文件
lib/src/pages/home/home_page.dart— ValueNotifier隔离+merge策略+布局修复lib/src/widgets/discover/mini_card_discover_card.dart— 液态玻璃拉满+CachedNetworkImage+RepaintBoundarylib/src/widgets/discover/discover_waterfall.dart— 底部栏毛玻璃+空chunk保护+material导入lib/src/widgets/discover/tag_discover_card.dart— Row溢出修复lib/src/models/discover_model.dart— merge保留flattenedItems缓存lib/src/widgets/image_viewer/image_viewer_page.dart— imageUrlExtractor回调
[0.92.9] - 2026-04-14
🃏 迷你卡片优化 — 液态玻璃效果+详情跳转+Bug修复
优化
- 🎨 液态玻璃效果重设计 — 底部信息区改为"装水玻璃杯"效果
- 使用 ClipRect + BackdropFilter(sigmaX/Y: 30) 实现高斯模糊
- 顶部白色半透明边框(0.25 alpha)模拟光线折射
- 渐变背景(0.05→0.12 alpha)模拟水杯透明度
- 文字添加 Shadow(black54/black38) 增强可读性
- 按钮使用渐变玻璃效果(0.25→0.1 alpha)替代纯色
- 🆕 categoryName 显示 — 迷你卡片底部信息区显示分类名称标签(液态玻璃胶囊样式)
- 🆕 详情按钮API搜索 — 点击详情按钮通过 RecipeRepository.search() 搜索菜名获取API真实ID,再跳转菜谱详情页
- 🆕 全屏查看器详情按钮 — 全屏查看器中详情按钮也通过API搜索跳转
Bug修复
- 🐛 setState after dispose — _goNext()/_goPrev() 添加 mounted 检查,防止动画回调在页面销毁后调用 setState
- 🐛 MediaQuery initState 报错 — 图片预加载从 initState 移至 didChangeDependencies
- 🐛 分享功能改为图片分享 — 使用 RepaintBoundary 截取卡片组件为PNG图片,通过 ShareXFiles 分享
- 🐛 PaginatedData 缺少 totalPages — 补充必需参数
影响文件
lib/src/pages/discover/mini_card_page.dart— 液态玻璃重设计+详情跳转+Bug修复
[0.92.8] - 2026-04-14
🃏 迷你卡片页面 — Tinder风格滑动浏览菜品 + 首页瀑布流插入
新增功能
- 🆕 迷你卡片页面 — 交友软件风格左右滑动浏览菜品
- 数据源:
/assets/recipes.json(341道菜,11个分类) - 图片URL:
https://eat.wktyl.com/api/assets/mpic/{id}.jpeg - 左右拖拽滑动切换菜品卡片,拖拽距离>80触发滑动
- 滑动时显示"❤️ 喜欢"或"👎 下一道"标签
- 底部4个操作按钮:下一道/收藏/喜欢/上一道
- 进度条显示浏览进度
- 数据源:
- 🆕 分类筛选 — 顶部横向滚动分类标签(全部/素菜/荤菜/水产等11类)
- 🆕 搜索功能 — 搜索菜品名称,点击结果跳转到对应卡片
- 🆕 网格视图 — 卡片/网格双视图切换,响应式布局(2/3/4列)
- 🆕 收藏集成 — 卡片右上角收藏按钮,与全局收藏系统联动
- 🆕 本地缓存 — SharedPreferences存储5-10条记录(不含图片),离线fallback
- 🆕 喜欢/不喜欢记录 — 持久化到SharedPreferences,重启保留
- 🆕 缓存管理 — 缓存管理页面新增迷你卡片缓存清理入口
- 🆕 图片独立组件 — _MiniCardImageView 独立组件,文本在图片内底部展示
- 🆕 液态玻璃效果 — 卡片顶部操作栏和底部信息区使用 GlassContainer 毛玻璃
- 🆕 全屏图片查看器 — 点击卡片打开全屏 PageView,左右滑动切换,异步预加载5张相邻图片
- 🆕 分享按钮 — 使用 share_plus 分享菜品信息+图片URL
- 🆕 缓存优先加载 — 查看过的卡片存入缓存,下次进入先显示缓存再内部加载
- 🆕 首页瀑布流插入 — 迷你卡片以全宽横幅插入首页瀑布流(1:20比例)
- 每20个瀑布流item后插入1个迷你卡片横幅
- 点击横幅跳转迷你卡片页面(支持指定卡片ID)
- MiniCardDiscoverCard 组件:液态玻璃+全宽图片+分类标签
- 🆕 MiniCardService — 独立数据服务,支持缓存优先,供多页面复用
- 🆕 路由参数支持 — 迷你卡片页面支持 initialRecipeId 参数,从首页跳转到指定卡片
入口
- 个人中心 → 迷你卡片(原null路由已连接)
- 首页瀑布流 → 迷你卡片横幅(每20个item后出现)
影响文件
lib/src/models/mini_card_model.dart— 新建数据模型lib/src/pages/discover/mini_card_page.dart— 重构:图片独立组件+全屏查看器+分享+缓存优先lib/src/config/app_routes.dart— 路由支持 initialRecipeId 参数lib/src/pages/profile/profile_home.dart— 连接入口lib/src/pages/profile/data/cache_manage_page.dart— 新增迷你卡片缓存管理lib/src/widgets/discover/mini_card_discover_card.dart— 新建瀑布流迷你卡片横幅组件lib/src/widgets/discover/discover_waterfall.dart— 支持迷你卡片插入(SliverMainAxisGroup)lib/src/models/discover_model.dart— 新增 miniCard 类型和 MiniCardRecipeReflib/src/services/data/mini_card_service.dart— 新建迷你卡片数据服务lib/src/pages/home/home_page.dart— 加载迷你卡片数据,传递给瀑布流
[0.92.7] - 2026-04-14
🧬 营养成分交互增强 + 食材详情页修复
新增功能
- 🆕 营养成分展开更多 — 菜品详情页详细营养成分标题右侧新增"更多"按钮
- 点击弹出底部对话框(CupertinoModalPopup),从下到上弹出
- 每个营养成分显示emoji图标+名称+数值+跳转提示
- 点击营养成分跳转到含该成分的菜品列表页
- 营养成分emoji映射表(31种营养成分对应emoji)
- 🆕 营养成分菜品列表页 — 新增 NutritionRecipeListPage
- 使用
api_filter.php?act=filter_recipes&nutrition_name=接口查询 - 支持分页加载,显示菜品卡片+图片
- 路由:
/nutrition-recipe-list
- 使用
修复内容
- 🐛 食材详情菜谱数量显示0 — 修复
recipeCount始终为0的问题- 根因:API
ingredient_detail不返回statistics字段,但返回related_recipes数组 - 修复:IngredientModel 新增
relatedRecipes字段和effectiveRecipeCountgetter - 当
statistics.recipeCount为0时,fallback 到related_recipes.length - 同时支持
recipe_count和view_count顶层字段
- 根因:API
- 🔧 食材详情卡片位置调整 — 将"食材详情"卡片移到"储存方法"下面
影响文件
lib/src/widgets/recipe_detail/info/recipe_nutrition_section.dart— 新增展开更多+弹窗+跳转lib/src/pages/discover/nutrition_recipe_list_page.dart— 新建lib/src/config/app_routes.dart— 新增路由lib/src/models/recipe/ingredient_model.dart— 新增relatedRecipes+effectiveRecipeCountlib/src/pages/tools/ingredient_detail_page.dart— 修复count+调整卡片顺序
📌 已移除较早版本记录(0.92.6及之前),功能已归档至软件特性清单。