Compare commits

...

51 Commits

Author SHA1 Message Date
98spag 2a3864c287 feat: refactoring 2023-06-25 14:43:07 +02:00
2211260 024a6c3c0b feat: remove debug banner and make header font color black 2023-06-21 13:33:42 +02:00
Bogdan Kotikov 9d7045b613 bug 2023-06-20 19:36:24 +02:00
Bogdan Kotikov e4ebac676f farbe und felder mit daten befüllen 2023-06-19 20:23:27 +02:00
Bogdan Kotikov 7b92d3dada hive box tests 2023-06-16 15:17:04 +02:00
98spag 38fd9b8b6a feat: adjust colors 2023-06-16 12:26:07 +02:00
98spag 2e22914cc2 feat: sort meals 2023-06-16 12:17:23 +02:00
98spag 98b45aabca feat: change profile button 2023-06-16 12:10:48 +02:00
98spag 686657628a feat: adjust text width for web 2023-06-16 12:03:04 +02:00
98spag 0cdab96552 feat: fix tests 2023-06-16 11:47:52 +02:00
98spag 2623e97718 feat: remove web componetns 2023-06-16 11:46:32 +02:00
98spag 29b16918c0 feat: changes 2023-06-16 11:44:42 +02:00
Bogdan Kotikov 8a3d6808a3 bug fix 2023-06-16 08:34:41 +02:00
Bogdan Kotikov c9d65c04f7 bug fix 2023-06-07 00:01:26 +02:00
Bogdan Kotikov 1b9d8b693f bug fix 2023-06-06 23:45:02 +02:00
Bogdan Kotikov 30cf45bd35 bug 2023-06-03 01:06:38 +02:00
Bogdan Kotikov ca5f610dcb speed up main page 2023-06-03 00:51:26 +02:00
Bogdan Kotikov 6505c9948c Merge pull request 'feature/optimize-search-page' (#5) from feature/optimize-search-page into main
Reviewed-on: #5
2023-06-03 00:49:56 +02:00
Bogdan Kotikov 1641c7accb merge 2023-06-03 00:49:19 +02:00
Bogdan Kotikov 741199d84d Merge remote-tracking branch 'origin/main' into feature/optimize-search-page
# Conflicts:
#	.dart_tool/package_config.json
#	.dart_tool/package_config_subset
#	.flutter-plugins-dependencies
#	lib/android/pages/nav_pages/main_page.dart
#	pubspec.yaml
2023-06-03 00:48:17 +02:00
Bogdan Kotikov 5335625c99 settings page 2023-06-03 00:46:54 +02:00
Bogdan Kotikov 6085297b1c settings page 2023-06-03 00:40:40 +02:00
2211260 67da75fb3e feat: add goal line to progress chart 2023-06-02 20:21:16 +02:00
2211260 fd4e07fc8c feat: adjust list logic on today page 2023-06-02 20:02:32 +02:00
2211260 5553a521d1 feat: styling adjustments 2023-06-02 19:21:06 +02:00
2211260 af5a4384c6 feat: make page title black 2023-06-02 18:38:19 +02:00
2211260 6ebdb39760 feat: adjust search styling 2023-06-02 18:35:07 +02:00
2211260 d131e1263c feat: add loading spinner for search component, adjust filtering and add success toast 2023-06-02 18:18:08 +02:00
Bogdan Kotikov a989878cca optimierung 2023-06-02 01:42:56 +02:00
Bogdan Kotikov c91f3901dd Merge pull request 'feature/show-only-today-meals-on-today-page' (#4) from feature/show-only-today-meals-on-today-page into main
Reviewed-on: #4
2023-06-02 00:41:57 +02:00
Bogdan Kotikov 4fbb5f58a5 woche, monat kalorien, fett, kohlenhydrate, etc, bug fixes 2023-06-02 00:39:40 +02:00
Bogdan Kotikov 947ab18251 Merge remote-tracking branch 'origin/feature/show-only-today-meals-on-today-page' into feature/show-only-today-meals-on-today-page 2023-06-02 00:38:48 +02:00
Bogdan Kotikov be6609837c woche, monat kalorien, fett, kohlenhydrate, etc, bug fixes 2023-06-02 00:38:19 +02:00
98spag 851fc0e44d feat: show only food list from today on today page - test with mock data 2023-06-01 14:58:33 +02:00
98spag a56fed5450 feat: show only food list from today on today page - test with mock data 2023-06-01 14:58:12 +02:00
98spag 795de496cd feat: show only food list from today on today page 2023-06-01 13:59:12 +02:00
98spag 8d33371966 feat: adjust chart styling 2023-06-01 13:19:55 +02:00
98spag ae7f64ac1e merge feature branch 2023-06-01 12:22:43 +02:00
98spag 2580b8f1f7 merge main 2023-06-01 12:17:04 +02:00
98spag f25de45f7c feat: adjustments 2023-06-01 12:14:23 +02:00
Bogdan Kotikov b93bf41961 bug fixing 2023-06-01 11:46:53 +02:00
Bogdan Kotikov 237e8ffa4e Merge remote-tracking branch 'origin/main' into feature/chart-progress-page
# Conflicts:
#	.flutter-plugins-dependencies
2023-05-31 23:48:21 +02:00
Bogdan Kotikov b0ca2ada88 Merge pull request 'welcome' (#2) from welcome into main
Reviewed-on: #2
2023-05-31 23:27:40 +02:00
98spag 7a97f99496 add first draft of progress page chart 2023-05-31 13:36:44 +02:00
98spag fcc607043e feat: add weeekly ranking list and average calories 2023-05-30 22:09:16 +02:00
98spag cc1ea62d2d feat: add observable values for charts 2023-05-30 21:03:46 +02:00
98spag 1f5b6e18ff bugfix: add filter bug 2023-05-30 18:02:13 +02:00
98spag b201a6758b feat: add ingredient progress bars to page 2023-05-30 17:28:16 +02:00
98spag 77023ad118 feat: format helper 2023-05-30 17:15:35 +02:00
98spag 0fd7def1e4 feat: format helper 2023-05-30 17:12:42 +02:00
98spag 53d69b22d5 bugfix: fix string capitalization errror 2023-05-30 17:10:53 +02:00
87 changed files with 3293 additions and 3269 deletions

View File

@ -3,601 +3,661 @@
"packages": [ "packages": [
{ {
"name": "_fe_analyzer_shared", "name": "_fe_analyzer_shared",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-61.0.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "adaptive_dialog",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/adaptive_dialog-1.8.3+1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "analyzer", "name": "analyzer",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/analyzer-5.11.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "animate_gradient", "name": "animate_gradient",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/animate_gradient-0.0.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.16" "languageVersion": "2.16"
}, },
{ {
"name": "args", "name": "animations",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/args-2.4.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.12"
},
{
"name": "args",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2",
"packageUri": "lib/",
"languageVersion": "2.19"
}, },
{ {
"name": "assorted_layout_widgets", "name": "assorted_layout_widgets",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/assorted_layout_widgets-8.0.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "async", "name": "async",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/async-2.10.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "basic_utils", "name": "basic_utils",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/basic_utils-5.5.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/basic_utils-5.5.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "boolean_selector", "name": "boolean_selector",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/boolean_selector-2.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{
"name": "bs_flutter_modal",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/bs_flutter_modal-1.0.6",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "bs_flutter_utils",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/bs_flutter_utils-1.0.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{ {
"name": "build", "name": "build",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build-2.3.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build-2.3.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "build_config", "name": "build_config",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_config-1.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_config-1.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "build_daemon", "name": "build_daemon",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_daemon-3.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_daemon-3.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "build_resolvers", "name": "build_resolvers",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_resolvers-2.2.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_resolvers-2.2.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "build_runner", "name": "build_runner",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner-2.3.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner-2.3.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "build_runner_core", "name": "build_runner_core",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner_core-7.2.7", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "built_collection", "name": "built_collection",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_collection-5.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_collection-5.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "built_value", "name": "built_value",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_value-8.5.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "card_swiper", "name": "card_swiper",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/card_swiper-2.0.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/card_swiper-2.0.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "characters", "name": "characters",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/characters-1.2.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "checked_yaml", "name": "checked_yaml",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/checked_yaml-2.0.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/checked_yaml-2.0.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "clock", "name": "clock",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/clock-1.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "code_builder", "name": "code_builder",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/code_builder-4.4.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.19"
}, },
{ {
"name": "collection", "name": "collection",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/collection-1.17.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "convert", "name": "convert",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/convert-3.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/convert-3.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "crypto", "name": "crypto",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/crypto-3.0.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "cupertino_icons", "name": "cupertino_icons",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.5",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "dart_style", "name": "dart_style",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/dart_style-2.3.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dart_style-2.3.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{
"name": "dynamic_color",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dynamic_color-1.6.5",
"packageUri": "lib/",
"languageVersion": "2.16"
},
{ {
"name": "empty_widget", "name": "empty_widget",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/empty_widget-0.0.5", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/empty_widget-0.0.5",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "equatable", "name": "equatable",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/equatable-2.0.5", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/equatable-2.0.5",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "fake_async", "name": "fake_async",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/fake_async-1.3.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fake_async-1.3.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "ffi", "name": "ffi",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/ffi-2.0.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "file", "name": "file",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/file-6.1.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/file-6.1.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "fixnum", "name": "fixnum",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/fixnum-1.1.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fixnum-1.1.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "fl_chart", "name": "fl_chart",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/fl_chart-0.62.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fl_chart-0.62.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "flutter", "name": "flutter",
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter", "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "flutter_dotenv", "name": "flutter_dotenv",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_dotenv-5.0.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "flutter_form_builder", "name": "flutter_form_builder",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_form_builder-8.0.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "flutter_lints", "name": "flutter_lints",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_lints-2.0.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_lints-2.0.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "flutter_localizations", "name": "flutter_localizations",
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_localizations", "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_localizations",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{
"name": "flutter_profile_picture",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_profile_picture-2.0.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{ {
"name": "flutter_test", "name": "flutter_test",
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_test", "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_test",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{
"name": "flutter_web_plugins",
"rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_web_plugins",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "fluttertoast",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fluttertoast-8.2.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{ {
"name": "form_builder_validators", "name": "form_builder_validators",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/form_builder_validators-8.6.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "frontend_server_client", "name": "frontend_server_client",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/frontend_server_client-3.2.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "glob", "name": "glob",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/glob-2.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.15" "languageVersion": "2.19"
}, },
{ {
"name": "graphs", "name": "graphs",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/graphs-2.2.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.18"
}, },
{ {
"name": "hive", "name": "hive",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive-2.2.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive-2.2.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "hive_flutter", "name": "hive_flutter",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_flutter-1.1.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_flutter-1.1.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "hive_generator", "name": "hive_generator",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_generator-2.0.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_generator-2.0.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "http", "name": "http",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/http-0.13.6", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http-0.13.6",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "http_multi_server", "name": "http_multi_server",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_multi_server-3.2.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "http_parser", "name": "http_parser",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_parser-4.0.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_parser-4.0.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "intersperse",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intersperse-2.0.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "intl", "name": "intl",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/intl-0.17.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "io", "name": "io",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/io-1.0.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/io-1.0.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "js", "name": "js",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/js-0.6.5", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.16" "languageVersion": "2.16"
}, },
{ {
"name": "json_annotation", "name": "json_annotation",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/json_annotation-4.8.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/json_annotation-4.8.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
{ {
"name": "lints", "name": "lints",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/lints-2.0.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/lints-2.0.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "logging", "name": "logging",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/logging-1.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.19"
},
{
"name": "macos_ui",
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/macos_ui-1.12.2",
"packageUri": "lib/",
"languageVersion": "2.17"
}, },
{ {
"name": "matcher", "name": "matcher",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/matcher-0.12.13", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "material_color_utilities", "name": "material_color_utilities",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/material_color_utilities-0.2.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.13" "languageVersion": "2.13"
}, },
{ {
"name": "matrix4_transform", "name": "matrix4_transform",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/matrix4_transform-2.0.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matrix4_transform-2.0.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.13" "languageVersion": "2.13"
}, },
{ {
"name": "meta", "name": "meta",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/meta-1.8.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "mime", "name": "mime",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/mime-1.0.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/mime-1.0.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "package_config", "name": "package_config",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/package_config-2.1.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/package_config-2.1.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "path", "name": "path",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path-1.8.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "path_provider", "name": "path_provider",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider-2.0.14", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "path_provider_android", "name": "path_provider_android",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_android-2.0.27",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "path_provider_foundation", "name": "path_provider_foundation",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "path_provider_linux", "name": "path_provider_linux",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.18"
}, },
{ {
"name": "path_provider_platform_interface", "name": "path_provider_platform_interface",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.0.6", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_platform_interface-2.0.6",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "path_provider_windows", "name": "path_provider_windows",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.18"
}, },
{ {
"name": "percent_indicator", "name": "percent_indicator",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/percent_indicator-4.2.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/percent_indicator-4.2.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "platform", "name": "platform",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/platform-3.1.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/platform-3.1.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "plugin_platform_interface", "name": "plugin_platform_interface",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/plugin_platform_interface-2.1.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "pointycastle", "name": "pointycastle",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pointycastle-3.7.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pointycastle-3.7.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "pool", "name": "pool",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pool-1.5.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pool-1.5.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "process", "name": "process",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/process-4.2.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/process-4.2.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "pub_semver", "name": "pub_semver",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pub_semver-2.1.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pub_semver-2.1.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "pubspec_parse", "name": "pubspec_parse",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pubspec_parse-1.2.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "responsive_framework", "name": "responsive_framework",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/responsive_framework-1.0.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/responsive_framework-1.0.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "searchable_listview", "name": "searchable_listview",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/searchable_listview-2.4.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/searchable_listview-2.4.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "shelf", "name": "shelf",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf-1.4.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf-1.4.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "shelf_web_socket", "name": "shelf_web_socket",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf_web_socket-1.0.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "sizer", "name": "sizer",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/sizer-2.0.15", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/sizer-2.0.15",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "sky_engine", "name": "sky_engine",
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/bin/cache/pkg/sky_engine", "rootUri": "file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "source_gen", "name": "source_gen",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_gen-1.3.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "source_helper", "name": "source_helper",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_helper-1.3.3", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_helper-1.3.3",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "source_span", "name": "source_span",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_span-1.9.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_span-1.9.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "stack_trace", "name": "stack_trace",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/stack_trace-1.11.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stack_trace-1.11.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "stream_channel", "name": "stream_channel",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_channel-2.1.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_channel-2.1.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "stream_transform", "name": "stream_transform",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_transform-2.1.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_transform-2.1.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "string_scanner", "name": "string_scanner",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/string_scanner-1.2.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.2.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "term_glyph", "name": "term_glyph",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/term_glyph-1.2.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/term_glyph-1.2.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.12"
}, },
{ {
"name": "test_api", "name": "test_api",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/test_api-0.4.16", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.18" "languageVersion": "2.18"
}, },
{ {
"name": "timing", "name": "timing",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/timing-1.0.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/timing-1.0.1",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "typed_data", "name": "typed_data",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/typed_data-1.3.1", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.12" "languageVersion": "2.17"
}, },
{ {
"name": "universal_io", "name": "universal_io",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/universal_io-2.2.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/universal_io-2.2.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.15" "languageVersion": "2.15"
}, },
{ {
"name": "vector_math", "name": "vector_math",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/vector_math-2.1.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/vector_math-2.1.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "watcher", "name": "watcher",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/watcher-1.0.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/watcher-1.0.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.14" "languageVersion": "2.14"
}, },
{ {
"name": "web_socket_channel", "name": "web_socket_channel",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/web_socket_channel-2.4.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.15" "languageVersion": "2.15"
}, },
{ {
"name": "win32", "name": "win32",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/win32-4.1.4", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/win32-4.1.4",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "xdg_directories", "name": "xdg_directories",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/xdg_directories-1.0.0", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.0.0",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.17" "languageVersion": "2.17"
}, },
{ {
"name": "yaml", "name": "yaml",
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/yaml-3.1.2", "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/yaml-3.1.2",
"packageUri": "lib/", "packageUri": "lib/",
"languageVersion": "2.19" "languageVersion": "2.19"
}, },
@ -608,7 +668,7 @@
"languageVersion": "2.19" "languageVersion": "2.19"
} }
], ],
"generated": "2023-05-30T21:33:05.140346Z", "generated": "2023-06-25T12:05:16.357241Z",
"generator": "pub", "generator": "pub",
"generatorVersion": "2.19.6" "generatorVersion": "2.19.6"
} }

View File

@ -1,405 +1,445 @@
_fe_analyzer_shared _fe_analyzer_shared
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-61.0.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-61.0.0/lib/
adaptive_dialog
2.17
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/adaptive_dialog-1.8.3+1/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/adaptive_dialog-1.8.3+1/lib/
analyzer analyzer
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/analyzer-5.11.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/analyzer-5.11.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0/lib/
animate_gradient animate_gradient
2.16 2.16
file:///Users/bogdan/.pub-cache/hosted/pub.dev/animate_gradient-0.0.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/animate_gradient-0.0.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1/lib/
animations
2.12
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7/lib/
args args
2.18 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/args-2.4.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/args-2.4.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2/lib/
assorted_layout_widgets assorted_layout_widgets
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/assorted_layout_widgets-8.0.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/assorted_layout_widgets-8.0.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4/lib/
async async
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/async-2.10.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/async-2.10.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0/lib/
basic_utils basic_utils
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/basic_utils-5.5.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/basic_utils-5.5.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/basic_utils-5.5.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/basic_utils-5.5.4/lib/
boolean_selector boolean_selector
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/boolean_selector-2.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/boolean_selector-2.1.1/lib/
bs_flutter_modal
2.12
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/bs_flutter_modal-1.0.6/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/bs_flutter_modal-1.0.6/lib/
bs_flutter_utils
2.12
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/bs_flutter_utils-1.0.2/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/bs_flutter_utils-1.0.2/lib/
build build
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build-2.3.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build-2.3.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build-2.3.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build-2.3.1/lib/
build_config build_config
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_config-1.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_config-1.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_config-1.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_config-1.1.1/lib/
build_daemon build_daemon
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_daemon-3.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_daemon-3.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_daemon-3.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_daemon-3.1.1/lib/
build_resolvers build_resolvers
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_resolvers-2.2.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_resolvers-2.2.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_resolvers-2.2.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_resolvers-2.2.0/lib/
build_runner build_runner
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner-2.3.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner-2.3.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner-2.3.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner-2.3.3/lib/
build_runner_core build_runner_core
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner_core-7.2.7/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner_core-7.2.7/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1/lib/
built_collection built_collection
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_collection-5.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_collection-5.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_collection-5.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_collection-5.1.1/lib/
built_value built_value
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_value-8.5.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_value-8.5.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1/lib/
card_swiper card_swiper
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/card_swiper-2.0.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/card_swiper-2.0.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/card_swiper-2.0.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/card_swiper-2.0.4/lib/
characters characters
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/characters-1.2.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/characters-1.2.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1/lib/
checked_yaml checked_yaml
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/checked_yaml-2.0.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/checked_yaml-2.0.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/checked_yaml-2.0.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/checked_yaml-2.0.3/lib/
clock clock
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/clock-1.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1/lib/
code_builder code_builder
2.17 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/code_builder-4.4.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/code_builder-4.4.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0/lib/
collection collection
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/collection-1.17.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/collection-1.17.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0/lib/
convert convert
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/convert-3.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/convert-3.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/convert-3.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/convert-3.1.1/lib/
crypto crypto
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/crypto-3.0.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/crypto-3.0.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.3/lib/
cupertino_icons cupertino_icons
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.5/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.5/lib/
dart_style dart_style
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/dart_style-2.3.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dart_style-2.3.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/dart_style-2.3.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dart_style-2.3.1/lib/
dynamic_color
2.16
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dynamic_color-1.6.5/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dynamic_color-1.6.5/lib/
empty_widget empty_widget
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/empty_widget-0.0.5/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/empty_widget-0.0.5/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/empty_widget-0.0.5/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/empty_widget-0.0.5/lib/
equatable equatable
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/equatable-2.0.5/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/equatable-2.0.5/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/equatable-2.0.5/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/equatable-2.0.5/lib/
fake_async fake_async
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fake_async-1.3.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fake_async-1.3.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fake_async-1.3.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fake_async-1.3.1/lib/
ffi ffi
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/ffi-2.0.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/ffi-2.0.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2/lib/
file file
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/file-6.1.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/file-6.1.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/file-6.1.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/file-6.1.4/lib/
fixnum fixnum
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fixnum-1.1.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fixnum-1.1.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fixnum-1.1.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fixnum-1.1.0/lib/
fl_chart fl_chart
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fl_chart-0.62.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fl_chart-0.62.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fl_chart-0.62.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fl_chart-0.62.0/lib/
flutter_dotenv flutter_dotenv
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_dotenv-5.0.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_dotenv-5.0.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0/lib/
flutter_form_builder flutter_form_builder
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_form_builder-8.0.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_form_builder-8.0.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0/lib/
flutter_lints flutter_lints
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_lints-2.0.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_lints-2.0.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_lints-2.0.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_lints-2.0.1/lib/
flutter_profile_picture
2.12
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_profile_picture-2.0.0/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_profile_picture-2.0.0/lib/
fluttertoast
2.12
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fluttertoast-8.2.2/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fluttertoast-8.2.2/lib/
form_builder_validators form_builder_validators
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/form_builder_validators-8.6.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/form_builder_validators-8.6.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1/lib/
frontend_server_client frontend_server_client
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/frontend_server_client-3.2.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/frontend_server_client-3.2.0/lib/
glob glob
2.15 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/glob-2.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/glob-2.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2/lib/
graphs graphs
2.12 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/graphs-2.2.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/graphs-2.2.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1/lib/
hive hive
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive-2.2.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive-2.2.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive-2.2.3/lib/
hive_flutter hive_flutter
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_flutter-1.1.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_flutter-1.1.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_flutter-1.1.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_flutter-1.1.0/lib/
hive_generator hive_generator
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_generator-2.0.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_generator-2.0.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_generator-2.0.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_generator-2.0.0/lib/
http http
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http-0.13.6/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http-0.13.6/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http-0.13.6/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http-0.13.6/lib/
http_multi_server http_multi_server
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_multi_server-3.2.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_multi_server-3.2.1/lib/
http_parser http_parser
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_parser-4.0.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_parser-4.0.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_parser-4.0.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_parser-4.0.2/lib/
intersperse
2.12
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intersperse-2.0.0/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intersperse-2.0.0/lib/
intl intl
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/intl-0.17.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/intl-0.17.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0/lib/
io io
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/io-1.0.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/io-1.0.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/io-1.0.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/io-1.0.4/lib/
js js
2.16 2.16
file:///Users/bogdan/.pub-cache/hosted/pub.dev/js-0.6.5/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/js-0.6.5/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5/lib/
json_annotation json_annotation
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/json_annotation-4.8.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/json_annotation-4.8.1/lib/
lints lints
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/lints-2.0.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/lints-2.0.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/lints-2.0.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/lints-2.0.1/lib/
logging logging
2.18 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/logging-1.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/logging-1.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0/lib/
macos_ui
2.17
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/macos_ui-1.12.2/
file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/macos_ui-1.12.2/lib/
matcher matcher
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matcher-0.12.13/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matcher-0.12.13/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13/lib/
material_color_utilities material_color_utilities
2.13 2.13
file:///Users/bogdan/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/material_color_utilities-0.2.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/
matrix4_transform matrix4_transform
2.13 2.13
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matrix4_transform-2.0.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matrix4_transform-2.0.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matrix4_transform-2.0.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matrix4_transform-2.0.1/lib/
meta meta
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/meta-1.8.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/meta-1.8.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0/lib/
mime mime
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/mime-1.0.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/mime-1.0.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/mime-1.0.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/mime-1.0.4/lib/
package_config package_config
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/package_config-2.1.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/package_config-2.1.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/package_config-2.1.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/package_config-2.1.0/lib/
path path
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path-1.8.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path-1.8.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2/lib/
path_provider path_provider
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider-2.0.14/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider-2.0.14/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15/lib/
path_provider_android path_provider_android
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_android-2.0.27/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_android-2.0.27/lib/
path_provider_foundation path_provider_foundation
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3/lib/
path_provider_linux path_provider_linux
2.17 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11/lib/
path_provider_platform_interface path_provider_platform_interface
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.0.6/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_platform_interface-2.0.6/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.0.6/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_platform_interface-2.0.6/lib/
path_provider_windows path_provider_windows
2.17 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7/lib/
percent_indicator percent_indicator
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/percent_indicator-4.2.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/percent_indicator-4.2.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/percent_indicator-4.2.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/percent_indicator-4.2.3/lib/
platform platform
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/platform-3.1.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/platform-3.1.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/platform-3.1.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/platform-3.1.0/lib/
plugin_platform_interface plugin_platform_interface
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/plugin_platform_interface-2.1.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/plugin_platform_interface-2.1.4/lib/
pointycastle pointycastle
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pointycastle-3.7.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pointycastle-3.7.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pointycastle-3.7.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pointycastle-3.7.3/lib/
pool pool
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pool-1.5.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pool-1.5.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pool-1.5.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pool-1.5.1/lib/
process process
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/process-4.2.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/process-4.2.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/process-4.2.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/process-4.2.4/lib/
pub_semver pub_semver
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pub_semver-2.1.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pub_semver-2.1.4/lib/
pubspec_parse pubspec_parse
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pubspec_parse-1.2.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pubspec_parse-1.2.3/lib/
responsive_framework responsive_framework
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/responsive_framework-1.0.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/responsive_framework-1.0.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/responsive_framework-1.0.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/responsive_framework-1.0.0/lib/
searchable_listview searchable_listview
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/searchable_listview-2.4.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/searchable_listview-2.4.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/searchable_listview-2.4.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/searchable_listview-2.4.0/lib/
shelf shelf
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf-1.4.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf-1.4.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf-1.4.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf-1.4.1/lib/
shelf_web_socket shelf_web_socket
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf_web_socket-1.0.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf_web_socket-1.0.4/lib/
sizer sizer
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/sizer-2.0.15/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/sizer-2.0.15/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/sizer-2.0.15/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/sizer-2.0.15/lib/
source_gen source_gen
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_gen-1.3.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_gen-1.3.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2/lib/
source_helper source_helper
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_helper-1.3.3/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_helper-1.3.3/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_helper-1.3.3/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_helper-1.3.3/lib/
source_span source_span
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_span-1.9.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_span-1.9.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_span-1.9.1/lib/
stack_trace stack_trace
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stack_trace-1.11.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stack_trace-1.11.0/lib/
stream_channel stream_channel
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_channel-2.1.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_channel-2.1.1/lib/
stream_transform stream_transform
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_transform-2.1.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_transform-2.1.0/lib/
string_scanner string_scanner
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.2.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.2.0/lib/
term_glyph term_glyph
2.12 2.12
file:///Users/bogdan/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/term_glyph-1.2.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/term_glyph-1.2.1/lib/
test_api test_api
2.18 2.18
file:///Users/bogdan/.pub-cache/hosted/pub.dev/test_api-0.4.16/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/test_api-0.4.16/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16/lib/
timing timing
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/timing-1.0.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/timing-1.0.1/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/timing-1.0.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/timing-1.0.1/lib/
typed_data typed_data
2.12 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/typed_data-1.3.1/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/typed_data-1.3.1/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2/lib/
universal_io universal_io
2.15 2.15
file:///Users/bogdan/.pub-cache/hosted/pub.dev/universal_io-2.2.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/universal_io-2.2.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/universal_io-2.2.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/universal_io-2.2.0/lib/
vector_math vector_math
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/vector_math-2.1.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/vector_math-2.1.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/vector_math-2.1.4/lib/
watcher watcher
2.14 2.14
file:///Users/bogdan/.pub-cache/hosted/pub.dev/watcher-1.0.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/watcher-1.0.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/watcher-1.0.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/watcher-1.0.2/lib/
web_socket_channel web_socket_channel
2.15 2.15
file:///Users/bogdan/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/web_socket_channel-2.4.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/web_socket_channel-2.4.0/lib/
win32 win32
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/win32-4.1.4/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/win32-4.1.4/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/win32-4.1.4/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/win32-4.1.4/lib/
xdg_directories xdg_directories
2.17 2.17
file:///Users/bogdan/.pub-cache/hosted/pub.dev/xdg_directories-1.0.0/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.0.0/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/xdg_directories-1.0.0/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.0.0/lib/
yaml yaml
2.19 2.19
file:///Users/bogdan/.pub-cache/hosted/pub.dev/yaml-3.1.2/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/yaml-3.1.2/
file:///Users/bogdan/.pub-cache/hosted/pub.dev/yaml-3.1.2/lib/ file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/yaml-3.1.2/lib/
ernaehrung
2.19
file:///Users/bogdan/IdeaProjects/ernaehrung/
file:///Users/bogdan/IdeaProjects/ernaehrung/lib/
sky_engine sky_engine
2.12 2.12
file:///usr/local/Caskroom/flutter/3.7.7/flutter/bin/cache/pkg/sky_engine/ file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine/
file:///usr/local/Caskroom/flutter/3.7.7/flutter/bin/cache/pkg/sky_engine/lib/ file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine/lib/
flutter flutter
2.17 2.17
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter/ file:///C:/Users/Nutzer/flutter/packages/flutter/
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter/lib/ file:///C:/Users/Nutzer/flutter/packages/flutter/lib/
flutter_localizations flutter_localizations
2.17 2.17
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_localizations/ file:///C:/Users/Nutzer/flutter/packages/flutter_localizations/
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_localizations/lib/ file:///C:/Users/Nutzer/flutter/packages/flutter_localizations/lib/
flutter_test flutter_test
2.17 2.17
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_test/ file:///C:/Users/Nutzer/flutter/packages/flutter_test/
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_test/lib/ file:///C:/Users/Nutzer/flutter/packages/flutter_test/lib/
flutter_web_plugins
2.17
file:///C:/Users/Nutzer/flutter/packages/flutter_web_plugins/
file:///C:/Users/Nutzer/flutter/packages/flutter_web_plugins/lib/
ernaehrung
2.19
file:///C:/Users/Nutzer/source/repos/Flutter-Ernaehrungsapp/
file:///C:/Users/Nutzer/source/repos/Flutter-Ernaehrungsapp/lib/
2 2

8
.env
View File

@ -5,10 +5,16 @@ AGE_FIELD=AGE
WEIGHT_FIELD=WEIGHT WEIGHT_FIELD=WEIGHT
HEIGHT_FIELD=HEIGHT HEIGHT_FIELD=HEIGHT
CALORIES_FIELD=CALORIES CALORIES_FIELD=CALORIES
TODAY_BOX=TODAY
DATE_FIELD=DATE # datum DATE_FIELD=DATE # datum
BREAKFAST_FIELD=FRÜHSTÜCK # frühstück BREAKFAST_FIELD=FRÜHSTÜCK # frühstück
LUNCH_FIELD=MITTAGESSEN # mittagessen LUNCH_FIELD=MITTAGESSEN # mittagessen
DINNER_FIELD=ABENDESSEN # abendessen DINNER_FIELD=ABENDESSEN # abendessen
YESTERDAY_AND_BEFORE=YESTERDAY # gestern und alles was davor war YESTERDAY_AND_BEFORE=YESTERDAY # gestern und alles was davor war
TOMORROW_AND_AFTER=TOMORROW # morgen und alles was kommen wird TOMORROW_AND_AFTER=TOMORROW # morgen und alles was kommen wird
TODAY_BOX=TODAY
PROGRESS_BOX=PROGRESS
STATISTICS_BOX=STATISTICS
MAIN_BOX=MAIN
USER_BOX=USER

View File

@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_foundation","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2023-05-31 22:57:37.224562","version":"3.7.9"} {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"bs_flutter_modal","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_modal-1.0.6\\\\","native_build":true,"dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_utils-1.0.2\\\\","native_build":true,"dependencies":[]},{"name":"fluttertoast","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\fluttertoast-8.2.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.2.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"bs_flutter_modal","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_modal-1.0.6\\\\","native_build":true,"dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_utils-1.0.2\\\\","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"fluttertoast","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\fluttertoast-8.2.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.0.27\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"macos_ui","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\macos_ui-1.12.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.2.3\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_linux","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.1.11\\\\","native_build":false,"dependencies":[]}],"windows":[{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_windows-2.1.7\\\\","native_build":false,"dependencies":[]}],"web":[{"name":"bs_flutter_modal","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_modal-1.0.6\\\\","dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_utils-1.0.2\\\\","dependencies":[]},{"name":"fluttertoast","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\fluttertoast-8.2.2\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"bs_flutter_modal","dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"fluttertoast","dependencies":[]},{"name":"macos_ui","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2023-06-25 14:42:43.177562","version":"3.7.11"}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 573 B

View File

@ -1,27 +0,0 @@
import 'package:ernaehrung/android/components/food_list_component.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'meal_page_text/title_component.dart';
class MealPageStatisticsFoodComponent extends StatelessWidget {
const MealPageStatisticsFoodComponent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
color: Colors.white
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 24,
),
const TitleComponent("Nahrung"),
FoodComponent(box: Hive.box('STATISTICS_REDUCED'),)
],
),
);
}
}

View File

@ -1,83 +0,0 @@
import 'package:ernaehrung/android/components/card/card_data_food_component.dart';
import 'package:ernaehrung/android/components/card/card_title_component.dart';
import 'package:flutter/material.dart';
import '../../models/food.dart';
import '../../pages/nav_pages/search_food.dart';
class CardComponent extends StatelessWidget {
final String title;
final List<dynamic> foods;
const CardComponent(this.title, this.foods, {super.key});
List<Food> castDynamicToListFood(List<dynamic> dynamicList) {
List<Food> foodList = [];
for (Food element in dynamicList) {
foodList.add(element);
}
return foodList;
}
Route createRoute(String cardName) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
SearchFoodPage(cardName),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(0.0, 1.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween =
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}
@override
Widget build(BuildContext context) {
return Container(
height: 300,
decoration: BoxDecoration(
color: const Color(0xFF6E7BFB),
borderRadius: const BorderRadius.all(Radius.circular(16)),
border: Border.all(
color: Colors.black,
),
),
margin: const EdgeInsets.fromLTRB(0, 16, 0, 16),
child: Column(
children: [
CardTitleComponent(
title, "${castDynamicToListFood(foods).length} Kalorien"),
CardDataFoodComponent(
castDynamicToListFood(foods)
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
child: Container(
margin: const EdgeInsets.fromLTRB(0, 8, 0, 0),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(40), //
backgroundColor: const Color(0xFFffffff),
foregroundColor: const Color(0xFF6E7BFB),
shape: const StadiumBorder(),
),
onPressed: () async {
Navigator.of(context).push(createRoute(title));
},
child: Text('Text Of Button'),
),
),
)
],
));
}
}

View File

@ -1,35 +0,0 @@
import 'package:ernaehrung/android/components/card/card_food_item_component.dart';
import 'package:ernaehrung/android/models/food.dart';
import 'package:flutter/material.dart';
class CardDataFoodComponent extends StatelessWidget {
final List<Food> foods;
const CardDataFoodComponent(this.foods, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
height: 180,
decoration: const BoxDecoration(
color: Colors.pink,
borderRadius: BorderRadius.all(Radius.circular(16))),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: foods.length,
itemBuilder: (context, i) {
return CardFoodItemComponent(foods[i]);
})
],
),
)),
);
}
}

View File

@ -1,42 +0,0 @@
import 'package:ernaehrung/android/models/food.dart';
import 'package:flutter/material.dart';
class CardFoodItemComponent extends StatelessWidget {
final Food food;
const CardFoodItemComponent(this.food, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(0, 8, 0, 4),
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 6,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
food.name.toString(),
style: const TextStyle(color: Colors.white),
softWrap: true,
),
Text(
food.calories.toString(),
style: const TextStyle(color: Colors.white),
),
],
),
),
Expanded(
flex: 1, child: TextButton(onPressed: () {}, child: Text("+")))
],
),
);
}
}

View File

@ -1,171 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import '../models/food.dart';
import '../pages/nav_pages/search_food.dart';
class CardComponent extends StatefulWidget {
final String eatingMealName;
final List<Food> selectedMeal;
final bool addButtonVisible;
const CardComponent(
{Key? key, required this.eatingMealName, required this.selectedMeal, this.addButtonVisible = true})
: super(key: key);
@override
State<CardComponent> createState() => _CardComponentState();
}
class _CardComponentState extends State<CardComponent> {
Route createRoute(String cardName) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
SearchFoodPage(cardName),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(0.0, 1.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween =
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}
getImageOfMeal() {
if (widget.eatingMealName.toLowerCase() == dotenv.env['BREAKFAST_FIELD']!.toLowerCase()) {
return const Image(image: AssetImage('assets/images/tea.png'));
} else if (widget.eatingMealName.toLowerCase() == dotenv.env['LUNCH_FIELD']!.toLowerCase()) {
return const Image(image: AssetImage('assets/images/fries.png'));
} else if (widget.eatingMealName.toLowerCase() == dotenv.env['DINNER_FIELD']!.toLowerCase()) {
return const Image(image: AssetImage('assets/images/ice.png'));
}
}
String capitalize(String s) => s[0].toUpperCase() + s.substring(1);
String listFoodAsString() {
String mealAsString = "";
for (final food in widget.selectedMeal) {
mealAsString = "${food.name} ";
}
return mealAsString;
}
Widget getElevatedButton() {
if(widget.addButtonVisible){
return ElevatedButton(
onPressed: () async {
Navigator.of(context).push(createRoute(widget.eatingMealName));
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
padding: const EdgeInsets.all(0),
),
child: const Text(
'+',
style: TextStyle(fontSize: 28),
),
);
}else{
return const SizedBox.shrink();
}
}
int getCountedCalories() {
double calories = 0;
for (Food food in widget.selectedMeal) {
if (food.calories is int){
calories += food.calories as int;
}else if(food.calories is double){
calories += food.calories as double;
}
}
return calories.round();
}
Map<String,List<int>> getMapOfDistinctElementsWithCounterAndCalories(List<Food> foods){
Map<String,List<int>> resultMap = <String,List<int>>{};
for(int i = 0; i < foods.length;i++){
if(!resultMap.keys.contains(foods[i].name)){
resultMap.putIfAbsent(foods[i].name, () => [1,foods[i].calories]);
}else{
resultMap[foods[i].name]![0] = resultMap[foods[i].name]![0] + 1;
}
}
return resultMap;
}
String getFoodListStringByFood(String foodName, int count, int calories){
int maxWidth = 35;
String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... $count x $calories kcal" : "$foodName $count x $calories kcal";
return limitedText;
}
@override
Widget build(BuildContext context) {
return Card(
margin: const EdgeInsets.fromLTRB(0, 24, 0, 0),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
getImageOfMeal(),
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: Text(
capitalize(widget.eatingMealName),
maxLines: 1,
overflow: TextOverflow.ellipsis,
softWrap: false,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.w500,
fontSize: 14),
),
),
],
)
],
),
getElevatedButton(),
],
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.8,
child:ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: getMapOfDistinctElementsWithCounterAndCalories(widget.selectedMeal).keys.length,
itemBuilder: (context, i) {
Map<String,List<int>> map = getMapOfDistinctElementsWithCounterAndCalories(widget.selectedMeal);
String foodName = map.keys.elementAt(i);
List<int> values = map.values.elementAt(i);
return Text(
getFoodListStringByFood(foodName, values[0], values[1])
);
}
),
),
widget.selectedMeal.isNotEmpty
? const Divider()
: const SizedBox.shrink(),
widget.selectedMeal.isNotEmpty
? Text("${getCountedCalories()} kcal")
: const SizedBox.shrink(),
],
));
}
}

View File

@ -1,21 +0,0 @@
import 'package:flutter/material.dart';
import 'package:percent_indicator/circular_percent_indicator.dart';
class CircularLoadingComponent extends StatelessWidget {
final int eatenCalories;
const CircularLoadingComponent(this.eatenCalories, {Key? key}) : super(key: key);
final int targetCaolries = 3500; // TODO get from user data
@override
Widget build(BuildContext context) {
double progress = double.parse((eatenCalories/targetCaolries).toStringAsFixed(1));
return CircularPercentIndicator(
animation: true,
radius: 60.0,
lineWidth: 5.0,
percent: progress,
center: Text("${progress*100} %"),
progressColor: Colors.lightGreen,
);
}
}

View File

@ -1,74 +0,0 @@
import 'package:flutter/material.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
class DietChatComponent extends StatefulWidget {
final double fatPercentPerThousandCalorie = 3.7;
final double proteinPercentPerThousandCalorie = 4.5;
final double carbsPercentPerThousandCalorie = 12.8;
final String carbs = "Kohlenhydrate";
final String protein = "Protein";
final String fat = "Fett";
late String fatGramm, carbGramm, proteinGramm = "";
late double fatSummary, carbSummary, proteinSummary = 0.0;
DietChatComponent(int calorienSummary, {super.key, int calorienLeft = 0}){
fatSummary = (calorienSummary / 100) * fatPercentPerThousandCalorie;
carbSummary = (calorienSummary / 100) * carbsPercentPerThousandCalorie;
proteinSummary = (calorienSummary / 100) * proteinPercentPerThousandCalorie;
fatGramm = '0 / $fatSummary g';
carbGramm = '0 / $carbSummary g';
proteinGramm = '0 / $proteinSummary g';
}
@override
State<DietChatComponent> createState() => _DietChatComponentState();
}
class _DietChatComponentState extends State<DietChatComponent> {
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Text(widget.carbs),
LinearPercentIndicator(
width: 100.0,
lineHeight: 8.0,
percent: 0.9,
progressColor: Colors.blue,
),
Text(widget.carbGramm)
],
),
Column(
children: [
Text(widget.protein),
LinearPercentIndicator(
width: 100.0,
lineHeight: 8.0,
percent: 0.9,
progressColor: Colors.blue,
),
Text(widget.proteinGramm)
],
),
Column(
children: [
Text(widget.fat),
LinearPercentIndicator(
width: 100.0,
lineHeight: 8.0,
percent: 0.9,
progressColor: Colors.blue,
),
Text(widget.fatGramm)
],
)
],
);
}
}

View File

@ -1,35 +0,0 @@
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:flutter/cupertino.dart';
import 'package:hive_flutter/adapters.dart';
import 'card_component.dart';
class FoodComponent extends StatelessWidget {
final Box box;
const FoodComponent({super.key, required this.box});
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: box.listenable(),
builder: (context, box, widget) {
return ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: box.keys.length,
itemBuilder: (context, i) {
if (box.keyAt(i).toString() == "DATE") {
return const SizedBox.shrink();
} else {
return CardComponent(
eatingMealName: box.keyAt(i).toString(),
selectedMeal: castDynamicToListFood(box.getAt(i)),
addButtonVisible: box.name != 'statistics_reduced',
);
}
});
});
}
}

View File

@ -1,103 +0,0 @@
import 'package:assorted_layout_widgets/assorted_layout_widgets.dart';
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:ernaehrung/android/config/statistics.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive/hive.dart';
import '../models/food.dart';
class SearchedFoodComponent extends StatefulWidget {
final Food food;
final String cardName;
const SearchedFoodComponent(this.food, this.cardName, {Key? key}) : super(key: key);
@override
State<SearchedFoodComponent> createState() => _SearchFoodComponentState();
}
class _SearchFoodComponentState extends State<SearchedFoodComponent> {
StatisticsService statisticsService = StatisticsService();
void storeFood() async {
statisticsService.addItemToMainBox(widget.food, widget.cardName);
final todayBox = Hive.box(dotenv.env['TODAY_BOX']!);
if (!todayBox.isOpen){
Hive.openBox(dotenv.env['TODAY_BOX']!);
}
addValuesToList(todayBox, widget.cardName, [widget.food]);
}
void addValuesToList(box, String key, List<Food> newValues){
List<Food> existingList = castDynamicToListFood(box.get(key));
for(int i = 0; i < newValues.length;i++){
if(!existingList.contains(newValues[i])){
existingList.add(newValues[i]);
}
}
box.put(key, existingList);
}
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
decoration:
const BoxDecoration(color: Color.fromARGB(234, 234, 123, 5)),
child: WrapSuper(
spacing: 32,
wrapType: WrapType.balanced,
wrapFit: WrapFit.larger,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: Text(
widget.food.name,
maxLines: 1,
overflow: TextOverflow.ellipsis,
softWrap: false,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20.0),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: Text(
"${widget.food.fatg} 100g "
"${widget.food.calories} 100g "
"${widget.food.carbohydrateg.toString()} 100g",
maxLines: 1,
overflow: TextOverflow.ellipsis,
softWrap: false,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20.0),
),
),
],
),
ElevatedButton(
onPressed: () async {
storeFood();
},
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: Colors.green,
shadowColor: Colors.greenAccent,
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(32.0)),
maximumSize: Size(
MediaQuery.of(context).size.width * 0.2, 36), //////// HERE
),
child: const Text('+'),
)
],
));
}
}

View File

@ -1,19 +0,0 @@
import 'package:flutter/material.dart';
class SecondaryBigTextComponent extends StatelessWidget {
final String title;
const SecondaryBigTextComponent(this.title, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text(
title.toString(),
style: const TextStyle(
color: Colors.black,
fontSize: 30,
fontWeight: FontWeight.w600),
textAlign: TextAlign.left,
);
}
}

View File

@ -1,19 +0,0 @@
import 'package:flutter/material.dart';
class SecondaryTextComponent extends StatelessWidget {
final String title;
const SecondaryTextComponent(this.title, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text(
title.toString(),
style: TextStyle(
color: Colors.grey.shade500,
fontSize: 14,
fontWeight: FontWeight.w500),
textAlign: TextAlign.left,
);
}
}

View File

@ -1,51 +0,0 @@
import 'package:ernaehrung/android/components/circular/circular_component.dart';
import 'package:ernaehrung/android/components/circular/line_circular_with_text_component.dart';
import 'package:ernaehrung/android/config/statistics.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class StatisticsPercentage extends StatelessWidget {
final double heightStatisticsContainer = 220.0;
final double widthStatisticsContainer = double.infinity;
const StatisticsPercentage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
StatisticsService statisticsService = StatisticsService();
return Container(
decoration:
BoxDecoration(border: Border.all(width: 2.0, color: Colors.black)),
height: heightStatisticsContainer,
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: SizedBox(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
child: FittedBox(
child: CircularLoadingComponent(statisticsService.getAllEatenCaloriesForTodayStatistics()),
),
),
),
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
LineCircularWiTextComponent(
Colors.green.shade400, 1.0, 1000, 2000, "Konsumiert"),
LineCircularWiTextComponent(
Colors.green.shade400, 1.0, 1000, 2000, "Konsumiert"),
LineCircularWiTextComponent(
Colors.green.shade400, 1.0, 1000, 2000, "Konsumiert"),
],
),
)
],
),
);
}
}

View File

@ -1,20 +0,0 @@
import 'package:empty_widget/empty_widget.dart';
import 'package:flutter/cupertino.dart';
class NotFoundComponent extends StatelessWidget {
const NotFoundComponent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return EmptyWidget(
image: null,
packageImage: PackageImage.Image_1,
title: 'Gericht existiert nicht',
titleTextStyle: const TextStyle(
fontSize: 18,
color: Color(0xff9da9c7),
fontWeight: FontWeight.w500,
),
);
}
}

View File

@ -1,70 +0,0 @@
import 'package:empty_widget/empty_widget.dart';
import 'package:flutter/material.dart';
import '../models/food.dart';
import 'founded_search_component.dart';
class SearchComponent extends StatefulWidget {
final List<Food> foods;
final String cardName;
const SearchComponent(this.foods, this.cardName, {super.key});
@override
State<SearchComponent> createState() => _SearchComponentState();
}
class _SearchComponentState extends State<SearchComponent> {
final TextEditingController controller = TextEditingController();
late List<Food> allFoods = widget.foods;
List<Food> foundedFood = [];
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
constraints: const BoxConstraints.expand(),
child: Padding(
padding: const EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Column(
children: [
TextField(
controller: controller,
decoration: InputDecoration(
prefix: const Icon(Icons.search),
hintText: 'Suche nach Gericht',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.blue))),
onChanged: findOnChanged,
),
Expanded(
child: controller.text.isNotEmpty && foundedFood.isNotEmpty
? ListView.builder(
itemCount: foundedFood.length,
itemBuilder: (context, index) {
final food = foundedFood[index];
return SearchedFoodComponent(food, widget.cardName);
})
: EmptyWidget())
],
)));
}
void findOnChanged(String searchedFood) async {
foundedFood.clear();
if(searchedFood.isEmpty){
setState(() {});
return;
}else{
for (final food in allFoods) {
if (food.name.toString().toLowerCase().contains(searchedFood)) {
foundedFood.add(food);
}
}
setState(() => {foundedFood});
}
}
}

View File

@ -1,27 +0,0 @@
import 'package:ernaehrung/android/components/circular/circular_component.dart';
import 'package:flutter/material.dart';
class StatisticsPercentComponent extends StatelessWidget {
late int eaten, calorienBurned, calorienLeft, calorienLeftPercent;
StatisticsPercentComponent(this.eaten, this.calorienBurned, this.calorienLeft, {super.key});
int get getEaten => eaten;
get getCalorienBurned => calorienBurned;
get getCalorienLeft => calorienLeft;
get getCalorienLeftPercent => calorienLeftPercent;
@override
Widget build(BuildContext context) {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("$eaten gegessen"),
CircularLoadingComponent(eaten),
Text("$calorienBurned verbrannt"),
],
);
}
}

View File

@ -1,192 +0,0 @@
import 'package:ernaehrung/android/pages/nav_pages/main_page.dart';
import 'package:flutter/material.dart';
class WelcomePageStateTextFieldState extends StatefulWidget {
const WelcomePageStateTextFieldState({super.key});
@override
State<WelcomePageStateTextFieldState> createState() =>
_WelcomePageStateTextFieldState();
}
class _WelcomePageStateTextFieldState
extends State<WelcomePageStateTextFieldState> {
final firstnameTextEditingController = TextEditingController();
final secondnameTextEditingController = TextEditingController();
final weightTextEditingController = TextEditingController();
final heightTextEditingController = TextEditingController();
final caloriesTextEditingController = TextEditingController();
bool isNameVisible = false;
bool isSNameVisible = false;
bool isWeightVisible = false;
bool isHeightVisible = false;
bool isCaloriesVisible = false;
void setNameVisible(bool visibility) {
setState(() => isNameVisible = visibility);
}
void setSNameVisible(bool visibility) {
setState(() => isSNameVisible = visibility);
}
void setWeightVisible(bool visibility) {
setState(() => isWeightVisible = visibility);
}
void setHeightVisible(bool visibility) {
setState(() => isHeightVisible = visibility);
}
void setCaloriesVisible(bool visibility) {
setState(() => isCaloriesVisible = visibility);
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(
height: 24,
),
TextFormField(
onChanged: (newText) {
if (newText.isNotEmpty) {
setNameVisible(true);
} else {
setNameVisible(false);
}
},
controller: firstnameTextEditingController,
decoration: InputDecoration(
hintText: 'Name',
border: const OutlineInputBorder(gapPadding: 8),
suffixIcon: isNameVisible
? IconButton(
onPressed: () {
firstnameTextEditingController.clear();
setState(() => isNameVisible = false);
},
icon: const Icon(Icons.clear))
: null,
),
keyboardType: TextInputType.text,
),
const SizedBox(
height: 24,
),
TextFormField(
onChanged: (newText) {
if (newText.isNotEmpty) {
setSNameVisible(true);
} else {
setSNameVisible(false);
}
},
controller: secondnameTextEditingController,
decoration: InputDecoration(
hintText: 'Vorname',
border: const OutlineInputBorder(gapPadding: 8),
suffixIcon: isSNameVisible
? IconButton(
onPressed: () {
secondnameTextEditingController.clear();
setState(() => isSNameVisible = false);
},
icon: const Icon(Icons.clear))
: null,
),
keyboardType: TextInputType.text),
const SizedBox(
height: 24,
),
TextFormField(
onChanged: (newText) {
if (newText.isNotEmpty) {
setWeightVisible(true);
} else {
setWeightVisible(false);
}
},
controller: weightTextEditingController,
decoration: InputDecoration(
hintText: 'Gewicht',
border: const OutlineInputBorder(gapPadding: 8),
suffixIcon: isWeightVisible
? IconButton(
onPressed: () {
weightTextEditingController.clear();
setState(() => isWeightVisible = false);
},
icon: const Icon(Icons.clear))
: null,
),
keyboardType: TextInputType.number),
const SizedBox(
height: 24,
),
TextFormField(
onChanged: (newText) {
if (newText.isNotEmpty) {
setHeightVisible(true);
} else {
setHeightVisible(false);
}
},
controller: heightTextEditingController,
decoration: InputDecoration(
hintText: 'Größe',
border: const OutlineInputBorder(gapPadding: 8),
suffixIcon: isHeightVisible
? IconButton(
onPressed: () {
heightTextEditingController.clear();
setState(() => isHeightVisible = false);
},
icon: const Icon(Icons.clear))
: null,
),
keyboardType: TextInputType.number),
const SizedBox(
height: 24,
),
TextFormField(
onChanged: (newText) {
if (newText.isNotEmpty) {
setCaloriesVisible(true);
} else {
setCaloriesVisible(false);
}
},
controller: caloriesTextEditingController,
decoration: InputDecoration(
hintText: 'gewünschte Kalorienzufuhr',
border: const OutlineInputBorder(gapPadding: 8),
suffixIcon: isCaloriesVisible
? IconButton(
onPressed: () {
caloriesTextEditingController.clear();
setState(() => isCaloriesVisible = false);
},
icon: const Icon(Icons.clear))
: null,
),
keyboardType: TextInputType.number),
const SizedBox(
height: 24,
),
ElevatedButton(
onPressed: () {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) => const MainPage()),
(r) => false);
},
child: const Text('Bestätigen'))
],
);
}
}

View File

@ -1,217 +0,0 @@
import 'dart:math';
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:hive/hive.dart';
import '../models/food.dart';
class StatisticsService {
final String reducedStatisticsBoxName = 'STATISTICS_REDUCED';
final String mainStatisticsBoxName = 'STATISTICS_MAIN';
StatisticsService() {
initBoxes();
}
initBoxes()async{
Box reducedBox = Hive.box(reducedStatisticsBoxName);
putIfKeyNotExists(reducedBox, 'FRÜHSTÜCK', []);
putIfKeyNotExists(reducedBox, 'MITTAGESSEN', []);
putIfKeyNotExists(reducedBox, 'ABENDESSEN', []);
updateReducedBoxByTimespan(TimeSpan.day);
}
void putIfKeyNotExists(Box box, String key, dynamic value) {
if (!box.containsKey(key)) {
box.put(key, value);
}
}
updateReducedBoxByTimespan(TimeSpan timeSpan){
clearReducedBoxBeforeUpdate();
DateTime now = DateTime.now();
int timestamp = now.millisecondsSinceEpoch.toInt() ~/ 1000;
switch(timeSpan){
case TimeSpan.day:
getNewFoodAndUpdateReducedBoxByTimestamp(timestamp);
break;
case TimeSpan.week:
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
for(int i = 0;i < currentWeek.length;i++){
getNewFoodAndUpdateReducedBoxByTimestamp(currentWeek[i]);
}
break;
case TimeSpan.month:
List<int> currentMonth = getTimestampsByTimestampAndTimespan(TimeSpan.month,timestamp);
for(int i = 0;i < currentMonth.length;i++){
getNewFoodAndUpdateReducedBoxByTimestamp(currentMonth[i]);
}
break;
}
}
void getNewFoodAndUpdateReducedBoxByTimestamp(int timestamp){
Map<String,List<Food>> newFood = getFoodMapForGivenTimestampFromMainBox(timestamp);
if(newFood.keys.isNotEmpty){
setElementsOfReducedBox(newFood);
}
}
List<int> getTimestampsByTimestampAndTimespan(TimeSpan timespan, int timestamp) {
int range = timespan == TimeSpan.week ? 7 : 31;
int targetWeekday = DateTime.monday; // Example target weekday (Monday)
DateTime currentDateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
int currentWeekday = currentDateTime.weekday;
int daysToAdd = targetWeekday - currentWeekday;
DateTime targetDateTime = currentDateTime.add(Duration(days: daysToAdd));
List<int> timestampsForWeekdays = [];
for (int i = 0; i < range; i++) {
timestampsForWeekdays.add(targetDateTime.millisecondsSinceEpoch ~/ 1000);
targetDateTime = targetDateTime.add(const Duration(days: 1));
}
return timestampsForWeekdays;
}
clearReducedBoxBeforeUpdate(){
Box box = Hive.box(reducedStatisticsBoxName);
for(int i = 0; i < box.keys.length;i++){
box.put(box.keys.elementAt(i), []);
}
}
setElementsOfReducedBox(Map<String,List<Food>> newFood){
Box box = Hive.box(reducedStatisticsBoxName);
Iterable<String> keys = newFood.keys;
for(int i = 0; i < keys.length;i++){
box.put(keys.elementAt(i), newFood[keys.elementAt(i)] ?? []);
}
}
getDayAsIntFromTimestamp(int timestamp){
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
return dateTime.day;
}
Map<String,List<Food>> getFoodMapForGivenTimestampFromMainBox(int timestamp){
Box box = Hive.box(mainStatisticsBoxName);
dynamic matchingTimestamp = getMatchingTimeStamp(box, timestamp);
if(matchingTimestamp != null){
return castDynamicMap(box.get(matchingTimestamp));
}
return <String,List<Food>>{};
}
getMatchingTimeStamp(Box box,int newTimestamp){
if(box.keys.isNotEmpty){
for(int i = 0; i < box.keys.length;i++){
int timestamp = box.keys.elementAt(i);
if(isDateEqual(newTimestamp, timestamp)){
return timestamp;
}
}
return null;
}
}
getMonthAsIntFromTimestamp(int timestamp){
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
return dateTime.month;
}
getYearAsIntFromTimestamp(int timestamp){
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
return dateTime.year;
}
isDateEqual(int timestamp1, int timestamp2){
return
getDayAsIntFromTimestamp(timestamp1) == getDayAsIntFromTimestamp(timestamp2) &&
getMonthAsIntFromTimestamp(timestamp1) == getMonthAsIntFromTimestamp(timestamp2) &&
getYearAsIntFromTimestamp(timestamp1) == getYearAsIntFromTimestamp(timestamp2);
}
addItemToMainBox(Food value, String mealType){
// Hive.deleteFromDisk();
Box box = Hive.box(mainStatisticsBoxName);
DateTime dateTime = DateTime.now();
// DEBUG
//DateTime dateTime = getRandomTimestampForTesting();
int newTimestamp = dateTime.millisecondsSinceEpoch.toInt() ~/ 1000;
dynamic matchingTimestamp = getMatchingTimeStamp(box, newTimestamp);
if(matchingTimestamp != null){
newTimestamp = matchingTimestamp;
}
Map<String, List<Food>> valueMap = castDynamicMap(box.get(newTimestamp));
List<Food> values = [];
if(valueMap.containsKey(mealType)){
values = valueMap[mealType]!;
}
values.add(value);
valueMap[mealType] = values;
box.put(newTimestamp, valueMap);
}
getRandomTimestampForTesting(){
DateTime now = DateTime.now();
DateTime startOfWeek = now.subtract(Duration(days: now.weekday - 1));
DateTime endOfWeek = startOfWeek.add(const Duration(days: 6));
Random random = Random();
int randomMilliseconds = random.nextInt(endOfWeek.millisecondsSinceEpoch - startOfWeek.millisecondsSinceEpoch);
DateTime randomTimestamp = startOfWeek.add(Duration(milliseconds: randomMilliseconds));
return randomTimestamp;
}
int getAllEatenCaloriesForTodayStatistics(){
Box box = Hive.box(reducedStatisticsBoxName);
num sum = 0;
for(int i = 0; i < box.keys.length;i++){
for(Food food in box.get(box.keys.elementAt(i))){
sum += food.calories;
}
}
return sum as int;
}
num getAllCaloriesByBoxAndTimestamp(Box box,int timestamp){
Map<String, List<Food>> valueMap = castDynamicMap(box.get(timestamp));
num sum = 0;
for(var mealType in valueMap.keys){
if(valueMap.containsKey(mealType)){
List<Food> values = valueMap[mealType]!;
for(var value in values){
sum += value.calories;
}
}
}
return sum;
}
num getCaloriesByTimestampAndMealTypeAndBox(Box box,DateTime date, String mealType){
int timestamp = date.millisecondsSinceEpoch.toInt() ~/ 1000;
Map<String, List<Food>> valueMap = castDynamicMap(box.get(timestamp));
num sum = 0;
if(valueMap.containsKey(mealType)){
List<Food> values = valueMap[mealType]!;
for(var value in values){
sum += value.calories;
}
}
return sum;
}
showItems(){
print("Statistics.dart - showItems() - ITEMS");
//Hive.box(boxName).clear();
print(Hive.box(mainStatisticsBoxName).keys.length);
for(int i = 0; i < Hive.box(mainStatisticsBoxName).keys.length; i++){
print(Hive.box(mainStatisticsBoxName).keys.elementAt(i));
print(Hive.box(mainStatisticsBoxName).values.elementAt(i));
//print(Hive.box(boxName).keys.elementAt(i) + " " + Hive.box(boxName).values.elementAt(i));
}
}
}

View File

@ -1,57 +0,0 @@
import 'package:ernaehrung/android/pages/nav_pages/progress_page.dart';
import 'package:ernaehrung/android/pages/nav_pages/today_page.dart';
import 'package:flutter/material.dart';
import 'meal_plan_page.dart';
class MainPage extends StatefulWidget {
const MainPage({Key? key}) : super(key: key);
@override
MainPageState createState() => MainPageState();
}
class MainPageState extends State<MainPage> {
List pages = [
const TodayPage(title: 'Today'),
const MealPlanPage(title: 'Meal Plan'),
const ProgressPage(title: 'Progress')
];
int currentIndex = 0;
void onTap(int index) {
setState(() {
currentIndex = index;
pages[currentIndex];
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(pages[currentIndex].title),
backgroundColor: Colors.grey.shade100,
),
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
child: pages[currentIndex],
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: currentIndex,
selectedItemColor: Colors.black54,
unselectedItemColor: Colors.grey.withOpacity(0.5),
showSelectedLabels: false,
showUnselectedLabels: false,
elevation: 0,
onTap: onTap,
items: const [
BottomNavigationBarItem(icon: Icon(Icons.today), label: 'Today'),
BottomNavigationBarItem(
icon: Icon(Icons.area_chart), label: 'Progress'),
BottomNavigationBarItem(icon: Icon(Icons.apple), label: 'Meal Plan'),
],
),
);
}
}

View File

@ -1,41 +0,0 @@
import 'package:ernaehrung/android/components/MealPageFoodComponent.dart';
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
import 'package:ernaehrung/android/components/meal_page_text/statistics_today_component.dart';
import 'package:flutter/material.dart';
class MealPlanPage extends StatefulWidget {
final String title;
final Color backgroundColor = const Color(0xff47a44b);
const MealPlanPage({Key? key, required this.title}) : super(key: key);
String get getTitle => title;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return getTitle;
}
@override
State<StatefulWidget> createState() => _MealPlanState();
}
class _MealPlanState extends State<MealPlanPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
margin: const EdgeInsets.all(8),
width: double.infinity,
height: double.infinity,
child: SingleChildScrollView(
child: Column(
children: const [
DaysMealPageComponent(),
StatisticsPercentage(),
MealPageStatisticsFoodComponent(),
],
),
)));
}
}

View File

@ -1,304 +0,0 @@
import 'package:ernaehrung/android/components/meal_page_text/secondary_big_text_component.dart';
import 'package:ernaehrung/android/components/meal_page_text/secondary_text_component.dart';
import 'package:ernaehrung/android/components/meal_page_text/title_component.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
class ProgressPage extends StatelessWidget {
final String title;
final Color backgroundColor = const Color(0xff47a44b);
const ProgressPage({Key? key, required this.title}) : super(key: key);
String get getTitle => title;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return getTitle;
}
/*
* TODO: in versch. Dateien auslagern, damit der Code nicht voll gemüllt wird
* */
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 8),
child: Column(
children: [
Container(
height: 284,
decoration: BoxDecoration(
border: Border.all(),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const TitleComponent("Kalorien"),
const SizedBox(
height: 16,
),
const SecondaryTextComponent("Durchschnittlich"),
SecondaryBigTextComponent(1235.toString()),
SizedBox(
height: 200,
child: BarChart(
BarChartData(
barTouchData: barTouchData,
titlesData: titlesData,
borderData: borderData,
barGroups: barGroups,
gridData: FlGridData(show: false),
alignment: BarChartAlignment.spaceAround,
maxY: 200,
),
),
)
],
),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 16, horizontal: 0),
child: Column(
//TODO: Aussortieren und mit einer Schleife drüber gehen
//bzw. die Daten aus der Hivebox ziehen und sortieren
children: [
const TitleComponent(
"Lebensmittel mit dem höchsten Kaloriengehalt"),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
),
const SizedBox(height: 24,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: const [
SecondaryTextComponent("Haferflocker"),
SecondaryTextComponent("670 Kalorien"),
],
)
],
),
)
],
),
),
),
);
}
BarTouchData get barTouchData => BarTouchData(
enabled: false,
touchTooltipData: BarTouchTooltipData(
tooltipBgColor: Colors.transparent,
tooltipPadding: EdgeInsets.zero,
tooltipMargin: 4,
getTooltipItem: (
BarChartGroupData group,
int groupIndex,
BarChartRodData rod,
int rodIndex,
) {
return BarTooltipItem(
rod.toY.round().toString(),
const TextStyle(
color: Colors.orange,
fontWeight: FontWeight.bold,
),
);
},
),
);
Widget getTitles(double value, TitleMeta meta) {
const style = TextStyle(
color: Colors.red,
fontWeight: FontWeight.bold,
fontSize: 14,
);
String text;
switch (value.toInt()) {
case 0:
text = 'Mn';
break;
case 1:
text = 'Te';
break;
case 2:
text = 'Wd';
break;
case 3:
text = 'Tu';
break;
case 4:
text = 'Fr';
break;
case 5:
text = 'St';
break;
case 6:
text = 'Sn';
break;
default:
text = '';
break;
}
return SideTitleWidget(
axisSide: meta.axisSide,
space: 4,
child: Text(text, style: style),
);
}
FlTitlesData get titlesData => FlTitlesData(
show: true,
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
reservedSize: 30,
getTitlesWidget: getTitles,
),
),
leftTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
topTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
rightTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
);
FlBorderData get borderData => FlBorderData(
show: false,
);
LinearGradient get _barsGradient => const LinearGradient(
colors: [
Colors.cyan,
Colors.deepPurple,
],
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
);
List<BarChartGroupData> get barGroups => [
BarChartGroupData(
x: 0,
barRods: [
BarChartRodData(
toY: 8,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 1,
barRods: [
BarChartRodData(
toY: 10,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 2,
barRods: [
BarChartRodData(
toY: 14,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 3,
barRods: [
BarChartRodData(
toY: 150,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 4,
barRods: [
BarChartRodData(
toY: 13,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 5,
barRods: [
BarChartRodData(
toY: 10,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 6,
barRods: [
BarChartRodData(
toY: 16,
gradient: _barsGradient,
)
],
showingTooltipIndicators: [0],
),
];
}

View File

@ -1,40 +0,0 @@
import 'package:basic_utils/basic_utils.dart';
import 'package:ernaehrung/android/components/card/card_component.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/adapters.dart';
class TodayPage extends StatefulWidget {
final String title;
final Color backgroundColor = const Color(0xff47a44b);
const TodayPage({Key? key, required this.title}) : super(key: key);
@override
State<TodayPage> createState() => _TodayPageState();
}
class _TodayPageState extends State<TodayPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: ValueListenableBuilder(
valueListenable: Hive.box("TODAY").listenable(),
builder: (context, box, widget) {
return ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: box.keys.length,
itemBuilder: (context, i) {
if (box.keyAt(i).toString() == "DATE") {
return const SizedBox.shrink();
} else {
return CardComponent(
StringUtils.capitalize(box.keyAt(i).toString()),
box.getAt(i)
);
}
});
})));
}
}

View File

@ -1,208 +0,0 @@
import 'package:ernaehrung/android/pages/nav_pages/main_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:hive_flutter/hive_flutter.dart';
import '../models/user.dart';
class OnboardingPage extends StatefulWidget {
const OnboardingPage({Key? key}) : super(key: key);
@override
State<OnboardingPage> createState() => _OnboardingPageState();
}
class _OnboardingPageState extends State<OnboardingPage> {
InputDecoration decoration(String hintText) {
return InputDecoration(
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(10.0))),
filled: true,
hintStyle: TextStyle(color: Colors.grey.shade400),
hintText: hintText,
labelText: hintText,
fillColor: Colors.white70);
}
@override
Widget build(BuildContext context) {
final _formKey = GlobalKey<FormBuilderState>();
return Scaffold(
appBar: AppBar(
title: const Text("Welcome"),
backgroundColor: Colors.grey.shade100,
),
body: FormBuilder(
key: _formKey,
child: Padding(
padding: const EdgeInsets.all(8),
child: SingleChildScrollView(
child: Column(
children: [
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: FormBuilderTextField(
name: 'vorname',
decoration: decoration("Vorname"),
keyboardType: TextInputType.text,
maxLength: 30,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.minLength(2,
errorText:
"Die Name sollte mindestens 2 Zeichen lang sein"),
FormBuilderValidators.maxLength(30,
errorText:
"Die Name sollte maximal 30 Zeichen lang sein")
]),
),
),
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: FormBuilderTextField(
name: 'nachname',
decoration: decoration("Nachname"),
keyboardType: TextInputType.text,
maxLength: 30,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.minLength(2,
errorText:
"Die Nachname sollte mindestens 2 Zeichen lang sein"),
FormBuilderValidators.maxLength(30,
errorText:
"Die Nachname sollte maximal 30 Zeichen lang sein")
]),
),
),
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: FormBuilderTextField(
name: 'gewicht',
decoration: decoration("Gewicht"),
keyboardType: TextInputType.number,
maxLength: 7,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.numeric(
errorText:
"Der Gewicht sollte mindestens 10 kg sein"),
FormBuilderValidators.max(200,
errorText:
"Der Gewicht sollte maximal 200 kg sein"),
FormBuilderValidators.min(10,
errorText:
"Der Gewicht sollte mindestens 10 kg sein")
]),
),
),
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: FormBuilderTextField(
name: 'groesse',
decoration: decoration("Größe"),
keyboardType: TextInputType.number,
maxLength: 7,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.numeric(
errorText: "Die Größe sollte mindestens 60cm sein"),
FormBuilderValidators.max(230,
errorText: "Die Größe sollte maximal 230cm sein"),
FormBuilderValidators.min(60,
errorText: "Die Größe sollte mindestens 60cm sein")
]),
),
),
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: FormBuilderTextField(
name: 'alter',
decoration: decoration("Alter"),
keyboardType: TextInputType.number,
maxLength: 7,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.numeric(
errorText:
"Das Alter sollte mindestens 6 Jahre alt sein"),
FormBuilderValidators.max(99,
errorText:
"Das Alter sollte maximal 99 Jahre alt sein"),
FormBuilderValidators.min(6,
errorText:
"Das Alter sollte mindestens 6 Jahre alt sein")
]),
),
),
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: FormBuilderTextField(
name: 'kalorien',
decoration:
decoration("gewünschte Kalorienzufuhr: min. 1000"),
keyboardType: TextInputType.number,
maxLength: 7,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.numeric(
errorText:
"Die Kalorienanzahl sollte mindestens 1000 Kcal sein"),
FormBuilderValidators.max(30000),
FormBuilderValidators.min(1000,
errorText:
"Die Kalorienanzahl sollte mindestens 1000 Kcal sein")
]),
),
),
Container(
margin: const EdgeInsets.symmetric(
vertical: 8, horizontal: 0),
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(40), //
backgroundColor: const Color(0xFF6E7BFB),
foregroundColor: const Color(0xFFffffff),
shape: const StadiumBorder(),
),
onPressed: () {
final Box box = Hive.box<User>("USER_BOX");
box.put("USER", User(
_formKey.currentState?.fields['vorname']?.value,
_formKey.currentState?.fields['nachname']?.value,
int.parse(_formKey.currentState?.fields['gewicht']?.value),
int.parse(_formKey.currentState?.fields['groesse']?.value),
int.parse(_formKey.currentState?.fields['alter']?.value),
int.parse(_formKey.currentState?.fields['kalorien']?.value)
));
print(box.get("USER"));
Navigator
.of(context)
.pushReplacement(MaterialPageRoute(builder: (BuildContext context) => const MainPage()));
},
child: const Text("Eingaben bestätigen"),
)),
],
),
),
)),
);
}
}

View File

@ -1,8 +1,8 @@
import 'package:ernaehrung/android/pages/nav_pages/main_page.dart'; import 'package:ernaehrung/pages/nav_pages/main_page.dart';
import 'package:ernaehrung/android/pages/welcome.dart'; import 'package:ernaehrung/pages/user_data_form/initial_user_data_form.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'models/user.dart'; import 'models/user.dart';
class AndroidApp extends StatelessWidget { class AndroidApp extends StatelessWidget {
@ -10,12 +10,12 @@ class AndroidApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final box = Hive.box<User>('USER_BOX'); final box = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
print("got it ${box.get("USER")}");
return MaterialApp( return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo', title: 'Flutter Demo',
theme: ThemeData( theme: ThemeData(
scaffoldBackgroundColor: Colors.grey.shade100, //<-- SEE scaffoldBackgroundColor: Colors.grey.shade200, //<-- SEE
), ),
home: box.get("USER") == null ? const OnboardingPage() : const MainPage(), home: box.get("USER") == null ? const OnboardingPage() : const MainPage(),
routes: { routes: {

View File

@ -1,11 +0,0 @@
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive/hive.dart';
void storeUserData(String sname, String fname, int weight, int height, int calories) async {
final userBox = Hive.box(dotenv.env['USER_BOX']!);
userBox.put(dotenv.env['FIRST_NAME_FIELD']!, sname);
userBox.put(dotenv.env['SECOND_NAME_FIELD']!, fname);
userBox.put(dotenv.env['WEIGHT_FIELD']!, weight);
userBox.put(dotenv.env['HEIGHT_FIELD']!, height);
userBox.put(dotenv.env['CALORIES_FIELD']!, calories);
}

View File

@ -0,0 +1,59 @@
import 'package:flutter/cupertino.dart';
import '../models/food.dart';
String getFoodListStringByFood(String foodName, int count, int calories, BuildContext? context){
int maxWidth = 35;
if(context != null){
maxWidth = isScreenWidthAbove1000(context) ? 100 : 35;
}
String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... $count x $calories kcal" : "$foodName $count x $calories kcal";
return limitedText;
}
bool isScreenWidthAbove1000(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width;
return screenWidth > 400;
}
String getWeeklyRankingString(String foodName,BuildContext? context){
int maxWidth = 40;
if(context != null){
maxWidth = isScreenWidthAbove1000(context) ? 100 : 40;
}
String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ..." : foodName;
return limitedText;
}
String getToastFoodNameString(Food food,BuildContext? context){
int maxWidth = 25;
if(context != null){
maxWidth = isScreenWidthAbove1000(context) ? 100 : 25;
}
String limitedText = food.name.length > maxWidth ? "${food.name.substring(0, maxWidth - 3)} ..." : food.name;
return limitedText;
}
Map<String,List<int>> getMapOfDistinctElementsWithCounterAndCalories(List<Food> foods){
Map<String,List<int>> resultMap = <String,List<int>>{};
for(int i = 0; i < foods.length;i++){
if(!resultMap.keys.contains(foods[i].name)){
resultMap.putIfAbsent(foods[i].name, () => [1,foods[i].calories]);
}else{
resultMap[foods[i].name]![0] = resultMap[foods[i].name]![0] + 1;
}
}
return resultMap;
}
List<Food> getListOfDistinctElements(List<Food> foods){
List<Food> result = [];
for(int i = 0; i < foods.length;i++){
if(!result.any((element) => element.id == foods[i].id)){
result.add(foods[i]);
}
}
return result;
}

View File

@ -11,7 +11,6 @@ void setupTodayBox() async{
putIfKeyNotExists(todayBox, 'FRÜHSTÜCK', []); putIfKeyNotExists(todayBox, 'FRÜHSTÜCK', []);
putIfKeyNotExists(todayBox, 'MITTAGESSEN', []); putIfKeyNotExists(todayBox, 'MITTAGESSEN', []);
putIfKeyNotExists(todayBox, 'ABENDESSEN', []); putIfKeyNotExists(todayBox, 'ABENDESSEN', []);
} }
@ -20,6 +19,3 @@ void putIfKeyNotExists(Box box, String key, List<Food> value) {
box.put(key, value); box.put(key, value);
} }
} }
String getFormatedTodayDate(){
return DateTime.now().toString().substring(0,10);
}

View File

@ -1,35 +1,28 @@
import 'package:ernaehrung/android/models/food.dart';
import 'package:ernaehrung/android/models/user.dart';
import 'package:ernaehrung/web/web_app.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'android/andoird_app.dart'; import 'app.dart';
import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb; import 'helper/setup_todaybox.dart';
import 'models/food.dart';
import 'models/user.dart';
import 'android/config/setup_todaybox_config.dart';
void main() async { void main() async {
await dotenv.load(fileName: ".env"); await dotenv.load(fileName: ".env");
await Hive.initFlutter(); await Hive.initFlutter();
if (!Hive.isAdapterRegistered(0)) { if (!Hive.isAdapterRegistered(0)) {
Hive.registerAdapter(FoodAdapter()); Hive.registerAdapter(FoodAdapter());
} }
if (!Hive.isAdapterRegistered(1)) { if (!Hive.isAdapterRegistered(1)) {
Hive.registerAdapter(UserAdapter()); Hive.registerAdapter(UserAdapter());
} }
await Hive.openBox(dotenv.env['PROGRESS_BOX'] ?? 'PROGRESS');
await Hive.openBox('STATISTICS_REDUCED'); await Hive.openBox( dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS');
await Hive.openBox('STATISTICS_MAIN'); await Hive.openBox(dotenv.env['MAIN_BOX'] ?? 'MAIN');
await Hive.openBox('TODAY'); await Hive.openBox(dotenv.env['TODAY_BOX'] ?? 'TODAY');
await Hive.openBox<User>('USER_BOX'); await Hive.openBox<User>(dotenv.env['USER_BOX'] ?? 'USER');
setupTodayBox(); setupTodayBox();
//Hive.deleteFromDisk();
runApp(const AndroidApp());
if (defaultTargetPlatform == TargetPlatform.android) {
runApp(const AndroidApp());
} else if (kIsWeb) {
runApp(const WebApp());
}
} }

View File

@ -1,20 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'android/models/card.dart';
List<CardModel> essen = [
CardModel('Haferflocken', 10, 1.1, 1.2),
CardModel('Kekse', 20, 2.2, 2.3),
CardModel('Bier', 30, 3.3, 3.4),
];
Map<Map<Image, String>, List<CardModel>> cards = <Map<Image, String>, List<CardModel>>{
{
const Image(image: AssetImage('assets/images/fries.png')): 'Frühstück'
}: essen,
{
const Image(image: AssetImage('assets/images/ice.png')): 'Mittagessen'
}: essen,
{
const Image(image: AssetImage('assets/images/tea.png')): 'Abendessen'
}: essen
};

View File

@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
class FormTextField{
final String title;
final TextInputType textInputType;
final num? maxLength;
final String? maxLengthErrorMessage;
final String? minLengthErrorMessage;
final num? minLength;
final num? numericMax;
final num? numericMin;
final String? numericMaxErrorMessage;
final String? numericMinErrorMessage;
FormTextField(
this.title,
this.textInputType,
this.maxLength,
this.maxLengthErrorMessage,
this.minLengthErrorMessage,
this.minLength,
this.numericMax,
this.numericMin,
this.numericMaxErrorMessage,
this.numericMinErrorMessage);
}

View File

@ -0,0 +1,100 @@
import 'package:ernaehrung/pages/nav_pages/subpages/statistics_page/statistics_page.dart';
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/today_page.dart';
import 'package:flutter/material.dart';
import '../../services/statistics.dart';
import 'subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
import '../user_data_form/user_data_form.dart';
import 'subpages/progress_page/progress_page.dart';
class MainPage extends StatefulWidget {
const MainPage({Key? key}) : super(key: key);
@override
MainPageState createState() => MainPageState();
}
class MainPageState extends State<MainPage> {
List pages = [
const TodayPage(title: 'Essensplan'),
const ProgressPage(title: 'Gesamtübersicht'),
const StatisticsPage(title: 'Statistiken')
];
int currentIndex = 0;
void onTap(int index) async {
setState(() {
currentIndex = index;
if (currentIndex == 1) {
DataService.instance
.updateStatisticsTodayBoxByTimespan(TimeSpan.day);
} else if (currentIndex == 2) {
DataService.instance.updateProgressBoxValues();
}
pages[currentIndex];
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
extendBodyBehindAppBar: false,
appBar: AppBar(
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
pages[currentIndex].title,
style: const TextStyle(
color: Colors.black
),
),
ElevatedButton(
onPressed: () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SettingsPage()),
);
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.green, // Set the background color to green
),
child: Row(
children: const [
Icon(
Icons.account_circle,
size: 30,
color: Colors.white,
),
],
),
)
],
),
backgroundColor: Colors.transparent,
foregroundColor: Colors.grey.shade400,
elevation: 0,
),
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
child: pages[currentIndex],
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: currentIndex,
selectedItemColor: Colors.black54,
unselectedItemColor: Colors.grey.withOpacity(0.5),
showSelectedLabels: false,
showUnselectedLabels: false,
elevation: 0,
onTap: onTap,
items: const [
BottomNavigationBarItem(icon: Icon(Icons.today), label: 'Today'),
BottomNavigationBarItem(
icon: Icon(Icons.area_chart), label: 'Progress'),
BottomNavigationBarItem(icon: Icon(Icons.apple), label: 'Meal Plan'),
],
),
);
}
}

View File

@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'sub_components/charts/progress_charts_overview.dart';
import 'sub_components/list_view/progress_all_meals_component.dart';
class ProgressPage extends StatefulWidget {
final String title;
final Color backgroundColor = const Color(0xff47a44b);
const ProgressPage({Key? key, required this.title}) : super(key: key);
String get getTitle => title;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return getTitle;
}
@override
State<StatefulWidget> createState() => ProgressState();
}
class ProgressState extends State<ProgressPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: SingleChildScrollView(
child: Column(
children: const [
ProgressChartsOverviewComponent(),
ProgressAllMealsComponent(),
],
),
)));
}
}

View File

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'sub_components/tabs/timespan_tabs.dart';
import 'sub_components/charts/progress_charts.dart';
class ProgressChartsOverviewComponent extends StatelessWidget {
const ProgressChartsOverviewComponent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8))),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 8, horizontal: 16),
child: Column(
children: const [
TimespanTabsComponent(),
ProgressChartsComponent(),
],
),
),
);
}
}

View File

@ -1,18 +1,18 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
class StaticsTextComponent extends StatelessWidget { class HorizontalChartTextComponent extends StatelessWidget {
final String name; final String name;
final bool titleOrSecondary; final bool titleOrSecondary;
const StaticsTextComponent(this.name, this.titleOrSecondary, {super.key}); const HorizontalChartTextComponent(this.name, this.titleOrSecondary, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Text(name, return Text(name,
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: TextStyle( style: TextStyle(
color: const Color.fromARGB(255, 211, 211, 211), color: const Color(0xff000000),
fontSize: titleOrSecondary ? 14 : 10, fontSize: titleOrSecondary ? 15 : 13,
fontWeight: titleOrSecondary ? FontWeight.w600 : FontWeight.w400 fontWeight: titleOrSecondary ? FontWeight.w600 : FontWeight.w400
)); ));
} }

View File

@ -0,0 +1,52 @@
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_circular_chart.dart';
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_horizontal_chart.dart';
import 'package:flutter/material.dart';
import '../../../../../../../../services/statistics.dart';
class ProgressChartsComponent extends StatelessWidget {
final double heightStatisticsContainer = 220.0;
final double widthStatisticsContainer = double.infinity;
const ProgressChartsComponent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ValueListenableBuilder<List<double>>(
valueListenable: DataService.instance.ingredients,
builder: (context, value, child) {
return Container(
height: heightStatisticsContainer,
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: SizedBox(
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 0, horizontal: 8),
child: FittedBox(
child: ProgressCircularChartComponent(value[6].toInt()),
),
),
),
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// TODO adjust 200 to values from user box
ProgressHorizontalChartComponent(Colors.lightGreen, value[0],
value[3].toInt(), "Fat (g)"),
ProgressHorizontalChartComponent(Colors.lightGreen, value[1],
value[4].toInt(), "Protein (g)"),
ProgressHorizontalChartComponent(Colors.lightGreen, value[2],
value[5].toInt(), "Carbohydrate (g)"),
],
))
],
),
);
});
}
}

View File

@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
import 'package:percent_indicator/circular_percent_indicator.dart';
import '../../../../../../../../services/statistics.dart';
class ProgressCircularChartComponent extends StatelessWidget {
final int totalCalories;
const ProgressCircularChartComponent(this.totalCalories, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: DataService.instance.eatenCalories,
builder: (context, value, child) {
double progress =
double.parse((value / totalCalories).toStringAsFixed(1));
progress = progress > 1.0 ? 1.0 : progress;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularPercentIndicator(
animation: true,
radius: 60.0,
lineWidth: 5.0,
percent: progress,
center: Text(
"$value/$totalCalories Kcal",
textAlign: TextAlign.center,
),
progressColor: Colors.lightGreen,
),
],
);
},
);
}
}

View File

@ -1,36 +1,37 @@
import 'package:ernaehrung/android/components/meal_page_text/statistics_text_component.dart'; import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:percent_indicator/linear_percent_indicator.dart'; import 'package:percent_indicator/linear_percent_indicator.dart';
class LineCircularWiTextComponent extends StatelessWidget { class ProgressHorizontalChartComponent extends StatelessWidget {
final Color progressColor; final Color progressColor;
final double percent; final double value;
final int left;
final int total; final int total;
final String textName; final String textName;
const LineCircularWiTextComponent( const ProgressHorizontalChartComponent(
this.progressColor, this.percent, this.left, this.total, this.textName, this.progressColor, this.value, this.total, this.textName,
{super.key}); {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
double progress = double.parse((value/total).toStringAsFixed(1));
progress = progress > 1.0 ? 1.0 : progress;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8), padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
StaticsTextComponent(left.toString(), true), HorizontalChartTextComponent(double.parse(value.toString()).toStringAsFixed(2), true),
const SizedBox(height: 4,), const SizedBox(height: 4,),
LinearPercentIndicator( LinearPercentIndicator(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
lineHeight: 8.0, lineHeight: 8.0,
percent: 0.9, percent: progress,
progressColor: progressColor, progressColor: progressColor,
), ),
const SizedBox(height: 4,), const SizedBox(height: 4,),
StaticsTextComponent(textName, false), HorizontalChartTextComponent(textName, false),
], ],
), ),
); );

View File

@ -1,6 +1,6 @@
import 'package:ernaehrung/android/components/meal_page_text/days_text_component.dart'; import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart';
import 'package:ernaehrung/android/config/statistics.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../../../../../services/statistics.dart';
enum TimeSpan { enum TimeSpan {
day, day,
@ -9,38 +9,35 @@ enum TimeSpan {
} }
class DaysMealPageComponent extends StatefulWidget { class TimespanTabsComponent extends StatefulWidget {
const DaysMealPageComponent({Key? key}) : super(key: key); const TimespanTabsComponent({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _DaysMealPageState(); State<StatefulWidget> createState() => _DaysMealPageState();
} }
class _DaysMealPageState extends State<DaysMealPageComponent> { class _DaysMealPageState extends State<TimespanTabsComponent> {
int activatedIndex = 0; int activatedIndex = 0;
StatisticsService statisticsService = StatisticsService();
void updateValue(int index) { void updateValue(int index) {
setState(() { setState(() {
activatedIndex = index; activatedIndex = index;
if(activatedIndex == 0){ if(activatedIndex == 0){
statisticsService.updateReducedBoxByTimespan(TimeSpan.day); DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.day);
}else if(activatedIndex == 1){ }else if(activatedIndex == 1){
statisticsService.updateReducedBoxByTimespan(TimeSpan.week); DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.week);
}else if(activatedIndex == 2){ }else if(activatedIndex == 2){
statisticsService.updateReducedBoxByTimespan(TimeSpan.month); DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.month);
} }
}); });
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Row(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
DaysTextComponent( TimespanTabsTextComponent(
timeSpan: TimeSpan.day, timeSpan: TimeSpan.day,
textColor: activatedIndex == 0 textColor: activatedIndex == 0
? const Color(0xff47a44b) ? const Color(0xff47a44b)
@ -49,7 +46,7 @@ class _DaysMealPageState extends State<DaysMealPageComponent> {
index: 0 index: 0
), ),
DaysTextComponent( TimespanTabsTextComponent(
timeSpan: TimeSpan.week, timeSpan: TimeSpan.week,
textColor: activatedIndex == 1 textColor: activatedIndex == 1
? const Color(0xff47a44b) ? const Color(0xff47a44b)
@ -57,7 +54,7 @@ class _DaysMealPageState extends State<DaysMealPageComponent> {
onPressed: updateValue, onPressed: updateValue,
index: 1 index: 1
), ),
DaysTextComponent( TimespanTabsTextComponent(
timeSpan: TimeSpan.month, timeSpan: TimeSpan.month,
textColor: activatedIndex == 2 textColor: activatedIndex == 2
? const Color(0xff47a44b) ? const Color(0xff47a44b)
@ -66,7 +63,6 @@ class _DaysMealPageState extends State<DaysMealPageComponent> {
index: 2 index: 2
), ),
], ],
),
); );
} }
} }

View File

@ -1,16 +1,17 @@
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart'; import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
import 'package:ernaehrung/android/config/statistics.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DaysTextComponent extends StatelessWidget { import '../../../../../../../../services/statistics.dart';
class TimespanTabsTextComponent extends StatelessWidget {
late final String timeSpan; late final String timeSpan;
late final TimeSpan timespan; late final TimeSpan timespan;
Function(int i) onPressed; Function(int i) onPressed;
int index; int index;
Color textColor; Color textColor;
late StatisticsService statisticsService; late DataService statisticsService;
DaysTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){ TimespanTabsTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){
timespan = timeSpan; timespan = timeSpan;
switch(timeSpan){ switch(timeSpan){
case TimeSpan.day: case TimeSpan.day:

View File

@ -0,0 +1,29 @@
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_food_list.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import '../../../../../../services/statistics.dart';
import '../../../../../shared_components/title.dart';
class ProgressAllMealsComponent extends StatelessWidget {
const ProgressAllMealsComponent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(0, 16, 0, 0),
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8))),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const TitleComponent("Alle Mahlzeiten"),
ProgressFoodListComponent(
box: Hive.box(DataService.instance.progressBoxName),
)
],
),
);
}
}

View File

@ -0,0 +1,134 @@
import 'package:basic_utils/basic_utils.dart';
import 'package:flutter/material.dart';
import '../../../../../../helper/format_helper.dart';
import '../../../../../../models/food.dart';
import '../../../../../search_food/search_food.dart';
class ProgressCardComponent extends StatefulWidget {
final String eatingMealName;
final List<Food> selectedMeal;
final bool addButtonVisible;
const ProgressCardComponent(
{Key? key,
required this.eatingMealName,
required this.selectedMeal,
this.addButtonVisible = true})
: super(key: key);
@override
State<ProgressCardComponent> createState() => _ProgressCardComponentState();
}
class _ProgressCardComponentState extends State<ProgressCardComponent> {
Route createRoute(String cardName) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
SearchFoodPage(cardName),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(0.0, 1.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween =
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}
String capitalize(String s) => s[0].toUpperCase() + s.substring(1);
Widget getElevatedButton() {
if (widget.addButtonVisible) {
return ElevatedButton(
onPressed: () async {
Navigator.of(context).push(createRoute(widget.eatingMealName));
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
padding: const EdgeInsets.all(0),
),
child: const Text(
'+',
style: TextStyle(fontSize: 28),
),
);
} else {
return const SizedBox.shrink();
}
}
int getCountedCalories() {
double calories = 0;
for (Food food in widget.selectedMeal) {
if (food.calories is int) {
calories += food.calories as int;
} else if (food.calories is double) {
calories += food.calories as double;
}
}
return calories.round();
}
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(0, 16, 0, 0),
child: Column(
children: [
Row(
children: [
Text(
StringUtils.capitalize(widget.eatingMealName),
maxLines: 1,
overflow: TextOverflow.ellipsis,
softWrap: false,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 16),
),
getElevatedButton(),
],
),
SizedBox(
width: MediaQuery.of(context).size.width * 1,
child: ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: getMapOfDistinctElementsWithCounterAndCalories(
widget.selectedMeal)
.keys
.length,
itemBuilder: (context, i) {
Map<String, List<int>> map =
getMapOfDistinctElementsWithCounterAndCalories(
widget.selectedMeal);
String foodName = map.keys.elementAt(i);
List<int> values = map.values.elementAt(i);
return Padding(
padding: const EdgeInsets.only(top: 10.0), // Adjust the padding as needed
child: Text(
"${i+1}. ${getFoodListStringByFood(foodName, values[0], values[1], context)}",
),
);
}),
),
widget.selectedMeal.isNotEmpty
? Column(
children: [
const Divider(),
Text("${getCountedCalories()} kcal")
],
)
: const SizedBox.shrink(),
],
));
}
}

View File

@ -0,0 +1,34 @@
import 'package:flutter/cupertino.dart';
import 'package:hive_flutter/adapters.dart';
import '../../../../../../helper/cast_helper.dart';
import '../../../../../../services/statistics.dart';
import 'progress_card.dart';
class ProgressFoodListComponent extends StatelessWidget {
final Box box;
const ProgressFoodListComponent({super.key, required this.box});
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: box.listenable(),
builder: (context, box, widget) {
final mealTypes = ['FRÜHSTÜCK','MITTAGESSEN','ABENDESSEN']; // Specify the desired orde
return ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: box.keys.length,
itemBuilder: (context, i) {
return ProgressCardComponent(
eatingMealName: mealTypes[i],
selectedMeal: castDynamicToListFood(box.get(mealTypes[i])),
addButtonVisible: box.name != DataService.instance.progressBoxName.toLowerCase(),
);
}
);
});
}
}

View File

@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import '../../../../helper/format_helper.dart';
import '../../../../services/statistics.dart';
import 'sub_components/chart.dart';
import '../../../shared_components/secondary_text.dart';
import '../../../shared_components/title.dart';
class StatisticsPage extends StatelessWidget {
final String title;
final Color backgroundColor = const Color(0xff47a44b);
const StatisticsPage({Key? key, required this.title}) : super(key: key);
String get getTitle => title;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return getTitle;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: [
const ChartComponent(),
Container(
margin: const EdgeInsets.fromLTRB(0, 16, 0, 0),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8))),
child: Padding(
padding:
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ValueListenableBuilder(
valueListenable:
DataService.instance.weeklyCaloryRanking,
builder: (context, value, child) {
return Column(
children: [
const TitleComponent(
"Lebensmittel mit dem höchsten Kaloriengehalt"),
const SizedBox(
height: 5,
),
for (var item in value)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SecondaryTextComponent(
getWeeklyRankingString(item.name,context),
value.indexOf(item)+1
),
SecondaryTextComponent(
item.calories.toString(),
null
),
],
),
],
);
},
),
))
],
),
),
);
}
}

View File

@ -0,0 +1,308 @@
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import '../../../../../services/statistics.dart';
import '../../../../shared_components/secondary_text.dart';
import '../../../../shared_components/title.dart';
class ChartComponent extends StatelessWidget {
const ChartComponent({Key? key}) : super(key: key);
BarTouchData get barTouchData => BarTouchData(
enabled: false,
touchTooltipData: BarTouchTooltipData(
tooltipBgColor: Colors.transparent,
tooltipPadding: EdgeInsets.zero,
tooltipMargin: 4,
getTooltipItem: (
BarChartGroupData group,
int groupIndex,
BarChartRodData rod,
int rodIndex,
) {
return BarTooltipItem(
rod.toY.round().toString(),
const TextStyle(
color: Colors.transparent,
fontWeight: FontWeight.bold,
),
);
},
),
);
Widget getTitles(double value, TitleMeta meta) {
const style = TextStyle(
color: Colors.orange,
fontWeight: FontWeight.bold,
fontSize: 14,
);
String text;
switch (value.toInt()) {
case 0:
text = 'M';
break;
case 1:
text = 'T';
break;
case 2:
text = 'W';
break;
case 3:
text = 'T';
break;
case 4:
text = 'F';
break;
case 5:
text = 'S';
break;
case 6:
text = 'S';
break;
default:
text = '';
break;
}
return SideTitleWidget(
axisSide: meta.axisSide,
space: 4,
child: Text(text, style: style),
);
}
FlTitlesData get titlesData => FlTitlesData(
show: true,
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
reservedSize: 30,
getTitlesWidget: getTitles,
),
),
topTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
rightTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: false,
),
),
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: (value, _) {
// Return a custom widget for each axis value
return Container(
constraints:
const BoxConstraints.tightFor(width: double.infinity),
child: Padding(
padding: const EdgeInsets.only(right: 3.0),
// Adjust the margin value as needed
child: FittedBox(
fit: BoxFit.scaleDown,
alignment: Alignment.centerLeft,
child: Text(
value.toInt().toString(),
style: const TextStyle(
color: Colors.orange,
fontWeight: FontWeight.bold,
),
),
),
),
);
},
),
));
FlBorderData get borderData => FlBorderData(
show: true, // Set to true to display the chart border
border: const Border(
bottom: BorderSide(color: Colors.black, width: 1),
left:
BorderSide(color: Colors.black, width: 1), // Hide the left border
),
);
@override
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8))),
child: Padding(
padding:
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: Column(
children: [
ValueListenableBuilder(
valueListenable: DataService
.instance.dailyAverageForCurrentWeek,
builder: (context, value, child) {
return SizedBox(
height: 100,
width: 400,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const TitleComponent("Kalorien"),
const SizedBox(
height: 10,
),
const SecondaryTextComponent(
"Durchschnittlich",
null
),
Text(
"${value.toString()} kcal/Tag",
style: const TextStyle(
color: Colors.black,
fontSize: 30,
fontWeight: FontWeight.w600
),
textAlign: TextAlign.left,
),
],
),
);
},
),
ValueListenableBuilder(
valueListenable:
DataService.instance.barChartData,
builder: (context, value, child) {
return SizedBox(
height: 300,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 15,
// Adjust the height of the legend as needed
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: const EdgeInsets.symmetric(
horizontal: 8.0),
// Adjust the spacing between legend items
child: Row(
children: [
Container(
width: 12,
height: 12,
decoration: const BoxDecoration(
color: Colors.yellow,
// Use the color of the first bar rod for the legend item
shape: BoxShape.circle,
),
),
const SizedBox(width: 4.0),
// Adjust the spacing between the color indicator and the legend label
const Text(
'Frühstück',
// Replace with your desired legend label
style: TextStyle(
fontSize:
12), // Adjust the font size of the legend labels
),
],
),
),
Container(
margin: const EdgeInsets.symmetric(
horizontal: 8.0),
// Adjust the spacing between legend items
child: Row(
children: [
Container(
width: 12,
height: 12,
decoration: const BoxDecoration(
color: Colors.red,
// Use the color of the first bar rod for the legend item
shape: BoxShape.circle,
),
),
const SizedBox(width: 4.0),
// Adjust the spacing between the color indicator and the legend label
const Text(
'Mittagessen',
// Replace with your desired legend label
style: TextStyle(
fontSize:
12), // Adjust the font size of the legend labels
),
],
),
),
Container(
margin: const EdgeInsets.symmetric(
horizontal: 8.0),
// Adjust the spacing between legend items
child: Row(
children: [
Container(
width: 12,
height: 12,
decoration: const BoxDecoration(
color: Colors.green,
// Use the color of the first bar rod for the legend item
shape: BoxShape.circle,
),
),
const SizedBox(width: 4.0),
// Adjust the spacing between the color indicator and the legend label
const Text(
'Abendessen',
// Replace with your desired legend label
style: TextStyle(
fontSize:
12), // Adjust the font size of the legend labels
),
],
),
),
],
),
),
Container(
margin:
const EdgeInsets.fromLTRB(0, 24, 0, 0),
height: 250,
child: BarChart(
BarChartData(
barTouchData: barTouchData,
titlesData: titlesData,
borderData: borderData,
barGroups: value,
gridData: FlGridData(show: false),
alignment: BarChartAlignment.spaceAround,
extraLinesData: ExtraLinesData(
horizontalLines: [
HorizontalLine(
y: DataService.instance.getCaloryTargetForOneDay(), // Specify the y-value where you want the line to be positioned
color: Colors.black, // Change the color as per your requirement
strokeWidth: 2, // Adjust the width as needed
dashArray: [3, 2],
label: HorizontalLineLabel(
show: true,
labelResolver: (x) => "Zielwert"
)
),
],
),
),
),
),
],
),
);
},
),
],
),
));
}
}

View File

@ -0,0 +1,32 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive_flutter/adapters.dart';
import '../../../../../services/statistics.dart';
import 'today_card/today_card.dart';
class MealsComponent extends StatelessWidget {
MealsComponent({Key? key}) : super(key: key);
final List<Color> colors = [Colors.green,Colors.lightGreen,CupertinoColors.systemGreen];
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: Hive.box(dotenv.env['TODAY_BOX'] ?? 'TODAY').listenable(),
builder: (context, box, widget) {
final mealTypes = ['FRÜHSTÜCK','MITTAGESSEN','ABENDESSEN']; // Specify the desired order of meal types
return ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: box.keys.length,
itemBuilder: (context, i) {
String mealTypeAsString = mealTypes[i];
return TodayCardComponent(
mealTypeAsString,
DataService.instance.getMealsOfTodayByMealtype(mealTypeAsString),
color: colors[i],
);
});
});
}
}

View File

@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import '../../../../../../../helper/format_helper.dart';
import '../../../../../../../models/food.dart';
import 'card_food_item.dart';
class CardDataFoodComponent extends StatelessWidget {
final List<Food> foods;
final Color color;
const CardDataFoodComponent(this.foods,this.color, {Key? key,}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
child: foods.isNotEmpty ?
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: getMapOfDistinctElementsWithCounterAndCalories(
foods)
.keys
.length,
itemBuilder: (context, i) {
Map<String, List<int>> map =
getMapOfDistinctElementsWithCounterAndCalories(
foods);
String foodName = map.keys.elementAt(i);
List<int> values = map.values.elementAt(i);
return Column(
children: [
CardFoodItemComponent(foodName,values),
Divider(
color: Colors.grey.shade300,
thickness: 1.2,
)
],
);
})
],
)
: const Center(
child: Text(
"Füge jetzt neue Gerichte hinzu!",
style: TextStyle(
fontSize: 14,
color: Colors.white
),
)
));
}
}

View File

@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
class CardFoodItemComponent extends StatelessWidget {
final String foodName;
final List<int> countAndCalories; // [count, calories]
const CardFoodItemComponent(this.foodName,this.countAndCalories, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(0, 8, 0, 4),
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"$foodName - ${countAndCalories[0] * 100}g",
style: const TextStyle(
color: Colors.white,
fontSize: 17,
fontWeight: FontWeight.bold,
),
softWrap: true,
maxLines: 2,
),
Text(
"\n${countAndCalories[1]} kcal | 100g",
style: const TextStyle(color: Colors.white),
),
],
));
}
}

View File

@ -11,18 +11,26 @@ class CardTitleComponent extends StatelessWidget {
return Container( return Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(16)) borderRadius: BorderRadius.all(Radius.circular(12))
), ),
child: Padding( child: Padding(
padding: padding:
const EdgeInsets const EdgeInsets.symmetric(vertical: 16,horizontal: 16),
.symmetric(
vertical: 16,
horizontal: 8
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [Text(title), Text(calories)], children: [
Text(title,
style: const TextStyle(
fontSize: 20
),
),
Text(
calories,
style: const TextStyle(
fontSize: 17
),
)
],
), ),
), ),
); );

View File

@ -0,0 +1,92 @@
import 'package:basic_utils/basic_utils.dart';
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_data_food.dart';
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_title.dart';
import 'package:flutter/material.dart';
import '../../../../../../helper/cast_helper.dart';
import '../../../../../../models/food.dart';
import '../../../../../search_food/search_food.dart';
class TodayCardComponent extends StatelessWidget {
final String title;
final Color color;
final List<Food> foods;
const TodayCardComponent(this.title, this.foods, {super.key, Color? color})
: color = color ?? Colors.black;
Route createRoute(String cardName) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
SearchFoodPage(cardName),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(0.0, 1.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween =
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}
int countCalories(List<Food> foods){
int summary = 0;
for(int i=0; i<foods.length;i++){
summary += foods[i].calories is int ? foods[i].calories as int : (foods[i].calories as double).round();
}
return summary;
}
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: color,
borderRadius: const BorderRadius.all(Radius.circular(12)),
),
margin: const EdgeInsets.fromLTRB(0, 0, 0, 16),
child: Column(
children: [
CardTitleComponent(
StringUtils.capitalize(title),
"${countCalories(castDynamicToListFood(foods))} Kalorien",
),
CardDataFoodComponent(
foods,
color,
),
Padding(
padding: const EdgeInsets.only(left: 8, right: 8,bottom: 8),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(40),
backgroundColor: const Color(0xFFffffff),
foregroundColor: color,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
onPressed: () async {
Navigator.of(context).push(createRoute(title));
},
child: const Text(
'+ Gericht hinzufügen',
style:TextStyle(
fontSize: 17
) ,
),
),
),
],
),
);
}
}

View File

@ -0,0 +1,20 @@
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/meals.dart';
import 'package:flutter/material.dart';
class TodayPage extends StatefulWidget {
final String title;
final Color backgroundColor = const Color(0xff47a44b);
const TodayPage({Key? key, required this.title}) : super(key: key);
@override
State<TodayPage> createState() => _TodayPageState();
}
class _TodayPageState extends State<TodayPage> {
@override
Widget build(BuildContext context) {
return Scaffold(body: SingleChildScrollView(child: MealsComponent()));
}
}

View File

@ -1,6 +1,5 @@
import 'package:ernaehrung/pages/search_food/sub_components/search.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../components/search_component.dart';
import '../../models/food.dart'; import '../../models/food.dart';
import '../../models/food_dto.dart'; import '../../models/food_dto.dart';
@ -28,8 +27,11 @@ class _SearchFoodPageState extends State<SearchFoodPage> {
if (snapshot.hasData) { if (snapshot.hasData) {
return SearchComponent(snapshot.data!, widget.cardName); return SearchComponent(snapshot.data!, widget.cardName);
}else { }else {
return const Placeholder(); return const Center(
child: CircularProgressIndicator(), // Loading animation
);
} }
}))); })
));
} }
} }

View File

@ -0,0 +1,76 @@
import 'package:empty_widget/empty_widget.dart';
import 'package:flutter/material.dart';
import '../../../models/food.dart';
import 'searched_food.dart';
class SearchComponent extends StatefulWidget {
final List<Food> foods;
final String cardName;
const SearchComponent(this.foods, this.cardName, {super.key});
@override
State<SearchComponent> createState() => _SearchComponentState();
}
class _SearchComponentState extends State<SearchComponent> {
final TextEditingController controller = TextEditingController();
late List<Food> allFoods = widget.foods;
List<Food> foundedFood = [];
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
constraints: const BoxConstraints.expand(),
child: Padding(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 0), // Add padding on the X-axis
child: Column(
children: [
TextField(
controller: controller,
decoration: InputDecoration(
contentPadding: const EdgeInsets.symmetric(horizontal: 16), // Add padding on the X-axis for text input
prefix: const Icon(Icons.search),
hintText: 'Suche nach Gericht',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.blue),
),
),
onChanged: findOnChanged,
),
Expanded(
child: controller.text.isNotEmpty && foundedFood.isNotEmpty
? ListView.builder(
itemCount: foundedFood.length,
itemBuilder: (context, index) {
final food = foundedFood[index];
return SearchedFoodComponent(food, widget.cardName);
},
)
: EmptyWidget(),
),
],
),
),
);
}
void findOnChanged(String searchedFood) async{
foundedFood =
allFoods
.where((food) => food.name
.toString()
.toLowerCase()
.startsWith(searchedFood.toLowerCase()))
.toList();
setState(() {
foundedFood;
});
}
}

View File

@ -0,0 +1,202 @@
import 'package:assorted_layout_widgets/assorted_layout_widgets.dart';
import 'package:basic_utils/basic_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hive/hive.dart';
import '../../../helper/cast_helper.dart';
import '../../../helper/format_helper.dart';
import '../../../models/food.dart';
import '../../../services/statistics.dart';
class SearchedFoodComponent extends StatefulWidget {
final Food food;
final String cardName;
const SearchedFoodComponent(this.food, this.cardName, {Key? key}) : super(key: key);
@override
State<SearchedFoodComponent> createState() => _SearchFoodComponentState();
}
class _SearchFoodComponentState extends State<SearchedFoodComponent> {
int counter = 1;
void storeFood(int counter, BuildContext context) async {
final todayBox = Hive.box(dotenv.env['TODAY_BOX']!);
if (!todayBox.isOpen){
Hive.openBox(dotenv.env['TODAY_BOX']!);
}
for(int i = 0; i < counter; i++){
DataService.instance.addItemToMainBox(widget.food, widget.cardName);
addValuesToList(todayBox, widget.cardName, [widget.food]);
}
showSuccessToast(context);
}
void showSuccessToast(BuildContext context){
Fluttertoast.showToast(
msg: "${getToastFoodNameString(widget.food,context)} erfolgreich zu ${StringUtils.capitalize(widget.cardName)} hinzugefügt",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
timeInSecForIosWeb: 5,
backgroundColor: Colors.green,
textColor: Colors.black,
);
}
void addValuesToList(box, String key, List<Food> newValues){
List<Food> existingList = castDynamicToListFood(box.get(key));
for(int i = 0; i < newValues.length;i++){
if(!existingList.contains(newValues[i])){
existingList.add(newValues[i]);
}
}
box.put(key, existingList);
}
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
margin: const EdgeInsets.only(top: 8),
decoration: BoxDecoration(
color: Colors.lightGreen,
borderRadius: BorderRadius.circular(5),
),
child: WrapSuper(
spacing: 32,
wrapType: WrapType.balanced,
wrapFit: WrapFit.larger,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: Text(
widget.food.name,
maxLines: 2,
overflow: TextOverflow.ellipsis,
softWrap: false,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20.0,
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.6,
child: Text(
"${widget.food.calories} kcal | 100g",
maxLines: 1,
overflow: TextOverflow.ellipsis,
softWrap: false,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20.0,
),
),
),
],
),
Padding(
padding: const EdgeInsets.only(top:12),
child: Row(
children: [
Padding(
padding: const EdgeInsets.only(right :12),
child: Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.green,
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Colors.white),
),
child: InkWell(
onTap: () {
setState(() {
counter = counter > 1 ? counter - 1 : 1;
});
},
child: const Center(
child: Text(
"-",
style: TextStyle(fontSize: 24, color: Colors.white, fontWeight: FontWeight.bold),
),
),
),
),
),
SizedBox(
width: 20,
child: Text(
counter.toString(),
style: const TextStyle(fontSize: 24, color: Colors.white, fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
),
),
Padding(
padding: const EdgeInsets.only(left:12),
child: Container(
width: 40,
height: 38,
decoration: BoxDecoration(
color: Colors.green,
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Colors.white),
),
child: InkWell(
onTap: () {
setState(() {
counter++;
});
},
child: const Center(
child: Text(
"+",
style: TextStyle(fontSize: 24, color: Colors.white, fontWeight: FontWeight.bold),
),
),
),
),
)
],
),
),
Padding(
padding: const EdgeInsets.only(top:12),
child: ElevatedButton(
onPressed: () async {
storeFood(counter,context);
},
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: Colors.green,
shadowColor: Colors.greenAccent,
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5.0),
),
),
child: const Text(
'+',
style: TextStyle(fontSize: 25),
),
),
)
],
),
);
}
}

View File

@ -0,0 +1,175 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:hive/hive.dart';
import '../../models/form_builder.dart';
import '../../models/user.dart';
import 'form_builder_text_field.dart';
class FormBuilderComponent extends StatefulWidget {
final bool lockTextFields;
const FormBuilderComponent({Key? key, required this.lockTextFields})
: super(key: key);
@override
State<FormBuilderComponent> createState() => _FormBuilderComponentState();
}
class _FormBuilderComponentState extends State<FormBuilderComponent> {
final formKey = GlobalKey<FormBuilderState>();
final List<FormTextField> listOfTextField = [
FormTextField(
"vorname",
TextInputType.text,
30,
"Der Vorname sollte maximal 30 Zeichen lang sein",
"Der Vorname sollte mindestens 2 Zeichen lang sein",
2,
null,
null,
null,
null),
FormTextField(
"nachname",
TextInputType.text,
30,
"Der Nachname sollte maximal 30 Zeichen lang sein",
"Der Nachname sollte mindestens 2 Zeichen lang sein",
2,
null,
null,
null,
null),
FormTextField(
"gewicht",
TextInputType.number,
null,
null,
null,
null,
200,
10,
"Der Gewicht sollte maximal 200 kg sein",
"Der Gewicht sollte mindestens 10 kg sein"),
FormTextField(
"groesse",
TextInputType.number,
null,
null,
null,
null,
230,
60,
"Die Größe sollte maximal 230cm sein",
"Die Größe sollte mindestens 60cm sein"),
FormTextField(
"alter",
TextInputType.number,
null,
null,
null,
null,
99,
6,
"Das Alter sollte maximal 99 Jahre alt sein",
"Das Alter sollte mindestens 6 Jahre alt sein"),
FormTextField(
"kalorien",
TextInputType.number,
null,
null,
null,
null,
30000,
1000,
"Die Kalorienanzahl sollte mindestens 30000 Kcal sein",
"Die Kalorienanzahl sollte mindestens 1000 Kcal sein")
];
@override
Widget build(BuildContext context) {
return FormBuilder(
key: formKey,
child: Padding(
padding: const EdgeInsets.all(8),
child: SingleChildScrollView(
child: Column(
children: [
ListView.builder(
primary: false,
itemCount: listOfTextField.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return FormBuilderTextFieldComponent(
widget.lockTextFields, listOfTextField[index]);
}),
Container(
margin:
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(40), //
backgroundColor: CupertinoColors.systemGreen,
foregroundColor: const Color(0xFFffffff),
shape: const StadiumBorder(),
),
onPressed: () {
final Box box = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
if (widget.lockTextFields) {
box.put(
"USER",
User(
formKey.currentState?.fields['vorname']
?.value ??
box.get("USER").vorname.toString(),
formKey.currentState?.fields['nachname']
?.value ??
box.get("USER").nachname.toString(),
int.parse(formKey.currentState?.fields['gewicht']
?.value ??
box.get("USER").gewicht),
int.parse(formKey.currentState?.fields['groesse']
?.value ??
box.get("USER").groesse),
int.parse(formKey.currentState?.fields['alter']?.value ??
box.get("USER").alter),
int.parse(formKey.currentState?.fields['kalorien']
?.value ??
box.get("USER").kalorien)));
ScaffoldMessenger.of(context)
.showSnackBar(const SnackBar(
duration: Duration(seconds: 2),
content: Text('Die Daten wurden erfolgreich gespeichert'),
));
} else {
box.put(
"USER",
User(
formKey.currentState?.fields['vorname']?.value,
formKey.currentState?.fields['nachname']?.value,
int.parse(formKey.currentState?.fields['gewicht']?.value),
int.parse(formKey.currentState?.fields['groesse']?.value),
int.parse(formKey.currentState?.fields['alter']?.value),
int.parse(formKey.currentState?.fields['kalorien']?.value)
));
}
Future.delayed(
const Duration(seconds: 2),
() => Navigator.of(context)
.pushNamedAndRemoveUntil('/navigation', (Route<dynamic> route)
=> false)
);
},
child: const Text("Eingaben bestätigen"),
)),
],
)),
));
}
}

View File

@ -0,0 +1,119 @@
import 'package:basic_utils/basic_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:hive/hive.dart';
import '../../models/form_builder.dart';
import '../../models/user.dart';
class FormBuilderTextFieldComponent extends StatefulWidget {
final bool isSettingsPage;
final FormTextField formTextField;
const FormBuilderTextFieldComponent(this.isSettingsPage, this.formTextField,
{super.key});
@override
State<FormBuilderTextFieldComponent> createState() => _FormBuilderTextFieldComponentState();
}
class _FormBuilderTextFieldComponentState extends State<FormBuilderTextFieldComponent> {
bool enable = false;
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: widget.isSettingsPage
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child:
TextFieldChild(widget.isSettingsPage, widget.formTextField, enable: enable,)),
enable
? IconButton(
onPressed: () async {
setState(() {
enable = !enable;
});
},
icon: const Icon(Icons.lock_open))
: IconButton(
onPressed: () async {
setState(() {
enable = !enable;
});
},
icon: const Icon(Icons.lock))
],
)
: TextFieldChild(widget.isSettingsPage, widget.formTextField),
);
}
}
class TextFieldChild extends StatelessWidget {
final bool isSettingsPage;
final FormTextField formTextField;
final bool? enable;
const TextFieldChild(this.isSettingsPage, this.formTextField,
{super.key, this.enable = true});
dynamic getInitialValue(FormTextField textField){
final User user = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER').values.last;
if (textField.title == "vorname"){
return user.vorname;
}else if (textField.title == "nachname"){
return user.nachname;
}else if (textField.title == "gewicht"){
return user.gewicht;
}else if (textField.title == "groesse"){
return user.groesse;
}else if (textField.title == "alter"){
return user.alter;
}else if (textField.title == "kalorien"){
return user.kalorien;
}
}
@override
Widget build(BuildContext context) {
return FormBuilderTextField(
name: formTextField.title,
enabled: enable!,
initialValue: isSettingsPage ? getInitialValue(formTextField).toString() : "",
decoration: InputDecoration(
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(10.0))),
filled: true,
hintStyle: TextStyle(color: Colors.grey.shade400),
hintText: StringUtils.capitalize(formTextField.title),
labelText: StringUtils.capitalize(formTextField.title),
fillColor: Colors.white70),
keyboardType: formTextField.textInputType,
maxLength: TextInputType.number == formTextField.textInputType ? 7 : 30,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
TextInputType.number == formTextField.textInputType
? FormBuilderValidators.max(formTextField.numericMax!,
errorText: formTextField.numericMaxErrorMessage)
: FormBuilderValidators.maxLength(30,
errorText: formTextField.maxLengthErrorMessage),
TextInputType.number == formTextField.textInputType
? FormBuilderValidators.min(formTextField.numericMin!,
errorText: formTextField.numericMinErrorMessage)
: FormBuilderValidators.minLength(2,
errorText: formTextField.minLengthErrorMessage)
]),
);
}
}

View File

@ -0,0 +1,64 @@
import 'package:flutter/material.dart';
class SecondaryTextComponent extends StatelessWidget {
final String title;
final int? rank;
const SecondaryTextComponent(this.title, this.rank,{Key? key,}) : super(key: key);
@override
Widget build(BuildContext context) {
final TextStyle textStyle = TextStyle(
color: Colors.grey.shade500,
fontSize: 14,
fontWeight: FontWeight.bold,
);
Widget textWidget;
if (rank != null) {
textWidget = Container(
decoration: BoxDecoration(
color: getRankColor(rank!),
borderRadius: BorderRadius.circular(15),
),
padding: const EdgeInsets.all(8),
child: Row(
children: [
Text(
'$rank.',
style: rank! <= 3 ? textStyle.copyWith(color: Colors.white) :textStyle.copyWith(color: Colors.grey),
),
const SizedBox(width: 4),
Text(
title.toString(),
style: rank! <= 3 ? textStyle.copyWith(color: Colors.white) :textStyle.copyWith(color: Colors.grey),
),
],
),
);
} else {
textWidget = Text(
title.toString(),
style: textStyle,
);
}
return Padding(
padding: const EdgeInsets.only(top: 8.0),
child: textWidget,
);
}
Color getRankColor(int rank) {
if (rank == 1) {
return Colors.amber;
} else if (rank == 2) {
return Colors.grey;
} else if (rank == 3) {
return Colors.brown;
} else {
return Colors.transparent;
}
}
}

View File

@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
import '../shared_components/form_builder.dart';
class OnboardingPage extends StatefulWidget {
const OnboardingPage({Key? key}) : super(key: key);
@override
State<OnboardingPage> createState() => _OnboardingPageState();
}
class _OnboardingPageState extends State<OnboardingPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(
"Welcome",
style: TextStyle(
color: Colors.black
),
),
backgroundColor: Colors.grey.shade100,
),
body: const FormBuilderComponent(lockTextFields: false,)
);
}
}

View File

@ -0,0 +1,27 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../shared_components/form_builder.dart';
class SettingsPage extends StatefulWidget {
const SettingsPage({Key? key}) : super(key: key);
@override
State<SettingsPage> createState() => _SettingsPageState();
}
class _SettingsPageState extends State<SettingsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: CupertinoColors.systemGreen,
leading: BackButton(
onPressed: () async => Navigator.of(context).pop(),
),
title: const Text('Einstellungen'),
),
body: const FormBuilderComponent(lockTextFields: true),
);
}
}

View File

@ -0,0 +1,480 @@
import 'dart:math';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive/hive.dart';
import '../pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
import '../models/food.dart';
import '../models/user.dart';
import '../helper/cast_helper.dart';
import '../helper/format_helper.dart';
class DataService {
static final DataService _instance = DataService._internal();
factory DataService() => _instance;
static DataService get instance => _instance;
DataService._internal() {
// TO RUN TESTS -> COMMENT initBoxes() out -> HIVE behavior is tested in other tests
initBoxes();
}
String progressBoxName = dotenv.env['PROGRESS_BOX'] ?? 'PROGRESS_BOX';
String mainBoxName = dotenv.env['MAIN_BOX'] ?? 'MAIN_BOX';
String statisticsBoxName = dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS_BOX';
ValueNotifier<int> eatenCalories = ValueNotifier<int>(0);
/*
* fat 0
* protein 1
* carbon 2
* fat for one day, week, month, 3
* protein for one day, week, month 4
* carbon for one day, week, month 5
* calories for one day, week, month 6
* */
ValueNotifier<List<double>> ingredients = ValueNotifier<List<double>>([0,0,0,0,0,0,0]);
ValueNotifier<int> dailyAverageForCurrentWeek = ValueNotifier<int>(0);
ValueNotifier<List<Food>> weeklyCaloryRanking = ValueNotifier<List<Food>>([]);
ValueNotifier<List<BarChartGroupData>> barChartData = ValueNotifier<List<BarChartGroupData>>([]);
initBoxes()async{
Box reducedBox = Hive.box(progressBoxName);
Box progressBox = Hive.box(statisticsBoxName);
putIfKeyNotExists([reducedBox,progressBox], 'FRÜHSTÜCK', []);
putIfKeyNotExists([reducedBox,progressBox], 'MITTAGESSEN', []);
putIfKeyNotExists([reducedBox,progressBox], 'ABENDESSEN', []);
updateStatisticsTodayBoxByTimespan(TimeSpan.day);
}
void putIfKeyNotExists(List<Box> boxes, String key, dynamic value) {
for(int i = 0; i < boxes.length;i++){
if (!boxes[i].containsKey(key)) {
boxes[i].put(key, value);
}
}
}
updateStatisticsTodayBoxByTimespan(TimeSpan timespan){
clearBoxByBox(Hive.box(progressBoxName));
int timestamp = getTimestampFromNow();
int dayLen = 1;
switch(timespan){
case TimeSpan.day:
getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(progressBoxName));
break;
case TimeSpan.week:
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
for(int i = 0;i < currentWeek.length;i++){
getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(progressBoxName));
}
dayLen = currentWeek.length;
break;
case TimeSpan.month:
List<int> currentMonth = getTimestampsByTimestampAndTimespan(TimeSpan.month,timestamp);
for(int i = 0;i < currentMonth.length;i++){
getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(progressBoxName));
}
dayLen = currentMonth.length;
break;
}
updateCalculationsAndNotfiyListenersForPorgressStatistics(dayLen);
}
void updateCalculationsAndNotfiyListenersForPorgressStatistics(int dayLen){
eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(progressBoxName));
ingredients.value = getAllEatenIngredientsForTodayStatistics(dayLen.roundToDouble());
}
void getNewFoodAndUpdateBoxByTimestampAndBox(int timestamp, Box box){
Map<String,List<Food>> newFood = getFoodMapForGivenTimestampFromMainBox(timestamp);
if(newFood.keys.isNotEmpty){
setElementsOfBoxByBox(newFood, box);
}
}
bool timestampIsValid(int timestamp){
try{
DateTime.fromMillisecondsSinceEpoch(timestamp*1000);
return true;
}catch(e){
return false;
}
}
List<int> getTimestampsByTimestampAndTimespan(TimeSpan timespan, int timestamp) {
if(!timestampIsValid(timestamp)){
return [];
}
int range = timespan == TimeSpan.week ? 7 : 31;
int targetWeekday = DateTime.monday; // Example target weekday (Monday)
DateTime currentDateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
int currentWeekday = currentDateTime.weekday;
int daysToAdd = targetWeekday - currentWeekday;
DateTime targetDateTime = currentDateTime.add(Duration(days: daysToAdd));
List<int> timestampsForWeekdays = [];
for (int i = 0; i < range; i++) {
timestampsForWeekdays.add(targetDateTime.millisecondsSinceEpoch ~/ 1000);
targetDateTime = targetDateTime.add(const Duration(days: 1));
}
return timestampsForWeekdays;
}
clearBoxByBox(Box box){
for(int i = 0; i < box.keys.length;i++){
box.put(box.keys.elementAt(i), []);
}
}
setElementsOfBoxByBox(Map<String,List<Food>> newFood,Box box){
Iterable<String> keys = newFood.keys;
for(int i = 0; i < keys.length;i++){
List<Food> alreadyExisting = castDynamicToListFood(box.get(keys.elementAt(i)));
alreadyExisting.addAll(newFood[keys.elementAt(i)] as Iterable<Food>);
box.put(keys.elementAt(i), alreadyExisting);
}
}
getDayAsIntFromTimestamp(int timestamp){
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
return dateTime.day;
}
Map<String,List<Food>> getFoodMapForGivenTimestampFromMainBox(int timestamp){
Box box = Hive.box(mainBoxName);
dynamic matchingTimestamp = getMatchingTimestamp(box, timestamp);
if(matchingTimestamp != null){
return castDynamicMap(box.get(matchingTimestamp));
}
return <String,List<Food>>{};
}
getMatchingTimestamp(Box box,int newTimestamp){
if(box.keys.isNotEmpty){
for(int i = 0; i < box.keys.length;i++){
int timestamp = box.keys.elementAt(i);
if(isDateEqual(newTimestamp, timestamp)){
return timestamp;
}
}
return null;
}
}
getMonthAsIntFromTimestamp(int timestamp){
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
return dateTime.month;
}
getYearAsIntFromTimestamp(int timestamp){
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
return dateTime.year;
}
isDateEqual(int timestamp1, int timestamp2){
if(!timestampIsValid(timestamp1) || !timestampIsValid(timestamp2)){
return false;
}
return
getDayAsIntFromTimestamp(timestamp1) == getDayAsIntFromTimestamp(timestamp2) &&
getMonthAsIntFromTimestamp(timestamp1) == getMonthAsIntFromTimestamp(timestamp2) &&
getYearAsIntFromTimestamp(timestamp1) == getYearAsIntFromTimestamp(timestamp2);
}
addItemToMainBox(Food value, String mealType){
// Hive.deleteFromDisk();
Box box = Hive.box(mainBoxName);
DateTime dateTime = DateTime.now();
// DEBUG
//DateTime dateTime = getRandomTimestampForTesting();
int newTimestamp = dateTime.millisecondsSinceEpoch.toInt() ~/ 1000;
dynamic matchingTimestamp = getMatchingTimestamp(box, newTimestamp);
if(matchingTimestamp != null){
newTimestamp = matchingTimestamp;
}
Map<String, List<Food>> valueMap = castDynamicMap(box.get(newTimestamp));
List<Food> values = [];
if(valueMap.containsKey(mealType)){
values = valueMap[mealType]!;
}
values.add(value);
valueMap[mealType] = values;
box.put(newTimestamp, valueMap);
}
getRandomTimestampForTesting(){
DateTime now = DateTime.now();
DateTime startOfWeek = now.subtract(Duration(days: now.weekday - 1));
DateTime endOfWeek = startOfWeek.add(const Duration(days: 6));
Random random = Random();
int randomMilliseconds = random.nextInt(endOfWeek.millisecondsSinceEpoch - startOfWeek.millisecondsSinceEpoch);
DateTime randomTimestamp = startOfWeek.add(Duration(milliseconds: randomMilliseconds));
return randomTimestamp;
}
int getAllEatenCaloriesByBox(Box box){
num sum = 0;
for(int i = 0; i < box.keys.length;i++){
for(Food food in box.get(box.keys.elementAt(i))){
sum += food.calories;
}
}
return sum as int;
}
double getCaloryTargetForOneDay(){
final Box userBox = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
return userBox.get("USER").kalorien.toDouble();
}
List<double> getAllEatenIngredientsForTodayStatistics(double dayLen){
Box box = Hive.box(progressBoxName);
final Box userBox = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
final calorieSummary = userBox.get("USER").kalorien;
const double fatPercentPerThousandCalorie = 3.7;
const double proteinPercentPerThousandCalorie = 4.5;
const double carbsPercentPerThousandCalorie = 12.8;
double fatSummary = (calorieSummary / 100) * fatPercentPerThousandCalorie;
double carbSummary = (calorieSummary / 100) * carbsPercentPerThousandCalorie;
double proteinSummary = (calorieSummary / 100) * proteinPercentPerThousandCalorie;
num fat = 0;
num protein = 0;
num carbs = 0;
for(int i = 0; i < box.keys.length;i++){
for(Food food in box.get(box.keys.elementAt(i))){
fat += food.fatg;
protein += food.proteing;
carbs += food.carbohydrateg;
}
}
return [
fat.roundToDouble(),
protein.roundToDouble(),
carbs.roundToDouble(),
fatSummary * dayLen,
proteinSummary * dayLen,
carbSummary * dayLen,
calorieSummary * dayLen
];
}
void updateCalculationsAndNotfiyListenersForTodayStatistics(){
dailyAverageForCurrentWeek.value = getAverageCaloriesForCurrentWeekOnDailyBasis();
weeklyCaloryRanking.value = getWeeklyCaloryRanking();
barChartData.value = getBarChartData();
}
void updateProgressBoxValues(){
Box box = Hive.box(statisticsBoxName);
box.clear();
int timestamp = getTimestampFromNow();
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
for(int i = 0;i < currentWeek.length;i++){
getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],box);
}
updateCalculationsAndNotfiyListenersForTodayStatistics();
}
int getAverageCaloriesForCurrentWeekOnDailyBasis(){
Box box = Hive.box(statisticsBoxName);
return getAllEatenCaloriesByBox(box)~/7;
}
List<Food> getWeeklyCaloryRanking(){
int timestamp = getTimestampFromNow();
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
List<Food> allFoodsOfWeek = [];
for(int i = 0;i < currentWeek.length;i++){
Map<String,List<Food>> foodFromMainBox = getFoodMapForGivenTimestampFromMainBox(currentWeek[i]);
Iterable<String> keys = foodFromMainBox.keys;
if(keys.isNotEmpty){
for(int i = 0; i < keys.length;i++ ){
allFoodsOfWeek.addAll(foodFromMainBox[keys.elementAt(i)] as Iterable<Food>);
}
}
}
allFoodsOfWeek.sort((a, b) => b.calories - a.calories);
return getListOfDistinctElements(allFoodsOfWeek);
}
int getSumOfCaloriesByFoodList(List<Food> foods){
int sum = 0;
for(int i = 0; i < foods.length;i++){
try{
sum += foods[i].calories as int;
}catch(e){
throw const FormatException('please check formats');
}
}
return sum;
}
List<BarChartGroupData> getBarChartData(){
int timestamp = getTimestampFromNow();
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
int maxValue = 0;
List<List<int>> result =
[
[0,0,0],
[0,0,0],
[0,0,0],
[0,0,0],
[0,0,0],
[0,0,0],
[0,0,0],
]; //[[breakfast,lunch,dinner],[breakfast,lunch,dinner] ...]
for(int i = 0;i < currentWeek.length;i++){
Map<String,List<Food>> foodMapFromMainBoxByTimestamp = getFoodMapForGivenTimestampFromMainBox(currentWeek[i]);
Iterable<String> keys = foodMapFromMainBoxByTimestamp.keys;
if(keys.isNotEmpty){
for(int j = 0; j < keys.length;j++){
int value = getSumOfCaloriesByFoodList(foodMapFromMainBoxByTimestamp[keys.elementAt(j)] ?? []);
if(value > maxValue){
maxValue = value;
}
result[i][j] = value;
}
}
}
return [
BarChartGroupData(
x: 0,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[0][0].toDouble(), // First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[0][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[0][2].toDouble(), // Second segment color
),],
),
BarChartGroupData(
x: 1,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[1][0].toDouble(),
// First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[1][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[1][2].toDouble(), // Second segment color
),],
),
BarChartGroupData(
x: 2,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[2][0].toDouble(), // First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[2][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[2][2].toDouble(), // Second segment color
),],
),
BarChartGroupData(
x: 3,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[3][0].toDouble(), // First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[3][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[3][2].toDouble(), // Second segment color
),],
showingTooltipIndicators: [0],
),
BarChartGroupData(
x: 4,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[4][0].toDouble(), // First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[4][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[4][2].toDouble(), // Second segment color
),],
),
BarChartGroupData(
x: 5,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[5][0].toDouble(), // First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[5][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[5][2].toDouble(), // Second segment color
),],
),
BarChartGroupData(
x: 6,
barRods: [BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.yellow,
toY: result[6][0].toDouble(), // First segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.red,
toY: result[6][1].toDouble(), // Second segment color
), BarChartRodData(
width: 7.5, // Adjust the width of the bar if needed
color: Colors.green,
toY: result[6][2].toDouble(), // Second segment color
),], showingTooltipIndicators: [0],
),
];
}
getTimestampFromNow(){
DateTime now = DateTime.now();
return now.millisecondsSinceEpoch.toInt() ~/ 1000;
}
List<Food> getMealsOfTodayByMealtype(String mealtype){
int timestamp = getTimestampFromNow();
return getFoodMapForGivenTimestampFromMainBox(timestamp)[mealtype] ?? [];
}
}

View File

@ -1,18 +0,0 @@
import 'package:flutter/material.dart';
class HeaderButton extends StatelessWidget {
final String buttonText;
final Widget page;
const HeaderButton(this.buttonText, this.page, {super.key});
@override
Widget build(BuildContext context) {
return ElevatedButton(onPressed: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => page),
);
}, child: Text(buttonText));
}
}

View File

@ -1,35 +0,0 @@
import 'package:ernaehrung/web/component/header_button_component.dart';
import 'package:flutter/cupertino.dart';
class HeaderComponentWeb extends StatelessWidget {
HeaderComponentWeb({Key? key}) : super(key: key);
final List<HeaderData> headerButtons = [
HeaderData("Heute", const Placeholder()),
HeaderData("Fortschritt", const Placeholder()),
HeaderData("Mahlzeitplan", const Placeholder())
];
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: List.generate(headerButtons.length, (index) =>
HeaderButton(headerButtons[index].buttonText, headerButtons[index].page))
);
}
}
class HeaderData{
final String buttonText;
final Widget page;
HeaderData(this.buttonText, this.page);
@override
String toString() {
return 'HeaderData{route: $page, buttonText: $buttonText}';
}
}

View File

@ -1,41 +0,0 @@
import 'package:ernaehrung/android/components/statistics_circular_indicator_component.dart';
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:flutter/cupertino.dart';
import 'package:hive_flutter/adapters.dart';
import '../../android/components/card_component.dart';
import '../../android/components/diet_chart_component.dart';
class SectionComponent extends StatelessWidget {
const SectionComponent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: [
StatisticsPercentComponent(300, 100, 400),
DietChatComponent(1500),
ValueListenableBuilder(
valueListenable: Hive.box("TODAY").listenable(),
builder: (context, box, widget) {
return ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: box.keys.length,
itemBuilder: (context, i) {
if(box.keyAt(i).toString() == "DATE"){
return const SizedBox.shrink();
}else{
return CardComponent(
eatingMealName: box.keyAt(i).toString(),
selectedMeal: castDynamicToListFood(box.getAt(i)),
);
}
}
);
}),
],
),
);
}
}

View File

@ -1,31 +0,0 @@
import 'package:ernaehrung/web/component/header_component.dart';
import 'package:ernaehrung/web/component/section_component.dart';
import 'package:flutter/material.dart';
class MobileScreen extends StatelessWidget {
const MobileScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
return SizedBox(
width: screenWidth,
height: screenWidth,
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8),
child: Column(
children: [
HeaderComponentWeb(),
Container(
margin: const EdgeInsets.fromLTRB(0, 24, 0, 0),
child: const Center(
child: SectionComponent()
),
)
],
),
),
));
}
}

View File

@ -1,61 +0,0 @@
import 'package:ernaehrung/web/mobile.dart';
import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
class WebApp extends StatelessWidget {
const WebApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Sizer(
builder: (context, orientation, deviceType) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Sizer',
theme: ThemeData.light(),
home: const HomeScreen() ,
);
},
);
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
bool isDesktop(BuildContext context) => MediaQuery.of(context).size.width >= 1028;
bool isTablet(BuildContext context) =>
MediaQuery.of(context).size.width >= 768 && MediaQuery.of(context).size.width <= 1027;
bool isMobile(BuildContext context) => MediaQuery.of(context).size.width <= 767;
Widget getDeviceType(context){
if(isDesktop(context)){
return const Text("Desktop");
}else if(isTablet(context)){
return const Text("Tablet");
}else if(isMobile(context)){
return const MobileScreen();
}
return const SizedBox.shrink();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: [
getDeviceType(context),
],
)
);
}
}

View File

@ -6,6 +6,10 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <dynamic_color/dynamic_color_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);
} }

View File

@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST

View File

@ -5,8 +5,12 @@
import FlutterMacOS import FlutterMacOS
import Foundation import Foundation
import dynamic_color
import macos_ui
import path_provider_foundation import path_provider_foundation
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
MacOSUiPlugin.register(with: registry.registrar(forPlugin: "MacOSUiPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
} }

View File

@ -1,794 +0,0 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "8880b4cfe7b5b17d57c052a5a3a8cc1d4f546261c7cc8fbd717bd53f48db0568"
url: "https://pub.dev"
source: hosted
version: "59.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: a89627f49b0e70e068130a36571409726b04dab12da7e5625941d2c8ec278b96
url: "https://pub.dev"
source: hosted
version: "5.11.1"
animate_gradient:
dependency: "direct main"
description:
name: animate_gradient
sha256: de5fa49579fed8184a9d9d30c3f46a74a3227ba148d283c20bc0e92ed9cc1545
url: "https://pub.dev"
source: hosted
version: "0.0.2"
args:
dependency: transitive
description:
name: args
sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a
url: "https://pub.dev"
source: hosted
version: "2.4.1"
assorted_layout_widgets:
dependency: "direct main"
description:
name: assorted_layout_widgets
sha256: "63f96e75d78a037987696e0ad24be9dd18c8404d16b0785d159f4a72f2ca490d"
url: "https://pub.dev"
source: hosted
version: "8.0.0"
async:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
url: "https://pub.dev"
source: hosted
version: "2.10.0"
basic_utils:
dependency: "direct main"
description:
name: basic_utils
sha256: "8815477fcf58499e42326bd858e391442425fa57db9a45e48e15224c62049262"
url: "https://pub.dev"
source: hosted
version: "5.5.4"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
build:
dependency: transitive
description:
name: build
sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
build_config:
dependency: transitive
description:
name: build_config
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
url: "https://pub.dev"
source: hosted
version: "1.1.1"
build_daemon:
dependency: transitive
description:
name: build_daemon
sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95
url: "https://pub.dev"
source: hosted
version: "2.2.0"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727
url: "https://pub.dev"
source: hosted
version: "2.3.3"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292"
url: "https://pub.dev"
source: hosted
version: "7.2.7"
built_collection:
dependency: transitive
description:
name: built_collection
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
url: "https://pub.dev"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d"
url: "https://pub.dev"
source: hosted
version: "8.5.0"
card_swiper:
dependency: "direct main"
description:
name: card_swiper
sha256: "0c94c538f47be1dab52d018d4900a7046b4cb0700dc7f95b8628da89d1212b35"
url: "https://pub.dev"
source: hosted
version: "2.0.4"
characters:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
url: "https://pub.dev"
source: hosted
version: "1.2.1"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
url: "https://pub.dev"
source: hosted
version: "2.0.3"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
version: "1.1.1"
code_builder:
dependency: transitive
description:
name: code_builder
sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe"
url: "https://pub.dev"
source: hosted
version: "4.4.0"
collection:
dependency: transitive
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
url: "https://pub.dev"
source: hosted
version: "1.17.0"
convert:
dependency: transitive
description:
name: convert
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
crypto:
dependency: transitive
description:
name: crypto
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
url: "https://pub.dev"
source: hosted
version: "3.0.3"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
url: "https://pub.dev"
source: hosted
version: "1.0.5"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad
url: "https://pub.dev"
source: hosted
version: "2.3.1"
empty_widget:
dependency: "direct main"
description:
name: empty_widget
sha256: aad8073e5fb43eadde7007db1e2fea7acd33d0d33cff031e31a6675ca0a3e7fb
url: "https://pub.dev"
source: hosted
version: "0.0.5"
equatable:
dependency: transitive
description:
name: equatable
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
url: "https://pub.dev"
source: hosted
version: "2.0.5"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
url: "https://pub.dev"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
url: "https://pub.dev"
source: hosted
version: "6.1.4"
fixnum:
dependency: transitive
description:
name: fixnum
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
fl_chart:
dependency: "direct main"
description:
name: fl_chart
sha256: "48a1b69be9544e2b03d9a8e843affd89e43f3194c9248776222efcb4206bb1ec"
url: "https://pub.dev"
source: hosted
version: "0.62.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_dotenv:
dependency: "direct main"
description:
name: flutter_dotenv
sha256: d9283d92059a22e9834bc0a31336658ffba77089fb6f3cc36751f1fc7c6661a3
url: "https://pub.dev"
source: hosted
version: "5.0.2"
flutter_form_builder:
dependency: "direct main"
description:
name: flutter_form_builder
sha256: "236c96dad143a0e67c0f11522606d6b17b6510e97530cb73af355b018ded7c10"
url: "https://pub.dev"
source: hosted
version: "8.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
url: "https://pub.dev"
source: hosted
version: "2.0.1"
flutter_localizations:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
form_builder_validators:
dependency: "direct main"
description:
name: form_builder_validators
sha256: f2d90439c56345c23ad8d0c2912e4002cd02563d816f4387c9495051c10d3321
url: "https://pub.dev"
source: hosted
version: "8.6.1"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
glob:
dependency: transitive
description:
name: glob
sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
graphs:
dependency: transitive
description:
name: graphs
sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
url: "https://pub.dev"
source: hosted
version: "2.2.0"
hive:
dependency: "direct main"
description:
name: hive
sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
url: "https://pub.dev"
source: hosted
version: "2.2.3"
hive_flutter:
dependency: "direct main"
description:
name: hive_flutter
sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc
url: "https://pub.dev"
source: hosted
version: "1.1.0"
hive_generator:
dependency: "direct dev"
description:
name: hive_generator
sha256: "65998cc4d2cd9680a3d9709d893d2f6bb15e6c1f92626c3f1fa650b4b3281521"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
http:
dependency: transitive
description:
name: http
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
url: "https://pub.dev"
source: hosted
version: "0.13.6"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
intl:
dependency: transitive
description:
name: intl
sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
url: "https://pub.dev"
source: hosted
version: "0.17.0"
io:
dependency: transitive
description:
name: io
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
js:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.dev"
source: hosted
version: "0.6.5"
json_annotation:
dependency: transitive
description:
name: json_annotation
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
url: "https://pub.dev"
source: hosted
version: "4.8.1"
lints:
dependency: transitive
description:
name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
logging:
dependency: transitive
description:
name: logging
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
matcher:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
url: "https://pub.dev"
source: hosted
version: "0.12.13"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev"
source: hosted
version: "0.2.0"
matrix4_transform:
dependency: transitive
description:
name: matrix4_transform
sha256: "6ddeaa2c0e1f5c3f3a197f552377570b3e54fa0b8bf48507728a216fc0fd78a6"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
meta:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
url: "https://pub.dev"
source: hosted
version: "1.8.0"
mime:
dependency: transitive
description:
name: mime
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
url: "https://pub.dev"
source: hosted
version: "1.0.4"
package_config:
dependency: transitive
description:
name: package_config
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
path:
dependency: transitive
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
url: "https://pub.dev"
source: hosted
version: "1.8.2"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4
url: "https://pub.dev"
source: hosted
version: "2.0.14"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
url: "https://pub.dev"
source: hosted
version: "2.0.27"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183
url: "https://pub.dev"
source: hosted
version: "2.2.2"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1"
url: "https://pub.dev"
source: hosted
version: "2.1.10"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
url: "https://pub.dev"
source: hosted
version: "2.0.6"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
url: "https://pub.dev"
source: hosted
version: "2.1.6"
percent_indicator:
dependency: "direct main"
description:
name: percent_indicator
sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c
url: "https://pub.dev"
source: hosted
version: "4.2.3"
platform:
dependency: transitive
description:
name: platform
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
pointycastle:
dependency: transitive
description:
name: pointycastle
sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
url: "https://pub.dev"
source: hosted
version: "3.7.3"
pool:
dependency: transitive
description:
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
url: "https://pub.dev"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
url: "https://pub.dev"
source: hosted
version: "4.2.4"
pub_semver:
dependency: transitive
description:
name: pub_semver
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367
url: "https://pub.dev"
source: hosted
version: "1.2.3"
responsive_framework:
dependency: "direct main"
description:
name: responsive_framework
sha256: "07bbe163bd67708160f3d11abaf6b34ae5b718e4250d83aa9a8a9496325f6b8a"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
searchable_listview:
dependency: "direct main"
description:
name: searchable_listview
sha256: "0a158665571e03890408e2d5569f0673a36f79fac5a671a54495b52f67b93b63"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
shelf:
dependency: transitive
description:
name: shelf
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
url: "https://pub.dev"
source: hosted
version: "1.4.1"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
sizer:
dependency: "direct main"
description:
name: sizer
sha256: d2b3cb6cbc4a637f508dacd786bae55df31e5fc088044248a43e4fd1e050c117
url: "https://pub.dev"
source: hosted
version: "2.0.15"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_gen:
dependency: transitive
description:
name: source_gen
sha256: b20e191de6964e98032573cecb1d2b169d96ba63fdb586d24dcd1003ba7e94f6
url: "https://pub.dev"
source: hosted
version: "1.3.0"
source_helper:
dependency: transitive
description:
name: source_helper
sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
source_span:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev"
source: hosted
version: "1.9.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
source: hosted
version: "1.11.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
stream_transform:
dependency: transitive
description:
name: stream_transform
sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
url: "https://pub.dev"
source: hosted
version: "0.4.16"
timing:
dependency: transitive
description:
name: timing
sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
universal_io:
dependency: transitive
description:
name: universal_io
sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
watcher:
dependency: transitive
description:
name: watcher
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
url: "https://pub.dev"
source: hosted
version: "2.4.0"
win32:
dependency: transitive
description:
name: win32
sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
url: "https://pub.dev"
source: hosted
version: "4.1.4"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
url: "https://pub.dev"
source: hosted
version: "1.0.0"
yaml:
dependency: transitive
description:
name: yaml
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
sdks:
dart: ">=2.19.6 <3.0.0"
flutter: ">=3.7.0"

View File

@ -48,7 +48,12 @@ dependencies:
fl_chart: ^0.62.0 fl_chart: ^0.62.0
basic_utils: ^5.5.4 basic_utils: ^5.5.4
flutter_form_builder: ^8.0.0 flutter_form_builder: ^8.0.0
form_builder_validators: ^8.6.1 form_builder_validators: ^8.0.0
fluttertoast: ^8.0.7
flutter_profile_picture: ^2.0.0
bs_flutter_modal: ^1.0.6
adaptive_dialog: ^1.8.3+1
path_provider: ^2.0.15
dev_dependencies: dev_dependencies:
@ -78,9 +83,6 @@ flutter:
assets: assets:
- assets/json/csvjson_full.json - assets/json/csvjson_full.json
- assets/json/csvjson_minified.json - assets/json/csvjson_minified.json
- assets/images/fries.png
- assets/images/ice.png
- assets/images/tea.png
- .env - .env
# To add assets to your application, add an assets section, like this: # To add assets to your application, add an assets section, like this:
# assets: # assets:

View File

@ -0,0 +1,356 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:hive/src/adapters/date_time_adapter.dart';
import 'package:hive/src/hive_impl.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';
class _TestAdapter extends TypeAdapter<int> {
_TestAdapter([this.typeId = 0]);
@override
final int typeId;
@override
int read(_) => 5;
@override
void write(_, __) {}
}
void main() {
// Initialize hive.
Hive.initFlutter();
group('HiveImpl', () {
Future<HiveImpl> initHive() async {
await Hive.initFlutter();
var hive = HiveImpl();
var path = "/assets/";
if (!kIsWeb) {
var appDocDir = await getApplicationDocumentsDirectory();
path = appDocDir.path;
}
hive.init(path);
return hive;
}
test('.init()', () {
var hive = HiveImpl();
expect(() => hive.init('MYPATH'), returnsNormally);
expect(hive.homePath, 'MYPATH');
expect(
hive.findAdapterForValue(DateTime.now())!.adapter,
isA<DateTimeWithTimezoneAdapter>(),
);
expect(hive.findAdapterForTypeId(16)!.adapter, isA<DateTimeAdapter>());
});
group('.openBox()', () {
group('box already open', () {
test('opened box is returned if it exists', () async {
var hive = await initHive();
var testBox = await hive.openBox('TESTBOX');
var testBox2 = await hive.openBox('testBox');
expect(testBox == testBox2, true);
await hive.close();
});
test('throw HiveError if opened box is lazy', () async {
var hive = await initHive();
await hive.openLazyBox('LAZYBOX');
await expectLater(
() => hive.openBox('lazyBox'),
throwsUnimplementedError,
);
await hive.close();
});
test('throw HiveError if already opening box is lazy', () async {
var hive = await initHive();
await Future.wait([
hive.openLazyBox('TESTBOX'),
expectLater(hive.openBox('testbox'), throwsUnimplementedError)
]);
});
test('same box returned if it is already opening', () async {
var hive = await initHive();
Box? box1;
Box? box2;
await Future.wait([
hive.openBox('TESTBOX').then((value) => box1 = value),
hive.openBox('testbox').then((value) => box2 = value)
]);
expect(box1 == box2, true);
});
});
});
group('.openLazyBox()', () {
group('box already open', () {
test('opened box is returned if it exists', () async {
var hive = await initHive();
var testBox = await hive.openLazyBox('TESTBOX');
var testBox2 = await hive.openLazyBox('testBox');
expect(testBox == testBox2, true);
await hive.close();
});
test('same box returned if it is already opening', () async {
LazyBox? box1;
LazyBox? box2;
var hive = await initHive();
await Future.wait([
hive.openLazyBox('LAZYBOX').then((value) => box1 = value),
hive.openLazyBox('lazyBox').then((value) => box2 = value)
]);
expect(box1 == box2, true);
});
test('throw HiveError if opened box is not lazy', () async {
var hive = await initHive();
await hive.openBox('LAZYBOX');
await expectLater(
() => hive.openLazyBox('lazyBox'),
throwsUnimplementedError,
);
await hive.close();
});
test('throw HiveError if already opening box is not lazy', () async {
var hive = await initHive();
await Future.wait([
hive.openBox('LAZYBOX'),
expectLater(hive.openLazyBox('lazyBox'), throwsUnimplementedError)
]);
});
});
});
group('.box()', () {
test('returns already opened box', () async {
var hive = await initHive();
var box = await hive.openBox('TESTBOX');
expect(hive.box('testBox'), box);
expect(() => hive.box('other'), throwsArgumentError);
await hive.close();
});
test('throws HiveError if box type does not match', () async {
var hive = await initHive();
await hive.openBox<int>('INTBOX');
expect(
() => hive.box('intBox'),
throwsArgumentError,
);
await hive.openBox('DYNAMICBOX');
expect(
() => hive.box<int>('dynamicBox'),
throwsArgumentError,
);
await hive.openLazyBox('LAZYBOX');
expect(
() => hive.box('lazyBox'),
throwsArgumentError,
);
await hive.close();
});
});
group('.lazyBox()', () {
test('returns already opened box', () async {
var hive = await initHive();
var box = await hive.openLazyBox('TESTBOX');
expect(hive.lazyBox('testBox'), box);
expect(() => hive.lazyBox('other'), throwsArgumentError);
await hive.close();
});
test('throws HiveError if box type does not match', () async {
var hive = await initHive();
await hive.openLazyBox<int>('INTBOX');
expect(
() => hive.lazyBox('intBox'),
throwsArgumentError,
);
await hive.openLazyBox('DYNAMICBOX');
expect(
() => hive.lazyBox<int>('dynamicBox'),
throwsArgumentError,
);
await hive.openBox('BOX');
expect(
() => hive.lazyBox('box'),
throwsArgumentError,
);
await hive.close();
});
});
test('isBoxOpen()', () async {
var hive = await initHive();
await hive.openBox('testBox');
expect(hive.isBoxOpen('testBox'), true);
expect(hive.isBoxOpen('nonExistingBox'), false);
await hive.close();
});
test('.close()', () async {
var hive = await initHive();
var box1 = await hive.openBox('box1');
var box2 = await hive.openBox('box2');
expect(box1.isOpen, true);
expect(box2.isOpen, true);
await hive.close();
expect(box1.isOpen, false);
expect(box2.isOpen, false);
});
test('.generateSecureKey()', () {
var hive = HiveImpl();
var key1 = hive.generateSecureKey();
var key2 = hive.generateSecureKey();
expect(key1.length, 32);
expect(key2.length, 32);
expect(key1, isNot(key2));
});
group('.deleteBoxFromDisk()', () {
test('deletes open box', () async {
var hive = await initHive();
var box1 = await hive.openBox('testBox1');
await box1.put('key', 'value');
var box1File = File(box1.path!);
await hive.deleteBoxFromDisk('testBox1');
expect(await box1File.exists(), false);
expect(hive.isBoxOpen('testBox1'), false);
await hive.close();
});
test('deletes closed box', () async {
var hive = await initHive();
var box1 = await hive.openBox('testBox1');
await box1.put('key', 'value');
var path = box1.path!;
await box1.close();
var box1File = File(path);
await hive.deleteBoxFromDisk('testBox1');
expect(await box1File.exists(), false);
expect(hive.isBoxOpen('testBox1'), false);
await hive.close();
});
test('does nothing if files do not exist', () async {
var hive = await initHive();
await hive.deleteBoxFromDisk('testBox1');
await hive.close();
});
});
test('.deleteFromDisk()', () async {
var hive = await initHive();
var box1 = await hive.openBox('testBox1');
await box1.put('key', 'value');
var box1File = File(box1.path!);
var box2 = await hive.openBox('testBox2');
await box2.put('key', 'value');
var box2File = File(box1.path!);
await hive.deleteFromDisk();
expect(await box1File.exists(), false);
expect(await box2File.exists(), false);
expect(hive.isBoxOpen('testBox1'), false);
expect(hive.isBoxOpen('testBox2'), false);
await hive.close();
});
group('.boxExists()', () {
test('returns true if a box was created', () async {
var hive = await initHive();
await hive.openBox('testBox1');
expect(await hive.boxExists('testBox1'), true);
await hive.close();
});
test('returns false if no box was created', () async {
var hive = await initHive();
expect(await hive.boxExists('testBox1'), false);
await hive.close();
});
test('returns false if box was created and then deleted', () async {
var hive = await initHive();
await hive.openBox('testBox1');
await hive.deleteBoxFromDisk('testBox1');
expect(await hive.boxExists('testBox1'), false);
await hive.close();
});
});
group('.resetAdapters()', () {
test('returns normally', () async {
final hive = await initHive();
expect(hive.resetAdapters, returnsNormally);
});
test('clears an adapter', () async {
final hive = await initHive();
final adapter = _TestAdapter(1);
expect(hive.isAdapterRegistered(adapter.typeId), isFalse);
hive.registerAdapter(adapter);
expect(hive.isAdapterRegistered(adapter.typeId), isTrue);
hive.resetAdapters();
expect(hive.isAdapterRegistered(adapter.typeId), isFalse);
});
});
});
}

View File

@ -0,0 +1,98 @@
import 'package:ernaehrung/helper/format_helper.dart';
import 'package:ernaehrung/models/food.dart';
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
import 'package:ernaehrung/services/statistics.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';
// TO RUN TESTS COMMENT initBoxes() (services/statistics.dart line 21) out -> HIVE behavior is tested in other tests
late DataService dataService;
Future<void> main() async {
await dotenv.load(fileName: ".env");
setUp(() async {
dataService = DataService.instance;
});
tearDown(() async {
//await Hive.close(); // Close Hive at the end of tests
});
getTimestampFromNow(){
DateTime now = DateTime.now();
return now.millisecondsSinceEpoch.toInt() ~/ 1000;
}
getTimeStampForDateTime(DateTime date){
return date.millisecondsSinceEpoch.toInt() ~/ 1000;
}
getFoodListValid(){
// 1500kcal
return [
Food(167511, "Testfood","",300,0,0,0,0,0),
Food(167512, "TestfoodTestfoodTestfoodTestfood","",300,0,0,0,0,0),
Food(167512, "","",300,0,0,0,0,0),
Food(167512, "","",300,0,0,0,0,0),
Food(167512, "","",300,0,0,0,0,0)
];
}
getInvalidFoodList(){
return [
Food(167512, "","",300,0,0,0,0,0),
Food(167512, "","",300,0,0,0,0,0),
Food(167512, "","",300,0,0,0,0,0),
Food(167512, "","","300",0,0,0,0,0),
Food(167512, "","",-200,0,0,0,0,0)
];
}
test('check if given timestamp returns valid timespan or catches invalid timestamp', () {
List<int> day = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.day,getTimestampFromNow());
expect(31, day.length);
List<int> week = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.week,getTimestampFromNow());
expect(7, week.length);
List<int> month = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.month,getTimestampFromNow());
expect(31, month.length);
List<int> invalidTimestamp = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.month,9999999999999);
expect(0, invalidTimestamp.length);
});
test('check if dates are returned correctly from timestamp', () {
int day = dataService.getDayAsIntFromTimestamp(getTimestampFromNow());
expect(DateTime.now().day, day);
int month = dataService.getMonthAsIntFromTimestamp(getTimestampFromNow());
expect(DateTime.now().month, month);
int year = dataService.getYearAsIntFromTimestamp(getTimestampFromNow());
expect(DateTime.now().year, year);
});
test('check if date comparison is right', () {
int today = getTimestampFromNow();
expect(true,dataService.isDateEqual(today, today));
int other = getTimeStampForDateTime(DateTime.utc(2010));
expect(false,dataService.isDateEqual(today, other));
expect(false,dataService.isDateEqual(9999999999999, today));
expect(false,dataService.isDateEqual(other, 9999999999999));
expect(false,dataService.isDateEqual(other, -1));
expect(false,dataService.isDateEqual(other, 0));
});
test('check if calories are summed up correctly for given food list',() {
expect(1500, dataService.getSumOfCaloriesByFoodList(getFoodListValid()));
expect(() => dataService.getSumOfCaloriesByFoodList(getInvalidFoodList()),throwsException);
});
test('check if format helper are working right',() {
expect(2,getListOfDistinctElements(getFoodListValid()).length);
expect(3,getMapOfDistinctElementsWithCounterAndCalories(getFoodListValid()).keys.length);
expect("Testfood",getToastFoodNameString(getFoodListValid()[0],null));
expect("TestfoodTestfoodTestfo ...",getToastFoodNameString(getFoodListValid()[1],null));
Food food = getFoodListValid()[0];
expect("Testfood 2 x 600 kcal", getFoodListStringByFood(food.name, 2, 600,null));
});
}