[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,
|
||||
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(
|
||||
delegate: SliverChildListDelegate(
|
||||
[
|
||||
|
|
|
@ -3,6 +3,7 @@ import 'package:fooder/models/meal.dart';
|
|||
import 'package:fooder/widgets/entry.dart';
|
||||
import 'package:fooder/widgets/macro.dart';
|
||||
import 'package:fooder/screens/edit_entry.dart';
|
||||
import 'package:fooder/screens/meal.dart';
|
||||
import 'package:fooder/client.dart';
|
||||
import 'dart:core';
|
||||
|
||||
|
@ -17,73 +18,23 @@ class MealWidget extends StatelessWidget {
|
|||
required this.apiClient,
|
||||
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
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
child: GestureDetector(
|
||||
onLongPress: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => MealScreen(
|
||||
apiClient: apiClient,
|
||||
meal: meal,
|
||||
),
|
||||
),
|
||||
).then((_) {
|
||||
refreshParent();
|
||||
});
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
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"),
|
||||
],
|
||||
),
|
||||
|
@ -144,6 +87,6 @@ class MealWidget extends StatelessWidget {
|
|||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue