Compare commits

..

No commits in common. "main" and "lauritz-branch" have entirely different histories.

86 changed files with 3126 additions and 2885 deletions

View File

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

View File

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

9
.env
View File

@ -13,8 +13,7 @@ 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 MEALPLAN_BOX=MEALPLAN
PROGRESS_BOX=PROGRESS STATISTICS_TODAY_BOX=STATISTICS_TODAY
STATISTICS_BOX=STATISTICS STATISTICS_PROGRESS_BOX=STATISTICS_PROGRESS
MAIN_BOX=MAIN STATISTICS_MAIN_BOX=STATISTICS_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":"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"} {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"C:\\\\Users\\\\FUCHSLAU\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.2.2\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"C:\\\\Users\\\\FUCHSLAU\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.0.27\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_foundation","path":"C:\\\\Users\\\\FUCHSLAU\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.2.2\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\Users\\\\FUCHSLAU\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.1.10\\\\","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\Users\\\\FUCHSLAU\\\\AppData\\\\Local\\\\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-06-01 13:16:00.226015","version":"3.10.2"}

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 B

View File

@ -1,8 +1,8 @@
import 'package:ernaehrung/pages/nav_pages/main_page.dart'; import 'package:ernaehrung/android/pages/nav_pages/main_page.dart';
import 'package:ernaehrung/pages/user_data_form/initial_user_data_form.dart'; import 'package:ernaehrung/android/pages/welcome.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>(dotenv.env['USER_BOX'] ?? 'USER'); final box = Hive.box<User>('USER_BOX');
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.shade200, //<-- SEE scaffoldBackgroundColor: Colors.grey.shade100, //<-- SEE
), ),
home: box.get("USER") == null ? const OnboardingPage() : const MainPage(), home: box.get("USER") == null ? const OnboardingPage() : const MainPage(),
routes: { routes: {

View File

@ -0,0 +1,28 @@
import 'package:ernaehrung/android/components/food_list_component.dart';
import 'package:ernaehrung/android/config/statistics.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(StatisticsService.instance.todayStatisticsBoxName),)
],
),
);
}
}

View File

@ -0,0 +1,74 @@
import 'package:basic_utils/basic_utils.dart';
import 'package:ernaehrung/android/components/card/card_data_food_component.dart';
import 'package:ernaehrung/android/components/card/card_title_component.dart';
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:flutter/material.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});
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(
StringUtils.capitalize(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

@ -0,0 +1,40 @@
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 SizedBox(
height: 180,
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 Column(
children: [
CardFoodItemComponent(foods[i]),
Divider(
color: Colors.grey.shade300,
thickness: 1.2,
)
],
);
})
],
),
)),
);
}
}

View File

@ -0,0 +1,42 @@
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

@ -11,26 +11,18 @@ 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(12)) borderRadius: BorderRadius.all(Radius.circular(16))
), ),
child: Padding( child: Padding(
padding: padding:
const EdgeInsets.symmetric(vertical: 16,horizontal: 16), const EdgeInsets
.symmetric(
vertical: 16,
horizontal: 8
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [Text(title), Text(calories)],
Text(title,
style: const TextStyle(
fontSize: 20
),
),
Text(
calories,
style: const TextStyle(
fontSize: 17
),
)
],
), ),
), ),
); );

View File

@ -0,0 +1,155 @@
import 'package:basic_utils/basic_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import '../config/format_helper.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();
}
@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(
StringUtils.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

@ -0,0 +1,41 @@
import 'package:ernaehrung/android/config/statistics.dart';
import 'package:ernaehrung/android/models/user.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:percent_indicator/circular_percent_indicator.dart';
class CircularLoadingComponent extends StatelessWidget {
CircularLoadingComponent({Key? key}) : super(key: key);
final int? targetCaolries = Hive.box<User>("USER_BOX").get("USER")?.kalorien;
@override
Widget build(BuildContext context) {;
return ValueListenableBuilder(
valueListenable: StatisticsService.instance.eatenCalories,
builder: (context, value, child) {
double progress = double.parse((value / targetCaolries!).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/$targetCaolries Kcal",
textAlign: TextAlign.center,
),
progressColor: Colors.lightGreen,
),
],
);
},
);
}
}

View File

@ -1,15 +1,15 @@
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart'; import 'package:ernaehrung/android/components/meal_page_text/statistics_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 ProgressHorizontalChartComponent extends StatelessWidget { class LineCircularWiTextComponent extends StatelessWidget {
final Color progressColor; final Color progressColor;
final double value; final double value;
final int total; final int total;
final String textName; final String textName;
const ProgressHorizontalChartComponent( const LineCircularWiTextComponent(
this.progressColor, this.value, this.total, this.textName, this.progressColor, this.value, this.total, this.textName,
{super.key}); {super.key});
@ -22,7 +22,7 @@ class ProgressHorizontalChartComponent extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
HorizontalChartTextComponent(double.parse(value.toString()).toStringAsFixed(2), true), StaticsTextComponent(double.parse(value.toString()).toStringAsFixed(2), true),
const SizedBox(height: 4,), const SizedBox(height: 4,),
LinearPercentIndicator( LinearPercentIndicator(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
@ -31,7 +31,7 @@ class ProgressHorizontalChartComponent extends StatelessWidget {
progressColor: progressColor, progressColor: progressColor,
), ),
const SizedBox(height: 4,), const SizedBox(height: 4,),
HorizontalChartTextComponent(textName, false), StaticsTextComponent(textName, false),
], ],
), ),
); );

View File

@ -0,0 +1,74 @@
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

@ -0,0 +1,36 @@
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:ernaehrung/android/config/statistics.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 != StatisticsService.instance.todayStatisticsBoxName.toLowerCase(),
);
}
});
});
}
}

View File

@ -0,0 +1,102 @@
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> {
void storeFood() async {
StatisticsService.instance.addItemToMainBox(widget.food, widget.cardName);
final mealplanBox = Hive.box(dotenv.env['MEALPLAN_BOX']!);
if (!mealplanBox.isOpen){
Hive.openBox(dotenv.env['MEALPLAN_BOX']!);
}
addValuesToList(mealplanBox, 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,6 +1,6 @@
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart'; import 'package:ernaehrung/android/components/meal_page_text/days_text_component.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,35 +9,37 @@ enum TimeSpan {
} }
class TimespanTabsComponent extends StatefulWidget { class DaysMealPageComponent extends StatefulWidget {
const TimespanTabsComponent({Key? key}) : super(key: key); const DaysMealPageComponent({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _DaysMealPageState(); State<StatefulWidget> createState() => _DaysMealPageState();
} }
class _DaysMealPageState extends State<TimespanTabsComponent> { class _DaysMealPageState extends State<DaysMealPageComponent> {
int activatedIndex = 0; int activatedIndex = 0;
void updateValue(int index) { void updateValue(int index) {
setState(() { setState(() {
activatedIndex = index; activatedIndex = index;
if(activatedIndex == 0){ if(activatedIndex == 0){
DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.day); StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.day);
}else if(activatedIndex == 1){ }else if(activatedIndex == 1){
DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.week); StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.week);
}else if(activatedIndex == 2){ }else if(activatedIndex == 2){
DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.month); StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.month);
} }
}); });
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
TimespanTabsTextComponent( DaysTextComponent(
timeSpan: TimeSpan.day, timeSpan: TimeSpan.day,
textColor: activatedIndex == 0 textColor: activatedIndex == 0
? const Color(0xff47a44b) ? const Color(0xff47a44b)
@ -46,7 +48,7 @@ class _DaysMealPageState extends State<TimespanTabsComponent> {
index: 0 index: 0
), ),
TimespanTabsTextComponent( DaysTextComponent(
timeSpan: TimeSpan.week, timeSpan: TimeSpan.week,
textColor: activatedIndex == 1 textColor: activatedIndex == 1
? const Color(0xff47a44b) ? const Color(0xff47a44b)
@ -54,7 +56,7 @@ class _DaysMealPageState extends State<TimespanTabsComponent> {
onPressed: updateValue, onPressed: updateValue,
index: 1 index: 1
), ),
TimespanTabsTextComponent( DaysTextComponent(
timeSpan: TimeSpan.month, timeSpan: TimeSpan.month,
textColor: activatedIndex == 2 textColor: activatedIndex == 2
? const Color(0xff47a44b) ? const Color(0xff47a44b)
@ -63,6 +65,7 @@ class _DaysMealPageState extends State<TimespanTabsComponent> {
index: 2 index: 2
), ),
], ],
),
); );
} }
} }

View File

@ -1,17 +1,16 @@
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart'; import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
import 'package:ernaehrung/android/config/statistics.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../../../../../services/statistics.dart'; class DaysTextComponent extends StatelessWidget {
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 DataService statisticsService; late StatisticsService statisticsService;
TimespanTabsTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){ DaysTextComponent({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,19 @@
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

@ -0,0 +1,19 @@
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,10 +1,10 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
class HorizontalChartTextComponent extends StatelessWidget { class StaticsTextComponent extends StatelessWidget {
final String name; final String name;
final bool titleOrSecondary; final bool titleOrSecondary;
const HorizontalChartTextComponent(this.name, this.titleOrSecondary, {super.key}); const StaticsTextComponent(this.name, this.titleOrSecondary, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -0,0 +1,56 @@
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/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) {
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(),
),
),
),
),
Expanded(
child: ValueListenableBuilder<List<double>>(
valueListenable: StatisticsService.instance.ingredients,
builder: (context, value, child) {
print("value ${value}");
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// TODO adjust 200 to values from user box
LineCircularWiTextComponent(
Colors.lightGreen, value[0], 200, "Fat (g)"),
LineCircularWiTextComponent(
Colors.lightGreen, value[1], 200, "Protein (g)"),
LineCircularWiTextComponent(
Colors.lightGreen, value[2], 200, "Carbohydrate (g)"),
],
);
},
),
)
],
),
);
}
}

View File

@ -0,0 +1,20 @@
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

@ -0,0 +1,70 @@
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

@ -0,0 +1,27 @@
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(),
Text("$calorienBurned verbrannt"),
],
);
}
}

View File

@ -0,0 +1,192 @@
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,37 +1,14 @@
import 'package:flutter/cupertino.dart';
import '../models/food.dart'; import '../models/food.dart';
String getFoodListStringByFood(String foodName, int count, int calories, BuildContext? context){ String getFoodListStringByFood(String foodName, int count, int calories){
int maxWidth = 35; 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"; String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... $count x $calories kcal" : "$foodName $count x $calories kcal";
return limitedText; return limitedText;
} }
String getWeeklyRankingString(String foodName){
bool isScreenWidthAbove1000(BuildContext context) { int maxWidth = 45;
double screenWidth = MediaQuery.of(context).size.width; String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... " : foodName;
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; return limitedText;
} }
@ -47,7 +24,6 @@ Map<String,List<int>> getMapOfDistinctElementsWithCounterAndCalories(List<Food>
return resultMap; return resultMap;
} }
List<Food> getListOfDistinctElements(List<Food> foods){ List<Food> getListOfDistinctElements(List<Food> foods){
List<Food> result = []; List<Food> result = [];
for(int i = 0; i < foods.length;i++){ for(int i = 0; i < foods.length;i++){

View File

@ -7,10 +7,11 @@ final List<Food> emptyList = [];
void setupTodayBox() async{ void setupTodayBox() async{
final todayBox = Hive.box(dotenv.env['TODAY_BOX']!); final todayBox = Hive.box(dotenv.env['MEALPLAN_BOX']!);
putIfKeyNotExists(todayBox, 'FRÜHSTÜCK', []); putIfKeyNotExists(todayBox, 'FRÜHSTÜCK', []);
putIfKeyNotExists(todayBox, 'MITTAGESSEN', []); putIfKeyNotExists(todayBox, 'MITTAGESSEN', []);
putIfKeyNotExists(todayBox, 'ABENDESSEN', []); putIfKeyNotExists(todayBox, 'ABENDESSEN', []);
} }
@ -19,3 +20,6 @@ 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,52 +1,41 @@
import 'dart:math'; import 'dart:math';
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
import 'package:ernaehrung/android/config/cast_helper.dart';
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive/hive.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/food.dart';
import '../models/user.dart'; import 'format_helper.dart';
import '../helper/cast_helper.dart';
import '../helper/format_helper.dart';
class DataService { class StatisticsService {
static final DataService _instance = DataService._internal(); static final StatisticsService _instance = StatisticsService._internal();
factory DataService() => _instance; factory StatisticsService() => _instance;
static DataService get instance => _instance; static StatisticsService get instance => _instance;
DataService._internal() { StatisticsService._internal() {
// TO RUN TESTS -> COMMENT initBoxes() out -> HIVE behavior is tested in other tests
initBoxes(); initBoxes();
} }
String progressBoxName = dotenv.env['PROGRESS_BOX'] ?? 'PROGRESS_BOX'; final String todayStatisticsBoxName = dotenv.env['STATISTICS_TODAY_BOX'] ?? 'STATISTICS_TODAY_BOX';
String mainBoxName = dotenv.env['MAIN_BOX'] ?? 'MAIN_BOX'; final String mainStatisticsBoxName = dotenv.env['STATISTICS_MAIN_BOX'] ?? 'STATISTICS_MAIN_BOX';
String statisticsBoxName = dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS_BOX'; final String progressStatisticsBoxName = dotenv.env['STATISTICS_PROGRESS_BOX'] ?? 'STATISTICS_PROGRESS_BOX';
ValueNotifier<int> eatenCalories = ValueNotifier<int>(0); ValueNotifier<int> eatenCalories = ValueNotifier<int>(0);
/* ValueNotifier<List<double>> ingredients = ValueNotifier<List<double>>([0,0,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<int> dailyAverageForCurrentWeek = ValueNotifier<int>(0);
ValueNotifier<List<Food>> weeklyCaloryRanking = ValueNotifier<List<Food>>([]); ValueNotifier<List<Food>> weeklyCaloryRanking = ValueNotifier<List<Food>>([]);
ValueNotifier<List<BarChartGroupData>> barChartData = ValueNotifier<List<BarChartGroupData>>([]); ValueNotifier<List<BarChartGroupData>> barChartData = ValueNotifier<List<BarChartGroupData>>([]);
initBoxes()async{ initBoxes()async{
Box reducedBox = Hive.box(progressBoxName); Box reducedBox = Hive.box(todayStatisticsBoxName);
Box progressBox = Hive.box(statisticsBoxName); Box progressBox = Hive.box(progressStatisticsBoxName);
putIfKeyNotExists([reducedBox,progressBox], 'FRÜHSTÜCK', []); putIfKeyNotExists([reducedBox,progressBox], 'FRÜHSTÜCK', []);
putIfKeyNotExists([reducedBox,progressBox], 'MITTAGESSEN', []); putIfKeyNotExists([reducedBox,progressBox], 'MITTAGESSEN', []);
putIfKeyNotExists([reducedBox,progressBox], 'ABENDESSEN', []); putIfKeyNotExists([reducedBox,progressBox], 'ABENDESSEN', []);
updateStatisticsTodayBoxByTimespan(TimeSpan.day); updateReducedBoxByTimespan(TimeSpan.day);
} }
void putIfKeyNotExists(List<Box> boxes, String key, dynamic value) { void putIfKeyNotExists(List<Box> boxes, String key, dynamic value) {
@ -57,35 +46,34 @@ class DataService {
} }
} }
updateStatisticsTodayBoxByTimespan(TimeSpan timespan){ updateReducedBoxByTimespan(TimeSpan timeSpan){
clearBoxByBox(Hive.box(progressBoxName)); clearReducedBoxBeforeUpdate();
int timestamp = getTimestampFromNow(); int timestamp = getTimestampFromNow();
int dayLen = 1; switch(timeSpan){
switch(timespan){
case TimeSpan.day: case TimeSpan.day:
getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(progressBoxName)); getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(todayStatisticsBoxName));
break; break;
case TimeSpan.week: case TimeSpan.week:
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp); List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
for(int i = 0;i < currentWeek.length;i++){ for(int i = 0;i < currentWeek.length;i++){
getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(progressBoxName)); getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(todayStatisticsBoxName));
} }
dayLen = currentWeek.length;
break; break;
case TimeSpan.month: case TimeSpan.month:
List<int> currentMonth = getTimestampsByTimestampAndTimespan(TimeSpan.month,timestamp); List<int> currentMonth = getTimestampsByTimestampAndTimespan(TimeSpan.month,timestamp);
for(int i = 0;i < currentMonth.length;i++){ for(int i = 0;i < currentMonth.length;i++){
getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(progressBoxName)); getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(todayStatisticsBoxName));
} }
dayLen = currentMonth.length;
break; break;
} }
updateCalculationsAndNotfiyListenersForPorgressStatistics(dayLen); updateCalculationsAndNotfiyListenersForPorgressStatistics();
} }
void updateCalculationsAndNotfiyListenersForPorgressStatistics(int dayLen){ void updateCalculationsAndNotfiyListenersForPorgressStatistics(){
eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(progressBoxName)); eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(todayStatisticsBoxName));
ingredients.value = getAllEatenIngredientsForTodayStatistics(dayLen.roundToDouble()); eatenCalories.notifyListeners();
ingredients.value = getAllEatenIngredientsForTodayStatistics();
ingredients.notifyListeners();
} }
void getNewFoodAndUpdateBoxByTimestampAndBox(int timestamp, Box box){ void getNewFoodAndUpdateBoxByTimestampAndBox(int timestamp, Box box){
@ -95,19 +83,7 @@ class DataService {
} }
} }
bool timestampIsValid(int timestamp){
try{
DateTime.fromMillisecondsSinceEpoch(timestamp*1000);
return true;
}catch(e){
return false;
}
}
List<int> getTimestampsByTimestampAndTimespan(TimeSpan timespan, int timestamp) { List<int> getTimestampsByTimestampAndTimespan(TimeSpan timespan, int timestamp) {
if(!timestampIsValid(timestamp)){
return [];
}
int range = timespan == TimeSpan.week ? 7 : 31; int range = timespan == TimeSpan.week ? 7 : 31;
int targetWeekday = DateTime.monday; // Example target weekday (Monday) int targetWeekday = DateTime.monday; // Example target weekday (Monday)
DateTime currentDateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000); DateTime currentDateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
@ -123,7 +99,8 @@ class DataService {
return timestampsForWeekdays; return timestampsForWeekdays;
} }
clearBoxByBox(Box box){ clearReducedBoxBeforeUpdate(){
Box box = Hive.box(todayStatisticsBoxName);
for(int i = 0; i < box.keys.length;i++){ for(int i = 0; i < box.keys.length;i++){
box.put(box.keys.elementAt(i), []); box.put(box.keys.elementAt(i), []);
} }
@ -144,7 +121,7 @@ class DataService {
} }
Map<String,List<Food>> getFoodMapForGivenTimestampFromMainBox(int timestamp){ Map<String,List<Food>> getFoodMapForGivenTimestampFromMainBox(int timestamp){
Box box = Hive.box(mainBoxName); Box box = Hive.box(mainStatisticsBoxName);
dynamic matchingTimestamp = getMatchingTimestamp(box, timestamp); dynamic matchingTimestamp = getMatchingTimestamp(box, timestamp);
if(matchingTimestamp != null){ if(matchingTimestamp != null){
return castDynamicMap(box.get(matchingTimestamp)); return castDynamicMap(box.get(matchingTimestamp));
@ -175,9 +152,6 @@ class DataService {
} }
isDateEqual(int timestamp1, int timestamp2){ isDateEqual(int timestamp1, int timestamp2){
if(!timestampIsValid(timestamp1) || !timestampIsValid(timestamp2)){
return false;
}
return return
getDayAsIntFromTimestamp(timestamp1) == getDayAsIntFromTimestamp(timestamp2) && getDayAsIntFromTimestamp(timestamp1) == getDayAsIntFromTimestamp(timestamp2) &&
getMonthAsIntFromTimestamp(timestamp1) == getMonthAsIntFromTimestamp(timestamp2) && getMonthAsIntFromTimestamp(timestamp1) == getMonthAsIntFromTimestamp(timestamp2) &&
@ -186,7 +160,7 @@ class DataService {
addItemToMainBox(Food value, String mealType){ addItemToMainBox(Food value, String mealType){
// Hive.deleteFromDisk(); // Hive.deleteFromDisk();
Box box = Hive.box(mainBoxName); Box box = Hive.box(mainStatisticsBoxName);
DateTime dateTime = DateTime.now(); DateTime dateTime = DateTime.now();
// DEBUG // DEBUG
@ -230,24 +204,8 @@ class DataService {
return sum as int; return sum as int;
} }
double getCaloryTargetForOneDay(){ List<double> getAllEatenIngredientsForTodayStatistics(){
final Box userBox = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER'); Box box = Hive.box(todayStatisticsBoxName);
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 fat = 0;
num protein = 0; num protein = 0;
num carbs = 0; num carbs = 0;
@ -258,26 +216,20 @@ class DataService {
carbs += food.carbohydrateg; carbs += food.carbohydrateg;
} }
} }
return [fat.roundToDouble(),protein.roundToDouble(),carbs.roundToDouble()];
return [
fat.roundToDouble(),
protein.roundToDouble(),
carbs.roundToDouble(),
fatSummary * dayLen,
proteinSummary * dayLen,
carbSummary * dayLen,
calorieSummary * dayLen
];
} }
void updateCalculationsAndNotfiyListenersForTodayStatistics(){ void updateCalculationsAndNotfiyListenersForTodayStatistics(){
dailyAverageForCurrentWeek.value = getAverageCaloriesForCurrentWeekOnDailyBasis(); dailyAverageForCurrentWeek.value = getAverageCaloriesForCurrentWeekOnDailyBasis();
dailyAverageForCurrentWeek.notifyListeners();
weeklyCaloryRanking.value = getWeeklyCaloryRanking(); weeklyCaloryRanking.value = getWeeklyCaloryRanking();
weeklyCaloryRanking.notifyListeners();
barChartData.value = getBarChartData(); barChartData.value = getBarChartData();
barChartData.notifyListeners();
} }
void updateProgressBoxValues(){ void updateProgressBoxValues(){
Box box = Hive.box(statisticsBoxName); Box box = Hive.box(progressStatisticsBoxName);
box.clear(); box.clear();
int timestamp = getTimestampFromNow(); int timestamp = getTimestampFromNow();
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp); List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
@ -288,7 +240,7 @@ class DataService {
} }
int getAverageCaloriesForCurrentWeekOnDailyBasis(){ int getAverageCaloriesForCurrentWeekOnDailyBasis(){
Box box = Hive.box(statisticsBoxName); Box box = Hive.box(progressStatisticsBoxName);
return getAllEatenCaloriesByBox(box)~/7; return getAllEatenCaloriesByBox(box)~/7;
} }
@ -312,11 +264,7 @@ class DataService {
int getSumOfCaloriesByFoodList(List<Food> foods){ int getSumOfCaloriesByFoodList(List<Food> foods){
int sum = 0; int sum = 0;
for(int i = 0; i < foods.length;i++){ for(int i = 0; i < foods.length;i++){
try{
sum += foods[i].calories as int; sum += foods[i].calories as int;
}catch(e){
throw const FormatException('please check formats');
}
} }
return sum; return sum;
} }
@ -471,10 +419,17 @@ class DataService {
return now.millisecondsSinceEpoch.toInt() ~/ 1000; return now.millisecondsSinceEpoch.toInt() ~/ 1000;
} }
List<Food> getMealsOfTodayByMealtype(String mealtype){ showItems(){
int timestamp = getTimestampFromNow(); print("Statistics.dart - showItems() - ITEMS");
return getFoodMapForGivenTimestampFromMainBox(timestamp)[mealtype] ?? []; //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

@ -0,0 +1,64 @@
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
import 'package:ernaehrung/android/config/statistics.dart';
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;
if(currentIndex == 1){
StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.day);
}else if(currentIndex == 2){
StatisticsService.instance.updateProgressBoxValues();
}
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

@ -0,0 +1,41 @@
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

@ -0,0 +1,295 @@
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:ernaehrung/android/config/statistics.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import '../../config/format_helper.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: [
ValueListenableBuilder(
valueListenable: StatisticsService.instance.dailyAverageForCurrentWeek,
builder: (context, value, child) {
return Container(
height: 100,
width: 400,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const TitleComponent("Täglicher Durchschnitt (in kcal)"),
const SizedBox(
height: 10,
),
const SecondaryTextComponent("Durchschnittlich"),
SecondaryBigTextComponent("${value.toString()} kcal/Tag"),
],
),
);
},
),
ValueListenableBuilder(
valueListenable: StatisticsService.instance.barChartData,
builder: (context, value, child) {
return SizedBox(
height: 325,
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.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(
'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.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(
'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.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(
'Abendessen', // Replace with your desired legend label
style: TextStyle(fontSize: 12), // Adjust the font size of the legend labels
),
],
),
),
],
),
),
Padding(
padding: const EdgeInsets.only(top:50.0), // Adjust the margin value as needed
child: SizedBox(
height: 250,
child: BarChart(
BarChartData(
barTouchData: barTouchData,
titlesData: titlesData,
borderData: borderData,
barGroups: value,
gridData: FlGridData(show: false),
alignment: BarChartAlignment.spaceAround,
),
),
),
),
],
),
);
},
),
ValueListenableBuilder(
valueListenable: StatisticsService.instance.weeklyCaloryRanking,
builder: (context, value, child) {
return Column(
//TODO: Loop through the values and display them dynamically
children: [
const TitleComponent("Lebensmittel mit dem höchsten Kaloriengehalt"),
const SizedBox(height: 24,),
for (var item in value.toSet())
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SecondaryTextComponent(getWeeklyRankingString(item.name)),
SecondaryTextComponent(item.calories.toString()),
],
),
],
);
},
),
],
),
),
),
);
}
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: 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
),
);
}

View File

@ -1,5 +1,6 @@
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';
@ -27,11 +28,8 @@ 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 Center( return const Placeholder();
child: CircularProgressIndicator(), // Loading animation
);
} }
}) })));
));
} }
} }

View File

@ -0,0 +1,40 @@
import 'package:ernaehrung/android/components/card/card_component.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.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(dotenv.env['MEALPLAN_BOX'] ?? 'MEALPLAN').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(
box.keyAt(i).toString(),
box.getAt(i)
);
}
});
})));
}
}

View File

@ -0,0 +1,208 @@
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

View File

@ -0,0 +1,11 @@
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

@ -1,28 +1,38 @@
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 'app.dart'; import 'android/andoird_app.dart';
import 'helper/setup_todaybox.dart'; import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb;
import 'models/food.dart'; import 'android/config/setup_todaybox_config.dart';
import 'models/user.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( dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS');
await Hive.openBox(dotenv.env['MAIN_BOX'] ?? 'MAIN');
await Hive.openBox(dotenv.env['TODAY_BOX'] ?? 'TODAY');
await Hive.openBox<User>(dotenv.env['USER_BOX'] ?? 'USER');
setupTodayBox();
//Hive.deleteFromDisk();
runApp(const AndroidApp());
await Hive.openBox(dotenv.env['STATISTICS_TODAY_BOX'] ?? 'STATISTICS_TODAY_BOX');
await Hive.openBox( dotenv.env['STATISTICS_PROGRESS_BOX'] ?? 'STATISTICS_PROGRESS_BOX');
await Hive.openBox(dotenv.env['STATISTICS_MAIN_BOX'] ?? 'STATISTICS_MAIN_BOX');
await Hive.openBox(dotenv.env['MEALPLAN_BOX'] ?? 'MEALPLAN');
await Hive.openBox<User>('USER_BOX');
//Hive.deleteFromDisk();
setupTodayBox();
if (defaultTargetPlatform == TargetPlatform.android) {
runApp(const AndroidApp());
} else if (kIsWeb) {
runApp(const WebApp());
}
} }

20
lib/mockdata.dart 100644
View File

@ -0,0 +1,20 @@
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

@ -1,26 +0,0 @@
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

@ -1,100 +0,0 @@
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

@ -1,40 +0,0 @@
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

@ -1,27 +0,0 @@
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,52 +0,0 @@
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

@ -1,37 +0,0 @@
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,29 +0,0 @@
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

@ -1,134 +0,0 @@
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

@ -1,34 +0,0 @@
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

@ -1,71 +0,0 @@
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

@ -1,308 +0,0 @@
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

@ -1,32 +0,0 @@
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

@ -1,56 +0,0 @@
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

@ -1,35 +0,0 @@
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

@ -1,92 +0,0 @@
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

@ -1,20 +0,0 @@
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,76 +0,0 @@
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

@ -1,202 +0,0 @@
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

@ -1,175 +0,0 @@
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

@ -1,119 +0,0 @@
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

@ -1,64 +0,0 @@
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

@ -1,28 +0,0 @@
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

@ -1,27 +0,0 @@
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,18 @@
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

@ -0,0 +1,35 @@
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

@ -0,0 +1,41 @@
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

@ -0,0 +1,31 @@
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

@ -0,0 +1,61 @@
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,10 +6,6 @@
#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,7 +3,6 @@
# #
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,12 +5,8 @@
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"))
} }

794
pubspec.lock 100644
View File

@ -0,0 +1,794 @@
# 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: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.11.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: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
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: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev"
source: hosted
version: "1.17.1"
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: "9b098f6a5f8a6381016a5fe9cdccc900683917d1fb930e1c6c6c051ca0f01f08"
url: "https://pub.dev"
source: hosted
version: "9.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: e04998b1597d76a51da7f009ed3b2f12d4173f13e146e8744fd2453e8595a2c9
url: "https://pub.dev"
source: hosted
version: "9.0.0"
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: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6
url: "https://pub.dev"
source: hosted
version: "0.18.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: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.6.7"
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: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev"
source: hosted
version: "0.12.15"
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: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
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: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.8.3"
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: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev"
source: hosted
version: "0.5.1"
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: ">=3.0.0 <4.0.0"
flutter: ">=3.10.0"

View File

@ -47,13 +47,8 @@ dependencies:
sizer: ^2.0.15 sizer: ^2.0.15
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: ^9.0.0
form_builder_validators: ^8.0.0 form_builder_validators: ^9.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:
@ -83,6 +78,9 @@ 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

@ -1,356 +0,0 @@
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

@ -1,98 +0,0 @@
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));
});
}