[meal] view
This commit is contained in:
		
							parent
							
								
									2d1a08ac1a
								
							
						
					
					
						commit
						985ed670e4
					
				
					 3 changed files with 211 additions and 95 deletions
				
			
		
							
								
								
									
										174
									
								
								lib/screens/meal.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								lib/screens/meal.dart
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,174 @@
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					import 'package:fooder/screens/based.dart';
 | 
				
			||||||
 | 
					import 'package:fooder/models/meal.dart';
 | 
				
			||||||
 | 
					import 'package:fooder/widgets/macro.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MealScreen extends BasedScreen {
 | 
				
			||||||
 | 
					  final Meal meal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const MealScreen({super.key, required super.apiClient, required this.meal});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  State<MealScreen> createState() => _AddMealScreen();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _AddMealScreen extends State<MealScreen> {
 | 
				
			||||||
 | 
					  Future<void> saveMeal(context) async {
 | 
				
			||||||
 | 
					    TextEditingController textFieldController = TextEditingController();
 | 
				
			||||||
 | 
					    textFieldController.text = widget.meal.name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    showDialog(
 | 
				
			||||||
 | 
					      context: context,
 | 
				
			||||||
 | 
					      builder: (context) {
 | 
				
			||||||
 | 
					        return AlertDialog(
 | 
				
			||||||
 | 
					          title: const Text('Save Meal'),
 | 
				
			||||||
 | 
					          content: TextField(
 | 
				
			||||||
 | 
					            controller: textFieldController,
 | 
				
			||||||
 | 
					            decoration: const InputDecoration(hintText: "Meal template name"),
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					          actions: <Widget>[
 | 
				
			||||||
 | 
					            IconButton(
 | 
				
			||||||
 | 
					              icon: const Icon(Icons.cancel),
 | 
				
			||||||
 | 
					              onPressed: () {
 | 
				
			||||||
 | 
					                Navigator.pop(context);
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            IconButton(
 | 
				
			||||||
 | 
					              icon: const Icon(Icons.save),
 | 
				
			||||||
 | 
					              onPressed: () {
 | 
				
			||||||
 | 
					                widget.apiClient
 | 
				
			||||||
 | 
					                    .saveMeal(widget.meal, textFieldController.text);
 | 
				
			||||||
 | 
					                Navigator.pop(context);
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> _deleteMeal(Meal meal) async {
 | 
				
			||||||
 | 
					    await widget.apiClient.deleteMeal(meal.id);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> deleteMeal(context) async {
 | 
				
			||||||
 | 
					    showDialog(
 | 
				
			||||||
 | 
					      context: context,
 | 
				
			||||||
 | 
					      builder: (context) {
 | 
				
			||||||
 | 
					        return AlertDialog(
 | 
				
			||||||
 | 
					          title: const Text('Confirm deletion of the meal'),
 | 
				
			||||||
 | 
					          actions: <Widget>[
 | 
				
			||||||
 | 
					            IconButton(
 | 
				
			||||||
 | 
					              icon: const Icon(Icons.cancel),
 | 
				
			||||||
 | 
					              onPressed: () {
 | 
				
			||||||
 | 
					                Navigator.pop(context);
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            IconButton(
 | 
				
			||||||
 | 
					              icon: const Icon(Icons.delete),
 | 
				
			||||||
 | 
					              onPressed: () {
 | 
				
			||||||
 | 
					                _deleteMeal(widget.meal);
 | 
				
			||||||
 | 
					                Navigator.pop(context);
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Widget buildButton(Icon icon, String text, Function() onPressed) {
 | 
				
			||||||
 | 
					    return Card(
 | 
				
			||||||
 | 
					      child: ListTile(
 | 
				
			||||||
 | 
					        onTap: onPressed,
 | 
				
			||||||
 | 
					        title: Container(
 | 
				
			||||||
 | 
					          padding: const EdgeInsets.all(8),
 | 
				
			||||||
 | 
					          child: Row(
 | 
				
			||||||
 | 
					            children: <Widget>[
 | 
				
			||||||
 | 
					              IconButton(
 | 
				
			||||||
 | 
					                icon: icon,
 | 
				
			||||||
 | 
					                onPressed: onPressed,
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					              const Spacer(),
 | 
				
			||||||
 | 
					              Text(text),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
 | 
					    return Scaffold(
 | 
				
			||||||
 | 
					      appBar: AppBar(
 | 
				
			||||||
 | 
					        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
 | 
				
			||||||
 | 
					        title: Text("🅵🅾🅾🅳🅴🆁", style: logoStyle(context)),
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      body: Center(
 | 
				
			||||||
 | 
					        child: Container(
 | 
				
			||||||
 | 
					          constraints: const BoxConstraints(maxWidth: 720),
 | 
				
			||||||
 | 
					          padding: const EdgeInsets.all(10),
 | 
				
			||||||
 | 
					          child: CustomScrollView(slivers: <Widget>[
 | 
				
			||||||
 | 
					            SliverAppBar(
 | 
				
			||||||
 | 
					                title: Row(
 | 
				
			||||||
 | 
					                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
				
			||||||
 | 
					                    children: <Widget>[
 | 
				
			||||||
 | 
					                      Text(
 | 
				
			||||||
 | 
					                        widget.meal.name,
 | 
				
			||||||
 | 
					                        style: Theme.of(context)
 | 
				
			||||||
 | 
					                            .textTheme
 | 
				
			||||||
 | 
					                            .headlineLarge!
 | 
				
			||||||
 | 
					                            .copyWith(
 | 
				
			||||||
 | 
					                              color: Theme.of(context).colorScheme.onSecondary,
 | 
				
			||||||
 | 
					                              fontWeight: FontWeight.bold,
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                      const Spacer(),
 | 
				
			||||||
 | 
					                      Text(
 | 
				
			||||||
 | 
					                        "${widget.meal.calories.toStringAsFixed(1)} kcal",
 | 
				
			||||||
 | 
					                        style: Theme.of(context)
 | 
				
			||||||
 | 
					                            .textTheme
 | 
				
			||||||
 | 
					                            .headlineLarge!
 | 
				
			||||||
 | 
					                            .copyWith(
 | 
				
			||||||
 | 
					                              color: Theme.of(context).colorScheme.onSecondary,
 | 
				
			||||||
 | 
					                              fontWeight: FontWeight.bold,
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                    ]),
 | 
				
			||||||
 | 
					                expandedHeight: 150,
 | 
				
			||||||
 | 
					                backgroundColor: Theme.of(context).colorScheme.secondary,
 | 
				
			||||||
 | 
					                shape: RoundedRectangleBorder(
 | 
				
			||||||
 | 
					                  borderRadius: BorderRadius.circular(8),
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                floating: true,
 | 
				
			||||||
 | 
					                flexibleSpace: FlexibleSpaceBar(
 | 
				
			||||||
 | 
					                  title: MacroWidget(
 | 
				
			||||||
 | 
					                    protein: widget.meal.protein,
 | 
				
			||||||
 | 
					                    carb: widget.meal.carb,
 | 
				
			||||||
 | 
					                    fat: widget.meal.fat,
 | 
				
			||||||
 | 
					                    style: Theme.of(context).textTheme.bodyMedium!.copyWith(
 | 
				
			||||||
 | 
					                          color: Theme.of(context).colorScheme.onSecondary,
 | 
				
			||||||
 | 
					                          fontWeight: FontWeight.bold,
 | 
				
			||||||
 | 
					                        ),
 | 
				
			||||||
 | 
					                  ),
 | 
				
			||||||
 | 
					                )),
 | 
				
			||||||
 | 
					            SliverList(
 | 
				
			||||||
 | 
					                delegate: SliverChildListDelegate([
 | 
				
			||||||
 | 
					              buildButton(
 | 
				
			||||||
 | 
					                const Icon(Icons.save),
 | 
				
			||||||
 | 
					                "Save as preset",
 | 
				
			||||||
 | 
					                () => saveMeal(context),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					              buildButton(
 | 
				
			||||||
 | 
					                const Icon(Icons.delete),
 | 
				
			||||||
 | 
					                "Delete",
 | 
				
			||||||
 | 
					                () => deleteMeal(context),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					            ]))
 | 
				
			||||||
 | 
					          ]),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -54,30 +54,29 @@ class DiaryWidget extends StatelessWidget {
 | 
				
			||||||
                        color: Theme.of(context).colorScheme.onSecondary,
 | 
					                        color: Theme.of(context).colorScheme.onSecondary,
 | 
				
			||||||
                        fontWeight: FontWeight.bold,
 | 
					                        fontWeight: FontWeight.bold,
 | 
				
			||||||
                      ),
 | 
					                      ),
 | 
				
			||||||
                  child: IconButton(
 | 
					 | 
				
			||||||
                    onPressed: () {
 | 
					 | 
				
			||||||
                      Navigator.push(
 | 
					 | 
				
			||||||
                        context,
 | 
					 | 
				
			||||||
                        MaterialPageRoute(
 | 
					 | 
				
			||||||
                          builder: (context) => AddMealScreen(
 | 
					 | 
				
			||||||
                            apiClient: apiClient,
 | 
					 | 
				
			||||||
                            diary: diary,
 | 
					 | 
				
			||||||
                          ),
 | 
					 | 
				
			||||||
                        ),
 | 
					 | 
				
			||||||
                      ).then((_) {
 | 
					 | 
				
			||||||
                        refreshParent();
 | 
					 | 
				
			||||||
                      });
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    icon: const Icon(Icons.add),
 | 
					 | 
				
			||||||
                    style: ButtonStyle(
 | 
					 | 
				
			||||||
                      backgroundColor: MaterialStateProperty.all<Color>(
 | 
					 | 
				
			||||||
                          Theme.of(context).colorScheme.secondary),
 | 
					 | 
				
			||||||
                      foregroundColor: MaterialStateProperty.all<Color>(
 | 
					 | 
				
			||||||
                          Theme.of(context).colorScheme.onSecondary),
 | 
					 | 
				
			||||||
                    ),
 | 
					 | 
				
			||||||
                  ),
 | 
					 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
              )),
 | 
					              )),
 | 
				
			||||||
 | 
					          SliverToBoxAdapter(
 | 
				
			||||||
 | 
					            child: SizedBox(
 | 
				
			||||||
 | 
					              height: 30,
 | 
				
			||||||
 | 
					              child: TextButton(
 | 
				
			||||||
 | 
					                onPressed: () {
 | 
				
			||||||
 | 
					                  Navigator.push(
 | 
				
			||||||
 | 
					                    context,
 | 
				
			||||||
 | 
					                    MaterialPageRoute(
 | 
				
			||||||
 | 
					                      builder: (context) => AddMealScreen(
 | 
				
			||||||
 | 
					                        apiClient: apiClient,
 | 
				
			||||||
 | 
					                        diary: diary,
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                  ).then((_) {
 | 
				
			||||||
 | 
					                    refreshParent();
 | 
				
			||||||
 | 
					                  });
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                child: const Text("Add Meal"),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
          SliverList(
 | 
					          SliverList(
 | 
				
			||||||
            delegate: SliverChildListDelegate(
 | 
					            delegate: SliverChildListDelegate(
 | 
				
			||||||
              [
 | 
					              [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@ import 'package:fooder/models/meal.dart';
 | 
				
			||||||
import 'package:fooder/widgets/entry.dart';
 | 
					import 'package:fooder/widgets/entry.dart';
 | 
				
			||||||
import 'package:fooder/widgets/macro.dart';
 | 
					import 'package:fooder/widgets/macro.dart';
 | 
				
			||||||
import 'package:fooder/screens/edit_entry.dart';
 | 
					import 'package:fooder/screens/edit_entry.dart';
 | 
				
			||||||
 | 
					import 'package:fooder/screens/meal.dart';
 | 
				
			||||||
import 'package:fooder/client.dart';
 | 
					import 'package:fooder/client.dart';
 | 
				
			||||||
import 'dart:core';
 | 
					import 'dart:core';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,73 +18,23 @@ class MealWidget extends StatelessWidget {
 | 
				
			||||||
      required this.apiClient,
 | 
					      required this.apiClient,
 | 
				
			||||||
      required this.refreshParent});
 | 
					      required this.refreshParent});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<void> saveMeal(context) async {
 | 
					 | 
				
			||||||
    TextEditingController textFieldController = TextEditingController();
 | 
					 | 
				
			||||||
    textFieldController.text = meal.name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    showDialog(
 | 
					 | 
				
			||||||
      context: context,
 | 
					 | 
				
			||||||
      builder: (context) {
 | 
					 | 
				
			||||||
        return AlertDialog(
 | 
					 | 
				
			||||||
          title: const Text('Save Meal'),
 | 
					 | 
				
			||||||
          content: TextField(
 | 
					 | 
				
			||||||
            controller: textFieldController,
 | 
					 | 
				
			||||||
            decoration: const InputDecoration(hintText: "Meal template name"),
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
          actions: <Widget>[
 | 
					 | 
				
			||||||
            IconButton(
 | 
					 | 
				
			||||||
              icon: const Icon(Icons.cancel),
 | 
					 | 
				
			||||||
              onPressed: () {
 | 
					 | 
				
			||||||
                Navigator.pop(context);
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
            IconButton(
 | 
					 | 
				
			||||||
              icon: const Icon(Icons.save),
 | 
					 | 
				
			||||||
              onPressed: () {
 | 
					 | 
				
			||||||
                apiClient.saveMeal(meal, textFieldController.text);
 | 
					 | 
				
			||||||
                Navigator.pop(context);
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ],
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Future<void> _deleteMeal(Meal meal) async {
 | 
					 | 
				
			||||||
    await apiClient.deleteMeal(meal.id);
 | 
					 | 
				
			||||||
    refreshParent();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Future<void> deleteMeal(context) async {
 | 
					 | 
				
			||||||
    showDialog(
 | 
					 | 
				
			||||||
      context: context,
 | 
					 | 
				
			||||||
      builder: (context) {
 | 
					 | 
				
			||||||
        return AlertDialog(
 | 
					 | 
				
			||||||
          title: const Text('Confirm deletion of the meal'),
 | 
					 | 
				
			||||||
          actions: <Widget>[
 | 
					 | 
				
			||||||
            IconButton(
 | 
					 | 
				
			||||||
              icon: const Icon(Icons.cancel),
 | 
					 | 
				
			||||||
              onPressed: () {
 | 
					 | 
				
			||||||
                Navigator.pop(context);
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
            IconButton(
 | 
					 | 
				
			||||||
              icon: const Icon(Icons.delete),
 | 
					 | 
				
			||||||
              onPressed: () {
 | 
					 | 
				
			||||||
                _deleteMeal(meal);
 | 
					 | 
				
			||||||
                Navigator.pop(context);
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ],
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return Card(
 | 
					    return Card(
 | 
				
			||||||
 | 
					        child: GestureDetector(
 | 
				
			||||||
 | 
					      onLongPress: () {
 | 
				
			||||||
 | 
					        Navigator.push(
 | 
				
			||||||
 | 
					          context,
 | 
				
			||||||
 | 
					          MaterialPageRoute(
 | 
				
			||||||
 | 
					            builder: (context) => MealScreen(
 | 
				
			||||||
 | 
					              apiClient: apiClient,
 | 
				
			||||||
 | 
					              meal: meal,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					        ).then((_) {
 | 
				
			||||||
 | 
					          refreshParent();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      child: Padding(
 | 
					      child: Padding(
 | 
				
			||||||
        padding: const EdgeInsets.only(
 | 
					        padding: const EdgeInsets.only(
 | 
				
			||||||
            top: 36.0, left: 6.0, right: 6.0, bottom: 6.0),
 | 
					            top: 36.0, left: 6.0, right: 6.0, bottom: 6.0),
 | 
				
			||||||
| 
						 | 
					@ -100,14 +51,6 @@ class MealWidget extends StatelessWidget {
 | 
				
			||||||
                          ),
 | 
					                          ),
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                  ),
 | 
					                  ),
 | 
				
			||||||
                  IconButton(
 | 
					 | 
				
			||||||
                    icon: const Icon(Icons.delete),
 | 
					 | 
				
			||||||
                    onPressed: () {deleteMeal(context);},
 | 
					 | 
				
			||||||
                  ),
 | 
					 | 
				
			||||||
                  IconButton(
 | 
					 | 
				
			||||||
                    icon: const Icon(Icons.save),
 | 
					 | 
				
			||||||
                    onPressed: () {saveMeal(context);},
 | 
					 | 
				
			||||||
                  ),
 | 
					 | 
				
			||||||
                  Text("${meal.calories.toStringAsFixed(1)} kcal"),
 | 
					                  Text("${meal.calories.toStringAsFixed(1)} kcal"),
 | 
				
			||||||
                ],
 | 
					                ],
 | 
				
			||||||
              ),
 | 
					              ),
 | 
				
			||||||
| 
						 | 
					@ -144,6 +87,6 @@ class MealWidget extends StatelessWidget {
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    ));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue