Skip to content

Commit 5035140

Browse files
authored
Merge pull request #377 from DeveloperMalay/secondery_graph
creating a secondary graph for energy value
2 parents 858641d + b431d4f commit 5035140

File tree

2 files changed

+218
-67
lines changed

2 files changed

+218
-67
lines changed

lib/widgets/nutrition/charts.dart

Lines changed: 209 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -175,46 +175,217 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget {
175175
return Container();
176176
}
177177

178+
return Column(
179+
children: [
180+
Container(
181+
padding: const EdgeInsets.all(15),
182+
height: 220,
183+
child: charts.BarChart(
184+
[
185+
charts.Series<NutritionData, String>(
186+
id: 'Planned',
187+
domainFn: (nutritionEntry, index) => nutritionEntry.name,
188+
measureFn: (nutritionEntry, index) => nutritionEntry.value,
189+
data: [
190+
NutritionData(
191+
AppLocalizations.of(context).energy, _nutritionalPlan.nutritionalValues.energy),
192+
],
193+
),
194+
charts.Series<NutritionData, String>(
195+
id: 'Logged',
196+
domainFn: (nutritionEntry, index) => nutritionEntry.name,
197+
measureFn: (nutritionEntry, index) => nutritionEntry.value,
198+
fillPatternFn: (nutritionEntry, index) => charts.FillPatternType.forwardHatch,
199+
data: [
200+
NutritionData(AppLocalizations.of(context).energy, loggedNutritionalValues.energy),
201+
],
202+
),
203+
charts.Series<NutritionData, String>(
204+
id: 'Avg',
205+
domainFn: (nutritionEntry, index) => nutritionEntry.name,
206+
measureFn: (nutritionEntry, index) => nutritionEntry.value,
207+
data: [
208+
NutritionData(AppLocalizations.of(context).energy, sevenDayAvg.energy),
209+
],
210+
),
211+
],
212+
animate: true,
213+
domainAxis: const charts.OrdinalAxisSpec(
214+
///labelRotation was added to rotate text of X Axis. Without that,
215+
///titles would overlap each other
216+
renderSpec: charts.SmallTickRendererSpec(labelRotation: 60),
217+
),
218+
barGroupingType: charts.BarGroupingType.grouped,
219+
defaultRenderer: charts.BarRendererConfig(
220+
groupingType: charts.BarGroupingType.grouped, strokeWidthPx: 0.0, maxBarWidthPx: 8),
221+
primaryMeasureAxis: const charts.NumericAxisSpec(
222+
tickProviderSpec: charts.BasicNumericTickProviderSpec(desiredTickCount: 5),
223+
),
224+
),
225+
),
226+
Container( padding: const EdgeInsets.all(15),
227+
height: 300,
228+
child: charts.BarChart(
229+
[
230+
charts.Series<NutritionData, String>(
231+
id: 'Planned',
232+
domainFn: (nutritionEntry, index) => nutritionEntry.name,
233+
measureFn: (nutritionEntry, index) => nutritionEntry.value,
234+
data: [
235+
// NutritionData(
236+
// AppLocalizations.of(context).energy,
237+
// _nutritionalPlan.nutritionalValues.energy,
238+
// ),
239+
NutritionData(
240+
AppLocalizations.of(context).protein,
241+
_nutritionalPlan.nutritionalValues.protein,
242+
),
243+
NutritionData(
244+
AppLocalizations.of(context).carbohydrates,
245+
_nutritionalPlan.nutritionalValues.carbohydrates,
246+
),
247+
NutritionData(
248+
AppLocalizations.of(context).sugars,
249+
_nutritionalPlan.nutritionalValues.carbohydratesSugar,
250+
),
251+
NutritionData(
252+
AppLocalizations.of(context).fat,
253+
_nutritionalPlan.nutritionalValues.fat,
254+
),
255+
NutritionData(
256+
AppLocalizations.of(context).saturatedFat,
257+
_nutritionalPlan.nutritionalValues.fatSaturated,
258+
),
259+
NutritionData(
260+
AppLocalizations.of(context).fibres,
261+
_nutritionalPlan.nutritionalValues.fibres,
262+
),
263+
NutritionData(
264+
AppLocalizations.of(context).sodium,
265+
_nutritionalPlan.nutritionalValues.sodium,
266+
),
267+
],
268+
),
269+
charts.Series<NutritionData, String>(
270+
id: 'Logged',
271+
domainFn: (nutritionEntry, index) => nutritionEntry.name,
272+
measureFn: (nutritionEntry, index) => nutritionEntry.value,
273+
fillPatternFn: (nutritionEntry, index) => charts.FillPatternType.forwardHatch,
274+
data: [
275+
// NutritionData(
276+
// AppLocalizations.of(context).energy,
277+
// loggedNutritionalValues.energy
278+
// ),
279+
280+
NutritionData(
281+
AppLocalizations.of(context).protein, loggedNutritionalValues.protein),
282+
NutritionData(AppLocalizations.of(context).carbohydrates,
283+
loggedNutritionalValues.carbohydrates),
284+
NutritionData(AppLocalizations.of(context).sugars,
285+
loggedNutritionalValues.carbohydratesSugar),
286+
NutritionData(AppLocalizations.of(context).fat, loggedNutritionalValues.fat),
287+
NutritionData(AppLocalizations.of(context).saturatedFat,
288+
loggedNutritionalValues.fatSaturated),
289+
NutritionData(AppLocalizations.of(context).fibres, loggedNutritionalValues.fibres),
290+
NutritionData(AppLocalizations.of(context).sodium, loggedNutritionalValues.sodium),
291+
],
292+
),
293+
charts.Series<NutritionData, String>(
294+
id: 'Avg',
295+
domainFn: (nutritionEntry, index) => nutritionEntry.name,
296+
measureFn: (nutritionEntry, index) => nutritionEntry.value,
297+
data: [
298+
// NutritionData(AppLocalizations.of(context).energy, sevenDayAvg.energy),
299+
NutritionData(AppLocalizations.of(context).protein, sevenDayAvg.protein),
300+
NutritionData(
301+
AppLocalizations.of(context).carbohydrates, sevenDayAvg.carbohydrates),
302+
NutritionData(AppLocalizations.of(context).sugars, sevenDayAvg.carbohydratesSugar),
303+
NutritionData(AppLocalizations.of(context).fat, sevenDayAvg.fat),
304+
NutritionData(AppLocalizations.of(context).saturatedFat, sevenDayAvg.fatSaturated),
305+
NutritionData(AppLocalizations.of(context).fibres, sevenDayAvg.fibres),
306+
NutritionData(AppLocalizations.of(context).sodium, sevenDayAvg.sodium),
307+
],
308+
),
309+
],
310+
animate: true,
311+
domainAxis: const charts.OrdinalAxisSpec(
312+
///labelRotation was added to rotate text of X Axis. Without that,
313+
///titles would overlap each other
314+
renderSpec: charts.SmallTickRendererSpec(labelRotation: 60),
315+
),
316+
barGroupingType: charts.BarGroupingType.grouped,
317+
primaryMeasureAxis: const charts.NumericAxisSpec(
318+
tickProviderSpec: charts.BasicNumericTickProviderSpec(
319+
desiredTickCount: 5,
320+
),
321+
),
322+
),
323+
),
324+
],
325+
);
326+
}
327+
}
328+
329+
//creating a seperate chart for energy as the energy value and other nutrient's value is not compatable to show in one graph
330+
class EnergyChart extends StatelessWidget {
331+
const EnergyChart({Key? key, required this.nutritionalPlan}) : super(key: key);
332+
final NutritionalPlan nutritionalPlan;
333+
NutritionalValues nutritionalValuesFromPlanLogsSevenDayAvg() {
334+
NutritionalValues sevenDaysAvg = NutritionalValues();
335+
int count = 0;
336+
337+
final now = DateTime.now();
338+
final today = DateTime(now.year, now.month, now.day);
339+
340+
nutritionalPlan.logEntriesValues.forEach((key, value) {
341+
if (key.difference(today).inDays >= -7) {
342+
sevenDaysAvg += value;
343+
count++;
344+
}
345+
});
346+
347+
if (count != 0) {
348+
sevenDaysAvg.energy = sevenDaysAvg.energy / count;
349+
sevenDaysAvg.protein = sevenDaysAvg.protein / count;
350+
sevenDaysAvg.carbohydrates = sevenDaysAvg.carbohydrates / count;
351+
sevenDaysAvg.carbohydratesSugar = sevenDaysAvg.carbohydratesSugar / count;
352+
sevenDaysAvg.fat = sevenDaysAvg.fat / count;
353+
sevenDaysAvg.fatSaturated = sevenDaysAvg.fatSaturated / count;
354+
sevenDaysAvg.fibres = sevenDaysAvg.fibres / count;
355+
sevenDaysAvg.sodium = sevenDaysAvg.sodium / count;
356+
}
357+
358+
return sevenDaysAvg;
359+
}
360+
361+
NutritionalValues nutritionalValuesFromPlanLogsToday() {
362+
final now = DateTime.now();
363+
final today = DateTime(now.year, now.month, now.day);
364+
365+
return nutritionalPlan.logEntriesValues[nutritionalPlan.logEntriesValues.keys
366+
.firstWhereOrNull((d) => d.difference(today).inDays == 0)] ??
367+
NutritionalValues();
368+
}
369+
370+
@override
371+
Widget build(BuildContext context) {
372+
final NutritionalValues loggedNutritionalValues = nutritionalValuesFromPlanLogsToday();
373+
final NutritionalValues sevenDayAvg = nutritionalValuesFromPlanLogsSevenDayAvg();
374+
375+
if (nutritionalPlan.nutritionalValues.energy == 0) {
376+
return Container();
377+
}
378+
178379
return charts.BarChart(
179380
[
180381
charts.Series<NutritionData, String>(
181382
id: 'Planned',
182383
domainFn: (nutritionEntry, index) => nutritionEntry.name,
183384
measureFn: (nutritionEntry, index) => nutritionEntry.value,
184385
data: [
185-
/*
186386
NutritionData(
187387
AppLocalizations.of(context).energy,
188-
_nutritionalPlan.nutritionalValues.energy,
189-
),
190-
*/
191-
NutritionData(
192-
AppLocalizations.of(context).protein,
193-
_nutritionalPlan.nutritionalValues.protein,
194-
),
195-
NutritionData(
196-
AppLocalizations.of(context).carbohydrates,
197-
_nutritionalPlan.nutritionalValues.carbohydrates,
198-
),
199-
NutritionData(
200-
AppLocalizations.of(context).sugars,
201-
_nutritionalPlan.nutritionalValues.carbohydratesSugar,
202-
),
203-
NutritionData(
204-
AppLocalizations.of(context).fat,
205-
_nutritionalPlan.nutritionalValues.fat,
206-
),
207-
NutritionData(
208-
AppLocalizations.of(context).saturatedFat,
209-
_nutritionalPlan.nutritionalValues.fatSaturated,
210-
),
211-
NutritionData(
212-
AppLocalizations.of(context).fibres,
213-
_nutritionalPlan.nutritionalValues.fibres,
214-
),
215-
NutritionData(
216-
AppLocalizations.of(context).sodium,
217-
_nutritionalPlan.nutritionalValues.sodium,
388+
nutritionalPlan.nutritionalValues.energy,
218389
),
219390
],
220391
),
@@ -224,42 +395,15 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget {
224395
measureFn: (nutritionEntry, index) => nutritionEntry.value,
225396
fillPatternFn: (nutritionEntry, index) => charts.FillPatternType.forwardHatch,
226397
data: [
227-
/*
228-
NutritionData(
229-
AppLocalizations.of(context).energy,
230-
loggedNutritionalValues.energy
231-
),
232-
*/
233-
NutritionData(AppLocalizations.of(context).protein, loggedNutritionalValues.protein),
234-
NutritionData(
235-
AppLocalizations.of(context).carbohydrates, loggedNutritionalValues.carbohydrates),
236-
NutritionData(
237-
AppLocalizations.of(context).sugars, loggedNutritionalValues.carbohydratesSugar),
238-
NutritionData(AppLocalizations.of(context).fat, loggedNutritionalValues.fat),
239-
NutritionData(
240-
AppLocalizations.of(context).saturatedFat, loggedNutritionalValues.fatSaturated),
241-
NutritionData(AppLocalizations.of(context).fibres, loggedNutritionalValues.fibres),
242-
NutritionData(AppLocalizations.of(context).sodium, loggedNutritionalValues.sodium),
398+
NutritionData(AppLocalizations.of(context).energy, loggedNutritionalValues.energy),
243399
],
244400
),
245401
charts.Series<NutritionData, String>(
246402
id: 'Avg',
247403
domainFn: (nutritionEntry, index) => nutritionEntry.name,
248404
measureFn: (nutritionEntry, index) => nutritionEntry.value,
249405
data: [
250-
/*
251-
NutritionData(
252-
AppLocalizations.of(context).energy,
253-
sevenDayAvg.energy
254-
),
255-
*/
256-
NutritionData(AppLocalizations.of(context).protein, sevenDayAvg.protein),
257-
NutritionData(AppLocalizations.of(context).carbohydrates, sevenDayAvg.carbohydrates),
258-
NutritionData(AppLocalizations.of(context).sugars, sevenDayAvg.carbohydratesSugar),
259-
NutritionData(AppLocalizations.of(context).fat, sevenDayAvg.fat),
260-
NutritionData(AppLocalizations.of(context).saturatedFat, sevenDayAvg.fatSaturated),
261-
NutritionData(AppLocalizations.of(context).fibres, sevenDayAvg.fibres),
262-
NutritionData(AppLocalizations.of(context).sodium, sevenDayAvg.sodium),
406+
NutritionData(AppLocalizations.of(context).energy, sevenDayAvg.energy),
263407
],
264408
),
265409
],
@@ -270,6 +414,11 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget {
270414
renderSpec: charts.SmallTickRendererSpec(labelRotation: 60),
271415
),
272416
barGroupingType: charts.BarGroupingType.grouped,
417+
defaultRenderer: charts.BarRendererConfig(
418+
groupingType: charts.BarGroupingType.grouped, strokeWidthPx: 0.0, maxBarWidthPx: 8),
419+
primaryMeasureAxis: const charts.NumericAxisSpec(
420+
tickProviderSpec: charts.BasicNumericTickProviderSpec(desiredTickCount: 5),
421+
),
273422
);
274423
}
275424
}

lib/widgets/nutrition/nutritional_plan_detail.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class NutritionalPlanDetailWidget extends StatelessWidget {
7070
Container(
7171
padding: const EdgeInsets.all(15),
7272
height: 220,
73-
child: NutritionalPlanPieChartWidget(nutritionalValues),
73+
child: NutritionalPlanPieChartWidget(nutritionalValues), // chart
7474
),
7575
Padding(
7676
padding: const EdgeInsets.symmetric(horizontal: 10),
@@ -210,11 +210,13 @@ class NutritionalPlanDetailWidget extends StatelessWidget {
210210
textAlign: TextAlign.center,
211211
style: Theme.of(context).textTheme.headline6,
212212
),
213-
Container(
214-
padding: const EdgeInsets.all(15),
215-
height: 300,
216-
child: NutritionalPlanHatchBarChartWidget(_nutritionalPlan),
217-
),
213+
214+
NutritionalPlanHatchBarChartWidget(_nutritionalPlan),
215+
// Container(
216+
// padding: const EdgeInsets.all(15),
217+
// height: 300,
218+
// child: NutritionalPlanHatchBarChartWidget(_nutritionalPlan), // chart
219+
// ),
218220
const Padding(padding: EdgeInsets.all(8.0)),
219221
Text(
220222
AppLocalizations.of(context).nutritionalDiary,
@@ -224,7 +226,7 @@ class NutritionalPlanDetailWidget extends StatelessWidget {
224226
Container(
225227
padding: const EdgeInsets.all(15),
226228
height: 220,
227-
child: NutritionalDiaryChartWidget(nutritionalPlan: _nutritionalPlan),
229+
child: NutritionalDiaryChartWidget(nutritionalPlan: _nutritionalPlan), // chart
228230
),
229231
SizedBox(
230232
height: 200,

0 commit comments

Comments
 (0)