From 8f5ce2647cae01c97ecf0da89f3dff58c108703e Mon Sep 17 00:00:00 2001 From: Dieter Plaetinck Date: Wed, 4 Jun 2025 12:10:10 +0300 Subject: [PATCH] log meal screen: handle "no meals defined" gracefully --- lib/l10n/app_en.arb | 8 ++++ lib/screens/log_meals_screen.dart | 62 ++++++++++++++++++++++++++----- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 30de6e1b..f61691be 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -311,6 +311,14 @@ "description": "The goal for macronutrients" }, "selectMealToLog": "Select a meal to log to diary", + "yourCurrentNutritionPlanHasNoMealsDefinedYet": "Your current nutrition plan has no meals defined", + "@yourCurrentNutritionPlanHasNoMealsDefinedYet": { + "description": "Message shown when a nutrition plan doesn't have any meals" + }, + "toAddMealsToThePlanGoToNutritionalPlanDetails": "To add meals to the plan, go to the nutritional plan details", + "@toAddMealsToThePlanGoToNutritionalPlanDetails": { + "description": "Message shown to guide users to the nutritional plan details page to add meals" + }, "goalEnergy": "Energy goal", "goalProtein": "Protein goal", "goalCarbohydrates": "Carbohydrates goal", diff --git a/lib/screens/log_meals_screen.dart b/lib/screens/log_meals_screen.dart index 6dfeedaa..39ae681c 100644 --- a/lib/screens/log_meals_screen.dart +++ b/lib/screens/log_meals_screen.dart @@ -19,6 +19,7 @@ import 'package:flutter/material.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; import 'package:wger/models/nutrition/nutritional_plan.dart'; +import 'package:wger/screens/nutritional_plan_screen.dart'; import 'package:wger/widgets/nutrition/meal.dart'; class LogMealsScreen extends StatefulWidget { @@ -35,20 +36,63 @@ class _LogMealsScreenState extends State { @override Widget build(BuildContext context) { - final nutritionalPlan = ModalRoute.of(context)!.settings.arguments as NutritionalPlan; + final nutritionalPlan = + ModalRoute.of(context)!.settings.arguments as NutritionalPlan; return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context).selectMealToLog), ), - body: ListView.builder( - itemCount: nutritionalPlan.meals.length, - itemBuilder: (context, index) => MealWidget( - nutritionalPlan.meals[index], - nutritionalPlan.dedupMealItems, - true, - true, - ), + body: Column( + children: [ + // Meals list or empty state + Expanded( + child: nutritionalPlan.meals.isEmpty + ? Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + AppLocalizations.of(context) + .yourCurrentNutritionPlanHasNoMealsDefinedYet, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + ), + ), + ) + : ListView.builder( + itemCount: nutritionalPlan.meals.length, + itemBuilder: (context, index) => MealWidget( + nutritionalPlan.meals[index], + nutritionalPlan.dedupMealItems, + true, + true, + ), + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.only(left: 16.0, right: 16.0, top: 8.0, bottom: 32.0), + child: Column( + children: [ + Text( + AppLocalizations.of(context).toAddMealsToThePlanGoToNutritionalPlanDetails, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium, + ), + const SizedBox(height: 8), + TextButton( + child: Text(AppLocalizations.of(context).goToDetailPage), + onPressed: () { + Navigator.of(context).pushReplacementNamed( + NutritionalPlanScreen.routeName, + arguments: nutritionalPlan, + ); + }, + ), + ], + ), + ), + ], ), ); }