[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,7 +54,12 @@ class DiaryWidget extends StatelessWidget {
|
||||||
color: Theme.of(context).colorScheme.onSecondary,
|
color: Theme.of(context).colorScheme.onSecondary,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
child: IconButton(
|
),
|
||||||
|
)),
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: SizedBox(
|
||||||
|
height: 30,
|
||||||
|
child: TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
|
@ -68,16 +73,10 @@ class DiaryWidget extends StatelessWidget {
|
||||||
refreshParent();
|
refreshParent();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.add),
|
child: const Text("Add Meal"),
|
||||||
style: ButtonStyle(
|
|
||||||
backgroundColor: MaterialStateProperty.all<Color>(
|
|
||||||
Theme.of(context).colorScheme.secondary),
|
|
||||||
foregroundColor: MaterialStateProperty.all<Color>(
|
|
||||||
Theme.of(context).colorScheme.onSecondary),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)),
|
|
||||||
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