# Changelog All notable changes to this project will be documented in this file. ## [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)` — 撤销回调 - `CardSwiper` widget 替代原 `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+RepaintBoundary - `lib/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 类型和 MiniCardRecipeRef - `lib/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` 字段和 `effectiveRecipeCount` getter - 当 `statistics.recipeCount` 为0时,fallback 到 `related_recipes.length` - 同时支持 `recipe_count` 和 `view_count` 顶层字段 - 🔧 **食材详情卡片位置调整** — 将"食材详情"卡片移到"储存方法"下面 #### 影响文件 - `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+effectiveRecipeCount - `lib/src/pages/tools/ingredient_detail_page.dart` — 修复count+调整卡片顺序 > 📌 已移除较早版本记录(0.92.6及之前),功能已归档至软件特性清单。