@@ -175,46 +175,217 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget {
175
175
return Container ();
176
176
}
177
177
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
+
178
379
return charts.BarChart (
179
380
[
180
381
charts.Series <NutritionData , String >(
181
382
id: 'Planned' ,
182
383
domainFn: (nutritionEntry, index) => nutritionEntry.name,
183
384
measureFn: (nutritionEntry, index) => nutritionEntry.value,
184
385
data: [
185
- /*
186
386
NutritionData (
187
387
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,
218
389
),
219
390
],
220
391
),
@@ -224,42 +395,15 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget {
224
395
measureFn: (nutritionEntry, index) => nutritionEntry.value,
225
396
fillPatternFn: (nutritionEntry, index) => charts.FillPatternType .forwardHatch,
226
397
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),
243
399
],
244
400
),
245
401
charts.Series <NutritionData , String >(
246
402
id: 'Avg' ,
247
403
domainFn: (nutritionEntry, index) => nutritionEntry.name,
248
404
measureFn: (nutritionEntry, index) => nutritionEntry.value,
249
405
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),
263
407
],
264
408
),
265
409
],
@@ -270,6 +414,11 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget {
270
414
renderSpec: charts.SmallTickRendererSpec (labelRotation: 60 ),
271
415
),
272
416
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
+ ),
273
422
);
274
423
}
275
424
}
0 commit comments