食物库页面实现说明
概述
已成功将食物库从弹窗模式改造为页面模式,解决了React Native中Modal嵌套的问题。
实现内容
1. 创建食物库页面
- 文件位置:
app/food-library.tsx - 功能: 完整的食物库界面,包含搜索、分类导航、食物列表等功能
- 特点:
- 支持URL参数传递餐次类型 (
mealType) - 使用Expo Router进行页面导航
- 在页面中可以正常使用FoodDetailModal弹窗
- 支持URL参数传递餐次类型 (
2. 修改营养卡片组件
- 文件:
components/NutritionRadarCard.tsx - 修改内容:
- 移除了FoodLibraryModal的导入和使用
- 将加号按钮的点击事件改为页面导航
- 使用
router.push('/food-library?mealType=${currentMealType}')进行导航
3. 更新路由配置
- 文件:
constants/Routes.ts - 新增:
FOOD_LIBRARY: '/food-library'路由常量
4. 清理旧文件
- 删除了
components/model/food/FoodLibraryModal.tsx - 更新了
components/model/food/index.ts导出文件
使用方式
- 在statistics页面的营养卡片中点击右上角的加号按钮
- 会导航到食物库页面 (
/food-library) - 在食物库页面中点击食物项的加号按钮
- 会弹出食物详情弹窗 (FoodDetailModal)
- 在详情弹窗中可以选择单位和数量,点击保存后返回statistics页面
技术优势
- 解决Modal嵌套问题: 避免了React Native中Modal嵌套的兼容性问题
- 更好的用户体验: 页面导航比弹窗更符合移动端的交互习惯
- 键盘适配: FoodDetailModal中的键盘适配功能可以正常工作
- 代码结构清晰: 页面和弹窗职责分离,代码更易维护
页面功能
食物库页面功能
- ✅ 搜索食物
- ✅ 分类导航(常见、自定义、收藏等)
- ✅ 食物列表展示
- ✅ 餐次显示
- ✅ 返回导航
食物详情弹窗功能
- ✅ 食物信息展示
- ✅ 营养成分显示
- ✅ 单位选择(克、小份、中份、大份)
- ✅ 数量输入
- ✅ 键盘适配
- ✅ 保存功能
注意事项
- 食物库页面使用URL参数传递餐次类型,确保从不同餐次点击加号时能正确显示对应的餐次
- FoodDetailModal仍然是弹窗形式,但现在是在页面中使用,避免了嵌套问题
- 所有原有的UI样式和交互逻辑都得到了保留