added fiber
This commit is contained in:
parent
657a7545ba
commit
e2db6a6181
10 changed files with 84 additions and 18 deletions
|
@ -1,6 +1,7 @@
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:html';
|
import 'dart:html';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
|
|
||||||
class ApiClient {
|
class ApiClient {
|
||||||
|
@ -148,8 +149,9 @@ class ApiClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Map<String, dynamic>> getDiary({required DateTime date}) async {
|
Future<Map<String, dynamic>> getDiary({required DateTime date}) async {
|
||||||
|
var formatter = DateFormat('yyyy-MM-dd');
|
||||||
var params = {
|
var params = {
|
||||||
"date": "${date.year}-${date.month}-${date.day}",
|
"date": formatter.format(date),
|
||||||
};
|
};
|
||||||
var response = await get("/diary?${Uri(queryParameters: params).query}");
|
var response = await get("/diary?${Uri(queryParameters: params).query}");
|
||||||
return response;
|
return response;
|
||||||
|
@ -225,12 +227,14 @@ class ApiClient {
|
||||||
required double protein,
|
required double protein,
|
||||||
required double carb,
|
required double carb,
|
||||||
required double fat,
|
required double fat,
|
||||||
|
required double fiber,
|
||||||
}) async {
|
}) async {
|
||||||
var response = await post("/product", {
|
var response = await post("/product", {
|
||||||
"name": name,
|
"name": name,
|
||||||
"protein": protein,
|
"protein": protein,
|
||||||
"carb": carb,
|
"carb": carb,
|
||||||
"fat": fat,
|
"fat": fat,
|
||||||
|
"fiber": fiber,
|
||||||
});
|
});
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Diary {
|
||||||
final double protein;
|
final double protein;
|
||||||
final double carb;
|
final double carb;
|
||||||
final double fat;
|
final double fat;
|
||||||
|
final double fiber;
|
||||||
|
|
||||||
Diary({
|
Diary({
|
||||||
required this.id,
|
required this.id,
|
||||||
|
@ -18,6 +19,7 @@ class Diary {
|
||||||
required this.protein,
|
required this.protein,
|
||||||
required this.carb,
|
required this.carb,
|
||||||
required this.fat,
|
required this.fat,
|
||||||
|
required this.fiber,
|
||||||
});
|
});
|
||||||
|
|
||||||
Diary.fromJson(Map<String, dynamic> map):
|
Diary.fromJson(Map<String, dynamic> map):
|
||||||
|
@ -27,5 +29,6 @@ class Diary {
|
||||||
calories = map['calories'] as double,
|
calories = map['calories'] as double,
|
||||||
protein = map['protein'] as double,
|
protein = map['protein'] as double,
|
||||||
carb = map['carb'] as double,
|
carb = map['carb'] as double,
|
||||||
fat = map['fat'] as double;
|
fat = map['fat'] as double,
|
||||||
|
fiber = map['fiber'] as double;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ class Entry {
|
||||||
final double calories;
|
final double calories;
|
||||||
final double protein;
|
final double protein;
|
||||||
final double fat;
|
final double fat;
|
||||||
|
final double fiber;
|
||||||
final double carb;
|
final double carb;
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ class Entry {
|
||||||
required this.calories,
|
required this.calories,
|
||||||
required this.protein,
|
required this.protein,
|
||||||
required this.fat,
|
required this.fat,
|
||||||
|
required this.fiber,
|
||||||
required this.carb,
|
required this.carb,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -30,5 +32,6 @@ class Entry {
|
||||||
calories = map['calories'] as double,
|
calories = map['calories'] as double,
|
||||||
protein = map['protein'] as double,
|
protein = map['protein'] as double,
|
||||||
fat = map['fat'] as double,
|
fat = map['fat'] as double,
|
||||||
|
fiber = map['fiber'] as double,
|
||||||
carb = map['carb'] as double;
|
carb = map['carb'] as double;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ class Meal {
|
||||||
final double protein;
|
final double protein;
|
||||||
final double carb;
|
final double carb;
|
||||||
final double fat;
|
final double fat;
|
||||||
|
final double fiber;
|
||||||
final int diaryId;
|
final int diaryId;
|
||||||
|
|
||||||
Meal({
|
Meal({
|
||||||
|
@ -21,6 +22,7 @@ class Meal {
|
||||||
required this.protein,
|
required this.protein,
|
||||||
required this.carb,
|
required this.carb,
|
||||||
required this.fat,
|
required this.fat,
|
||||||
|
required this.fiber,
|
||||||
required this.diaryId,
|
required this.diaryId,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -33,5 +35,6 @@ class Meal {
|
||||||
protein = map['protein'] as double,
|
protein = map['protein'] as double,
|
||||||
carb = map['carb'] as double,
|
carb = map['carb'] as double,
|
||||||
fat = map['fat'] as double,
|
fat = map['fat'] as double,
|
||||||
|
fiber = map['fiber'] as double,
|
||||||
diaryId = map['diary_id'] as int;
|
diaryId = map['diary_id'] as int;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ class Product {
|
||||||
final double protein;
|
final double protein;
|
||||||
final double carb;
|
final double carb;
|
||||||
final double fat;
|
final double fat;
|
||||||
|
final double fiber;
|
||||||
|
|
||||||
Product({
|
Product({
|
||||||
required this.id,
|
required this.id,
|
||||||
|
@ -13,6 +14,7 @@ class Product {
|
||||||
required this.protein,
|
required this.protein,
|
||||||
required this.carb,
|
required this.carb,
|
||||||
required this.fat,
|
required this.fat,
|
||||||
|
required this.fiber,
|
||||||
});
|
});
|
||||||
|
|
||||||
Product.fromJson(Map<String, dynamic> map):
|
Product.fromJson(Map<String, dynamic> map):
|
||||||
|
@ -21,5 +23,6 @@ class Product {
|
||||||
calories = map['calories'] as double,
|
calories = map['calories'] as double,
|
||||||
protein = map['protein'] as double,
|
protein = map['protein'] as double,
|
||||||
carb = map['carb'] as double,
|
carb = map['carb'] as double,
|
||||||
fat = map['fat'] as double;
|
fat = map['fat'] as double,
|
||||||
|
fiber = map['fiber'] as double;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ class _AddProductScreen extends State<AddProductScreen> {
|
||||||
final nameController = TextEditingController();
|
final nameController = TextEditingController();
|
||||||
final carbController = TextEditingController();
|
final carbController = TextEditingController();
|
||||||
final fatController = TextEditingController();
|
final fatController = TextEditingController();
|
||||||
|
final fiberController = TextEditingController();
|
||||||
final proteinController = TextEditingController();
|
final proteinController = TextEditingController();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -23,6 +24,7 @@ class _AddProductScreen extends State<AddProductScreen> {
|
||||||
nameController.dispose();
|
nameController.dispose();
|
||||||
carbController.dispose();
|
carbController.dispose();
|
||||||
fatController.dispose();
|
fatController.dispose();
|
||||||
|
fiberController.dispose();
|
||||||
proteinController.dispose();
|
proteinController.dispose();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
@ -59,6 +61,13 @@ class _AddProductScreen extends State<AddProductScreen> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
double.parse(fiberController.text);
|
||||||
|
} catch (e) {
|
||||||
|
showError("Fiber must be a number");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
double.parse(proteinController.text);
|
double.parse(proteinController.text);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -71,6 +80,7 @@ class _AddProductScreen extends State<AddProductScreen> {
|
||||||
carb: double.parse(carbController.text),
|
carb: double.parse(carbController.text),
|
||||||
fat: double.parse(fatController.text),
|
fat: double.parse(fatController.text),
|
||||||
protein: double.parse(proteinController.text),
|
protein: double.parse(proteinController.text),
|
||||||
|
fiber: double.parse(fiberController.text),
|
||||||
name: nameController.text,
|
name: nameController.text,
|
||||||
);
|
);
|
||||||
var product = Product.fromJson(productJson);
|
var product = Product.fromJson(productJson);
|
||||||
|
@ -102,6 +112,12 @@ class _AddProductScreen extends State<AddProductScreen> {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
calories += double.parse(fiberController.text) * 2;
|
||||||
|
} catch (e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
return calories;
|
return calories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,6 +179,19 @@ class _AddProductScreen extends State<AddProductScreen> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
TextFormField(
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
labelText: 'Fiber',
|
||||||
|
),
|
||||||
|
keyboardType:const TextInputType.numberWithOptions(decimal: true),
|
||||||
|
inputFormatters: <TextInputFormatter>[
|
||||||
|
FilteringTextInputFormatter.allow(RegExp(r'^(\d+)?\.?\d{0,2}')),
|
||||||
|
],
|
||||||
|
controller: fiberController,
|
||||||
|
onChanged: (String value) {
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
"${calculateCalories()} kcal",
|
"${calculateCalories()} kcal",
|
||||||
textAlign: TextAlign.right,
|
textAlign: TextAlign.right,
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
class MacroWidget extends StatelessWidget {
|
class MacroWidget extends StatelessWidget {
|
||||||
final double? amount;
|
final double? amount;
|
||||||
final double? calories;
|
final double? calories;
|
||||||
|
final double? fiber;
|
||||||
final double protein;
|
final double protein;
|
||||||
final double carb;
|
final double carb;
|
||||||
final double fat;
|
final double fat;
|
||||||
|
@ -15,6 +16,7 @@ class MacroWidget extends StatelessWidget {
|
||||||
this.calories,
|
this.calories,
|
||||||
this.amount,
|
this.amount,
|
||||||
this.child,
|
this.child,
|
||||||
|
this.fiber,
|
||||||
required this.protein,
|
required this.protein,
|
||||||
required this.carb,
|
required this.carb,
|
||||||
required this.fat,
|
required this.fat,
|
||||||
|
@ -50,6 +52,19 @@ class MacroWidget extends StatelessWidget {
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if (fiber != null) {
|
||||||
|
elements.add(
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: Text(
|
||||||
|
"f: ${fiber!.toStringAsFixed(1)}g",
|
||||||
|
style: style,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (calories != null) {
|
if (calories != null) {
|
||||||
elements.add(
|
elements.add(
|
||||||
Expanded(
|
Expanded(
|
||||||
|
@ -85,15 +100,11 @@ class MacroWidget extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amount == null && calories == null && child == null) {
|
if (elements.length < 4) {
|
||||||
elements.add(
|
elements.add(
|
||||||
Expanded(
|
const Expanded(
|
||||||
flex: 1,
|
flex: 1,
|
||||||
child: Text(
|
child: Text(""),
|
||||||
"",
|
|
||||||
style: style,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ class ProductWidget extends StatelessWidget {
|
||||||
protein: product.protein,
|
protein: product.protein,
|
||||||
carb: product.carb,
|
carb: product.carb,
|
||||||
fat: product.fat,
|
fat: product.fat,
|
||||||
|
fiber: product.fiber,
|
||||||
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
|
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
color: Theme.of(context).colorScheme.secondary,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
|
|
@ -91,6 +91,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.0.2"
|
||||||
|
intl:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: intl
|
||||||
|
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.18.1"
|
||||||
js:
|
js:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -36,6 +36,7 @@ dependencies:
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
# Use with the CupertinoIcons class for iOS style icons.
|
||||||
cupertino_icons: ^1.0.2
|
cupertino_icons: ^1.0.2
|
||||||
http: ^1.1.0
|
http: ^1.1.0
|
||||||
|
intl: ^0.18.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
Loading…
Reference in a new issue