refactor(fluttertoast_ohos): 重构OHOS平台插件代码结构 fix(discover): 修改迷你卡片显示文本为"作者精选" chore: 更新pubspec版本号至0.95.0+94 build: 添加flutter_card_swiper和更新flutter_markdown_plus依赖
207 lines
13 KiB
Markdown
207 lines
13 KiB
Markdown
# 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及之前),功能已归档至软件特性清单。
|