diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index 039d79c..e73180a 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -3,601 +3,661 @@ "packages": [ { "name": "_fe_analyzer_shared", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-61.0.0", + "packageUri": "lib/", + "languageVersion": "2.17" + }, + { + "name": "adaptive_dialog", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/adaptive_dialog-1.8.3+1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "analyzer", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.11.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "animate_gradient", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1", "packageUri": "lib/", "languageVersion": "2.16" }, { - "name": "args", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.1", + "name": "animations", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7", "packageUri": "lib/", - "languageVersion": "2.18" + "languageVersion": "2.12" + }, + { + "name": "args", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2", + "packageUri": "lib/", + "languageVersion": "2.19" }, { "name": "assorted_layout_widgets", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "async", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.11.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "basic_utils", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/basic_utils-5.5.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/basic_utils-5.5.4", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "boolean_selector", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/boolean_selector-2.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/boolean_selector-2.1.1", "packageUri": "lib/", "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", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build-2.3.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build-2.3.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "build_config", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_config-1.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_config-1.1.1", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "build_daemon", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_daemon-3.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_daemon-3.1.1", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "build_resolvers", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_resolvers-2.2.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_resolvers-2.2.0", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "build_runner", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner-2.3.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner-2.3.3", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "build_runner_core", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "built_collection", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/built_collection-5.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_collection-5.1.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "built_value", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.5.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "card_swiper", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/card_swiper-2.0.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/card_swiper-2.0.4", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "characters", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.3.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "checked_yaml", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/checked_yaml-2.0.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/checked_yaml-2.0.3", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "clock", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "code_builder", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.4.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0", "packageUri": "lib/", - "languageVersion": "2.17" + "languageVersion": "2.19" }, { "name": "collection", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0", "packageUri": "lib/", - "languageVersion": "2.18" + "languageVersion": "2.12" }, { "name": "convert", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/convert-3.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/convert-3.1.1", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "crypto", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.3", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "cupertino_icons", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.5", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.5", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "dart_style", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/dart_style-2.3.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dart_style-2.3.1", "packageUri": "lib/", "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", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/empty_widget-0.0.5", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/empty_widget-0.0.5", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "equatable", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/equatable-2.0.5", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/equatable-2.0.5", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "fake_async", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/fake_async-1.3.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fake_async-1.3.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "ffi", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "file", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/file-6.1.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/file-6.1.4", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "fixnum", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/fixnum-1.1.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fixnum-1.1.0", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "fl_chart", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/fl_chart-0.62.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fl_chart-0.62.0", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "flutter", - "rootUri": "file:///C:/Users/FUCHSLAU/flutter/packages/flutter", + "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter", "packageUri": "lib/", - "languageVersion": "3.0" + "languageVersion": "2.17" }, { "name": "flutter_dotenv", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.0.2", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "flutter_form_builder", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-9.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0", "packageUri": "lib/", - "languageVersion": "3.0" + "languageVersion": "2.19" }, { "name": "flutter_lints", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_lints-2.0.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_lints-2.0.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "flutter_localizations", - "rootUri": "file:///C:/Users/FUCHSLAU/flutter/packages/flutter_localizations", + "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_localizations", "packageUri": "lib/", - "languageVersion": "3.0" + "languageVersion": "2.17" + }, + { + "name": "flutter_profile_picture", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_profile_picture-2.0.0", + "packageUri": "lib/", + "languageVersion": "2.12" }, { "name": "flutter_test", - "rootUri": "file:///C:/Users/FUCHSLAU/flutter/packages/flutter_test", + "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_test", "packageUri": "lib/", - "languageVersion": "3.0" + "languageVersion": "2.17" + }, + { + "name": "flutter_web_plugins", + "rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_web_plugins", + "packageUri": "lib/", + "languageVersion": "2.17" + }, + { + "name": "fluttertoast", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fluttertoast-8.2.2", + "packageUri": "lib/", + "languageVersion": "2.12" }, { "name": "form_builder_validators", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-9.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1", "packageUri": "lib/", - "languageVersion": "3.0" + "languageVersion": "2.19" }, { "name": "frontend_server_client", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/frontend_server_client-3.2.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/frontend_server_client-3.2.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "glob", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2", "packageUri": "lib/", - "languageVersion": "2.15" + "languageVersion": "2.19" }, { "name": "graphs", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.2.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1", "packageUri": "lib/", - "languageVersion": "2.12" + "languageVersion": "2.18" }, { "name": "hive", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/hive-2.2.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive-2.2.3", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "hive_flutter", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/hive_flutter-1.1.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_flutter-1.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "hive_generator", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/hive_generator-2.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_generator-2.0.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "http", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/http-0.13.6", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http-0.13.6", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "http_multi_server", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/http_multi_server-3.2.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_multi_server-3.2.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "http_parser", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/http_parser-4.0.2", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_parser-4.0.2", + "packageUri": "lib/", + "languageVersion": "2.12" + }, + { + "name": "intersperse", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intersperse-2.0.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "intl", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.18.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "io", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/io-1.0.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/io-1.0.4", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "js", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.7", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5", "packageUri": "lib/", - "languageVersion": "2.19" + "languageVersion": "2.16" }, { "name": "json_annotation", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/json_annotation-4.8.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/json_annotation-4.8.1", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "lints", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/lints-2.0.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/lints-2.0.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "logging", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0", "packageUri": "lib/", - "languageVersion": "2.18" + "languageVersion": "2.19" + }, + { + "name": "macos_ui", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/macos_ui-1.12.2", + "packageUri": "lib/", + "languageVersion": "2.17" }, { "name": "matcher", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.15", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "material_color_utilities", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/material_color_utilities-0.2.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/material_color_utilities-0.2.0", "packageUri": "lib/", "languageVersion": "2.13" }, { "name": "matrix4_transform", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/matrix4_transform-2.0.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matrix4_transform-2.0.1", "packageUri": "lib/", "languageVersion": "2.13" }, { "name": "meta", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.9.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "mime", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/mime-1.0.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/mime-1.0.4", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "package_config", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/package_config-2.1.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/package_config-2.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "path", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "path_provider", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.14", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "path_provider_android", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_android-2.0.27", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_android-2.0.27", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "path_provider_foundation", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.2", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "path_provider_linux", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.10", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11", "packageUri": "lib/", - "languageVersion": "2.17" + "languageVersion": "2.18" }, { "name": "path_provider_platform_interface", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_platform_interface-2.0.6", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_platform_interface-2.0.6", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "path_provider_windows", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.6", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7", "packageUri": "lib/", - "languageVersion": "2.17" + "languageVersion": "2.18" }, { "name": "percent_indicator", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/percent_indicator-4.2.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/percent_indicator-4.2.3", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "platform", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/platform-3.1.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/platform-3.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "plugin_platform_interface", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/plugin_platform_interface-2.1.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/plugin_platform_interface-2.1.4", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "pointycastle", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/pointycastle-3.7.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pointycastle-3.7.3", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "pool", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/pool-1.5.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pool-1.5.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "process", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/process-4.2.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/process-4.2.4", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "pub_semver", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/pub_semver-2.1.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pub_semver-2.1.4", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "pubspec_parse", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/pubspec_parse-1.2.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pubspec_parse-1.2.3", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "responsive_framework", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/responsive_framework-1.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/responsive_framework-1.0.0", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "searchable_listview", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/searchable_listview-2.4.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/searchable_listview-2.4.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "shelf", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/shelf-1.4.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf-1.4.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "shelf_web_socket", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/shelf_web_socket-1.0.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf_web_socket-1.0.4", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "sizer", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/sizer-2.0.15", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/sizer-2.0.15", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "sky_engine", - "rootUri": "file:///C:/Users/FUCHSLAU/flutter/bin/cache/pkg/sky_engine", + "rootUri": "file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine", "packageUri": "lib/", - "languageVersion": "3.0" + "languageVersion": "2.12" }, { "name": "source_gen", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "source_helper", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/source_helper-1.3.3", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_helper-1.3.3", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "source_span", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/source_span-1.9.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_span-1.9.1", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "stack_trace", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/stack_trace-1.11.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stack_trace-1.11.0", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "stream_channel", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/stream_channel-2.1.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_channel-2.1.1", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "stream_transform", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/stream_transform-2.1.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_transform-2.1.0", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "string_scanner", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.2.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.2.0", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "term_glyph", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/term_glyph-1.2.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/term_glyph-1.2.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "test_api", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.5.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16", "packageUri": "lib/", "languageVersion": "2.18" }, { "name": "timing", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/timing-1.0.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/timing-1.0.1", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "typed_data", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.1", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2", "packageUri": "lib/", - "languageVersion": "2.12" + "languageVersion": "2.17" }, { "name": "universal_io", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/universal_io-2.2.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/universal_io-2.2.0", "packageUri": "lib/", "languageVersion": "2.15" }, { "name": "vector_math", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/vector_math-2.1.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/vector_math-2.1.4", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "watcher", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/watcher-1.0.2", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/watcher-1.0.2", "packageUri": "lib/", "languageVersion": "2.14" }, { "name": "web_socket_channel", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/web_socket_channel-2.4.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/web_socket_channel-2.4.0", "packageUri": "lib/", "languageVersion": "2.15" }, { "name": "win32", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/win32-4.1.4", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/win32-4.1.4", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "xdg_directories", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.0.0", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.0.0", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "yaml", - "rootUri": "file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/yaml-3.1.2", + "rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/yaml-3.1.2", "packageUri": "lib/", "languageVersion": "2.19" }, @@ -608,7 +668,7 @@ "languageVersion": "2.19" } ], - "generated": "2023-06-01T11:12:57.602326Z", + "generated": "2023-06-25T12:05:16.357241Z", "generator": "pub", - "generatorVersion": "3.0.2" + "generatorVersion": "2.19.6" } diff --git a/.dart_tool/package_config_subset b/.dart_tool/package_config_subset index ec9aa2f..7a39e08 100644 --- a/.dart_tool/package_config_subset +++ b/.dart_tool/package_config_subset @@ -1,405 +1,445 @@ _fe_analyzer_shared 2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-61.0.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/_fe_analyzer_shared-61.0.0/lib/ +adaptive_dialog +2.17 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/adaptive_dialog-1.8.3+1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/adaptive_dialog-1.8.3+1/lib/ analyzer 2.19 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.11.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.11.1/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0/lib/ animate_gradient 2.16 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1/lib/ +animations +2.12 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7/lib/ args -2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.1/lib/ +2.19 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2/lib/ assorted_layout_widgets 2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4/lib/ async 2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.11.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.11.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0/lib/ basic_utils 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ boolean_selector 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ +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 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ build_config 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ build_daemon 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ build_resolvers 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ build_runner 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ build_runner_core 2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1/lib/ built_collection 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ built_value 2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.5.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.5.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1/lib/ card_swiper 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ characters 2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.3.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.3.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1/lib/ checked_yaml 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ clock 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ code_builder -2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.4.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.4.0/lib/ +2.19 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0/lib/ collection -2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.1/lib/ +2.12 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0/lib/ convert 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ crypto 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ cupertino_icons 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ dart_style 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ +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 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ equatable 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ fake_async 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ ffi 2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.1/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2/lib/ file 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ fixnum 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ fl_chart 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ flutter_dotenv 2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.0.2/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.0.2/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0/lib/ flutter_form_builder -3.0 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-9.0.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-9.0.0/lib/ +2.19 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0/lib/ flutter_lints 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ +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 -3.0 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-9.0.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-9.0.0/lib/ +2.19 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1/lib/ frontend_server_client 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ glob -2.15 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.1/lib/ +2.19 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2/lib/ graphs -2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.2.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.2.0/lib/ +2.18 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1/lib/ hive 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ hive_flutter 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ hive_generator 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ http 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ http_multi_server 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ http_parser 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ +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 2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.18.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.18.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0/lib/ io 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ js -2.19 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.7/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.7/lib/ +2.16 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5/lib/ json_annotation 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ lints 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ logging -2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.1.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.1.1/lib/ +2.19 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0/lib/ +macos_ui +2.17 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/macos_ui-1.12.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/macos_ui-1.12.2/lib/ matcher 2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.15/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.15/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13/lib/ material_color_utilities 2.13 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ matrix4_transform 2.13 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ meta 2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.9.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.9.1/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0/lib/ mime 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ package_config 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ path 2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.3/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.3/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2/lib/ path_provider 2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.14/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.14/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15/lib/ path_provider_android 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ path_provider_foundation 2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.2/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.2/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3/lib/ path_provider_linux -2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.10/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.10/lib/ +2.18 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11/lib/ path_provider_platform_interface 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ path_provider_windows -2.17 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.6/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.6/lib/ +2.18 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7/lib/ percent_indicator 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ platform 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ plugin_platform_interface 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ pointycastle 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ pool 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ process 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ pub_semver 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ pubspec_parse 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ responsive_framework 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ searchable_listview 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ shelf 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ shelf_web_socket 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ sizer 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ source_gen 2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.0/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.0/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2/lib/ source_helper 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ source_span 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ stack_trace 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ stream_channel 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ stream_transform 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ string_scanner 2.18 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ term_glyph 2.12 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ test_api 2.18 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.5.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.5.1/lib/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16/lib/ timing 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ typed_data -2.12 -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.1/ -file:///C:/Users/FUCHSLAU/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.1/lib/ +2.17 +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2/ +file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2/lib/ universal_io 2.15 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ vector_math 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ watcher 2.14 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ web_socket_channel 2.15 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ win32 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ xdg_directories 2.17 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ yaml 2.19 -file:///C:/Users/FUCHSLAU/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/lib/ +file:///C:/Users/Nutzer/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/ sky_engine -3.0 -file:///C:/Users/FUCHSLAU/flutter/bin/cache/pkg/sky_engine/ -file:///C:/Users/FUCHSLAU/flutter/bin/cache/pkg/sky_engine/lib/ +2.12 +file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine/ +file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine/lib/ flutter -3.0 -file:///C:/Users/FUCHSLAU/flutter/packages/flutter/ -file:///C:/Users/FUCHSLAU/flutter/packages/flutter/lib/ +2.17 +file:///C:/Users/Nutzer/flutter/packages/flutter/ +file:///C:/Users/Nutzer/flutter/packages/flutter/lib/ flutter_localizations -3.0 -file:///C:/Users/FUCHSLAU/flutter/packages/flutter_localizations/ -file:///C:/Users/FUCHSLAU/flutter/packages/flutter_localizations/lib/ +2.17 +file:///C:/Users/Nutzer/flutter/packages/flutter_localizations/ +file:///C:/Users/Nutzer/flutter/packages/flutter_localizations/lib/ flutter_test -3.0 -file:///C:/Users/FUCHSLAU/flutter/packages/flutter_test/ -file:///C:/Users/FUCHSLAU/flutter/packages/flutter_test/lib/ +2.17 +file:///C:/Users/Nutzer/flutter/packages/flutter_test/ +file:///C:/Users/Nutzer/flutter/packages/flutter_test/lib/ +flutter_web_plugins +2.17 +file:///C:/Users/Nutzer/flutter/packages/flutter_web_plugins/ +file:///C:/Users/Nutzer/flutter/packages/flutter_web_plugins/lib/ ernaehrung 2.19 -file:///C:/Users/FUCHSLAU/repos/Uni/Flutter-Ernaehrungsapp/ -file:///C:/Users/FUCHSLAU/repos/Uni/Flutter-Ernaehrungsapp/lib/ +file:///C:/Users/Nutzer/source/repos/Flutter-Ernaehrungsapp/ +file:///C:/Users/Nutzer/source/repos/Flutter-Ernaehrungsapp/lib/ 2 diff --git a/.env b/.env index 2ff6b22..d5fae57 100644 --- a/.env +++ b/.env @@ -13,7 +13,8 @@ DINNER_FIELD=ABENDESSEN # abendessen YESTERDAY_AND_BEFORE=YESTERDAY # gestern und alles was davor war TOMORROW_AND_AFTER=TOMORROW # morgen und alles was kommen wird -MEALPLAN_BOX=MEALPLAN -STATISTICS_TODAY_BOX=STATISTICS_TODAY -STATISTICS_PROGRESS_BOX=STATISTICS_PROGRESS -STATISTICS_MAIN_BOX=STATISTICS_MAIN \ No newline at end of file +TODAY_BOX=TODAY +PROGRESS_BOX=PROGRESS +STATISTICS_BOX=STATISTICS +MAIN_BOX=MAIN +USER_BOX=USER diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index 2b7f1ca..d4b489b 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"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"} \ No newline at end of file +{"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"} \ No newline at end of file diff --git a/assets/images/fries.png b/assets/images/fries.png deleted file mode 100644 index 21790b6..0000000 Binary files a/assets/images/fries.png and /dev/null differ diff --git a/assets/images/ice.png b/assets/images/ice.png deleted file mode 100644 index 4826f01..0000000 Binary files a/assets/images/ice.png and /dev/null differ diff --git a/assets/images/tea.png b/assets/images/tea.png deleted file mode 100644 index 6ce11c9..0000000 Binary files a/assets/images/tea.png and /dev/null differ diff --git a/lib/android/components/MealPageFoodComponent.dart b/lib/android/components/MealPageFoodComponent.dart deleted file mode 100644 index c62a067..0000000 --- a/lib/android/components/MealPageFoodComponent.dart +++ /dev/null @@ -1,28 +0,0 @@ -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),) - ], - ), - ); - } -} diff --git a/lib/android/components/card/card_component.dart b/lib/android/components/card/card_component.dart deleted file mode 100644 index 92cd565..0000000 --- a/lib/android/components/card/card_component.dart +++ /dev/null @@ -1,74 +0,0 @@ -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 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'), - ), - ), - ) - ], - )); - } -} diff --git a/lib/android/components/card/card_data_food_component.dart b/lib/android/components/card/card_data_food_component.dart deleted file mode 100644 index b757c87..0000000 --- a/lib/android/components/card/card_data_food_component.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:ernaehrung/android/components/card/card_food_item_component.dart'; -import 'package:ernaehrung/android/models/food.dart'; -import 'package:flutter/material.dart'; - -class CardDataFoodComponent extends StatelessWidget { - final List 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, - ) - ], - ); - }) - ], - ), - )), - ); - } -} diff --git a/lib/android/components/card/card_food_item_component.dart b/lib/android/components/card/card_food_item_component.dart deleted file mode 100644 index 26fe4e1..0000000 --- a/lib/android/components/card/card_food_item_component.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:ernaehrung/android/models/food.dart'; -import 'package:flutter/material.dart'; - -class CardFoodItemComponent extends StatelessWidget { - final Food food; - - const CardFoodItemComponent(this.food, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.fromLTRB(0, 8, 0, 4), - width: double.infinity, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - flex: 6, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - food.name.toString(), - style: const TextStyle(color: Colors.white), - softWrap: true, - ), - Text( - food.calories.toString(), - style: const TextStyle(color: Colors.white), - ), - ], - ), - ), - Expanded( - flex: 1, child: TextButton(onPressed: () {}, child: Text("+"))) - ], - ), - ); - } -} diff --git a/lib/android/components/card_component.dart b/lib/android/components/card_component.dart deleted file mode 100644 index d5405b2..0000000 --- a/lib/android/components/card_component.dart +++ /dev/null @@ -1,155 +0,0 @@ -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 selectedMeal; - final bool addButtonVisible; - - const CardComponent( - {Key? key, required this.eatingMealName, required this.selectedMeal, this.addButtonVisible = true}) - : super(key: key); - - @override - State createState() => _CardComponentState(); -} - -class _CardComponentState extends State { - 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> map = getMapOfDistinctElementsWithCounterAndCalories(widget.selectedMeal); - String foodName = map.keys.elementAt(i); - List 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(), - ], - )); - } -} diff --git a/lib/android/components/circular/circular_component.dart b/lib/android/components/circular/circular_component.dart deleted file mode 100644 index a0fe388..0000000 --- a/lib/android/components/circular/circular_component.dart +++ /dev/null @@ -1,41 +0,0 @@ -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_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, - ), - ], - ); - }, - ); - - - } -} \ No newline at end of file diff --git a/lib/android/components/diet_chart_component.dart b/lib/android/components/diet_chart_component.dart deleted file mode 100644 index f63bf46..0000000 --- a/lib/android/components/diet_chart_component.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:percent_indicator/linear_percent_indicator.dart'; - -class DietChatComponent extends StatefulWidget { - final double fatPercentPerThousandCalorie = 3.7; - final double proteinPercentPerThousandCalorie = 4.5; - final double carbsPercentPerThousandCalorie = 12.8; - - final String carbs = "Kohlenhydrate"; - final String protein = "Protein"; - final String fat = "Fett"; - - late String fatGramm, carbGramm, proteinGramm = ""; - late double fatSummary, carbSummary, proteinSummary = 0.0; - - DietChatComponent(int calorienSummary, {super.key, int calorienLeft = 0}){ - fatSummary = (calorienSummary / 100) * fatPercentPerThousandCalorie; - carbSummary = (calorienSummary / 100) * carbsPercentPerThousandCalorie; - proteinSummary = (calorienSummary / 100) * proteinPercentPerThousandCalorie; - fatGramm = '0 / $fatSummary g'; - carbGramm = '0 / $carbSummary g'; - proteinGramm = '0 / $proteinSummary g'; - } - - @override - State createState() => _DietChatComponentState(); -} - -class _DietChatComponentState extends State { - @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) - ], - ) - ], - ); - } -} diff --git a/lib/android/components/food_list_component.dart b/lib/android/components/food_list_component.dart deleted file mode 100644 index b05b1d1..0000000 --- a/lib/android/components/food_list_component.dart +++ /dev/null @@ -1,36 +0,0 @@ -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(), - ); - } - }); - }); - } - - -} diff --git a/lib/android/components/founded_search_component.dart b/lib/android/components/founded_search_component.dart deleted file mode 100644 index 2d55583..0000000 --- a/lib/android/components/founded_search_component.dart +++ /dev/null @@ -1,102 +0,0 @@ -import 'package:assorted_layout_widgets/assorted_layout_widgets.dart'; -import 'package:ernaehrung/android/config/cast_helper.dart'; -import 'package:ernaehrung/android/config/statistics.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:hive/hive.dart'; -import '../models/food.dart'; - -class SearchedFoodComponent extends StatefulWidget { - final Food food; - final String cardName; - const SearchedFoodComponent(this.food, this.cardName, {Key? key}) : super(key: key); - - @override - State createState() => _SearchFoodComponentState(); -} - -class _SearchFoodComponentState extends State { - - 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 newValues){ - List 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('+'), - ) - ], - )); - } -} diff --git a/lib/android/components/meal_page_text/secondary_big_text_component.dart b/lib/android/components/meal_page_text/secondary_big_text_component.dart deleted file mode 100644 index 2eccc37..0000000 --- a/lib/android/components/meal_page_text/secondary_big_text_component.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter/material.dart'; - -class SecondaryBigTextComponent extends StatelessWidget { - final String title; - - const SecondaryBigTextComponent(this.title, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text( - title.toString(), - style: const TextStyle( - color: Colors.black, - fontSize: 30, - fontWeight: FontWeight.w600), - textAlign: TextAlign.left, - ); - } -} diff --git a/lib/android/components/meal_page_text/secondary_text_component.dart b/lib/android/components/meal_page_text/secondary_text_component.dart deleted file mode 100644 index d56e287..0000000 --- a/lib/android/components/meal_page_text/secondary_text_component.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter/material.dart'; - -class SecondaryTextComponent extends StatelessWidget { - final String title; - - const SecondaryTextComponent(this.title, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text( - title.toString(), - style: TextStyle( - color: Colors.grey.shade500, - fontSize: 14, - fontWeight: FontWeight.w500), - textAlign: TextAlign.left, - ); - } -} diff --git a/lib/android/components/meal_page_text/statistics_today_component.dart b/lib/android/components/meal_page_text/statistics_today_component.dart deleted file mode 100644 index 9fed7c2..0000000 --- a/lib/android/components/meal_page_text/statistics_today_component.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:ernaehrung/android/components/circular/circular_component.dart'; -import 'package:ernaehrung/android/components/circular/line_circular_with_text_component.dart'; -import 'package:ernaehrung/android/config/statistics.dart'; -import 'package:flutter/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>( - 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)"), - ], - ); - }, - ), - ) - ], - ), - ); - } -} diff --git a/lib/android/components/not_found_component.dart b/lib/android/components/not_found_component.dart deleted file mode 100644 index 714ba26..0000000 --- a/lib/android/components/not_found_component.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:empty_widget/empty_widget.dart'; -import 'package:flutter/cupertino.dart'; - -class NotFoundComponent extends StatelessWidget { - const NotFoundComponent({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return EmptyWidget( - image: null, - packageImage: PackageImage.Image_1, - title: 'Gericht existiert nicht', - titleTextStyle: const TextStyle( - fontSize: 18, - color: Color(0xff9da9c7), - fontWeight: FontWeight.w500, - ), - ); - } -} diff --git a/lib/android/components/search_component.dart b/lib/android/components/search_component.dart deleted file mode 100644 index f8c41b7..0000000 --- a/lib/android/components/search_component.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:empty_widget/empty_widget.dart'; -import 'package:flutter/material.dart'; -import '../models/food.dart'; -import 'founded_search_component.dart'; - -class SearchComponent extends StatefulWidget { - final List foods; - final String cardName; - const SearchComponent(this.foods, this.cardName, {super.key}); - - @override - State createState() => _SearchComponentState(); -} - -class _SearchComponentState extends State { - final TextEditingController controller = TextEditingController(); - late List allFoods = widget.foods; - List 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}); - } - } -} diff --git a/lib/android/components/statistics_circular_indicator_component.dart b/lib/android/components/statistics_circular_indicator_component.dart deleted file mode 100644 index fcd648a..0000000 --- a/lib/android/components/statistics_circular_indicator_component.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:ernaehrung/android/components/circular/circular_component.dart'; -import 'package:flutter/material.dart'; - -class StatisticsPercentComponent extends StatelessWidget { - late int eaten, calorienBurned, calorienLeft, calorienLeftPercent; - - StatisticsPercentComponent(this.eaten, this.calorienBurned, this.calorienLeft, {super.key}); - - int get getEaten => eaten; - get getCalorienBurned => calorienBurned; - get getCalorienLeft => calorienLeft; - get getCalorienLeftPercent => calorienLeftPercent; - - @override - Widget build(BuildContext context) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("$eaten gegessen"), - CircularLoadingComponent(), - Text("$calorienBurned verbrannt"), - ], - ); - } - -} diff --git a/lib/android/components/welcome_text_field.dart b/lib/android/components/welcome_text_field.dart deleted file mode 100644 index cb08911..0000000 --- a/lib/android/components/welcome_text_field.dart +++ /dev/null @@ -1,192 +0,0 @@ -import 'package:ernaehrung/android/pages/nav_pages/main_page.dart'; -import 'package:flutter/material.dart'; - -class WelcomePageStateTextFieldState extends StatefulWidget { - const WelcomePageStateTextFieldState({super.key}); - - @override - State createState() => - _WelcomePageStateTextFieldState(); -} - -class _WelcomePageStateTextFieldState - extends State { - 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')) - ], - ); - } -} diff --git a/lib/android/pages/nav_pages/main_page.dart b/lib/android/pages/nav_pages/main_page.dart deleted file mode 100644 index 2543c92..0000000 --- a/lib/android/pages/nav_pages/main_page.dart +++ /dev/null @@ -1,64 +0,0 @@ -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 { - 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'), - ], - ), - ); - } -} diff --git a/lib/android/pages/nav_pages/meal_plan_page.dart b/lib/android/pages/nav_pages/meal_plan_page.dart deleted file mode 100644 index d926423..0000000 --- a/lib/android/pages/nav_pages/meal_plan_page.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:ernaehrung/android/components/MealPageFoodComponent.dart'; -import 'package:ernaehrung/android/components/meal_page_text/days_component.dart'; -import 'package:ernaehrung/android/components/meal_page_text/statistics_today_component.dart'; -import 'package:flutter/material.dart'; - -class MealPlanPage extends StatefulWidget { - final String title; - final Color backgroundColor = const Color(0xff47a44b); - - const MealPlanPage({Key? key, required this.title}) : super(key: key); - - String get getTitle => title; - - @override - String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return getTitle; - } - - @override - State createState() => _MealPlanState(); -} - -class _MealPlanState extends State { - @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(), - ], - ), - ))); - } -} diff --git a/lib/android/pages/nav_pages/progress_page.dart b/lib/android/pages/nav_pages/progress_page.dart deleted file mode 100644 index f2d5796..0000000 --- a/lib/android/pages/nav_pages/progress_page.dart +++ /dev/null @@ -1,295 +0,0 @@ -import 'package:ernaehrung/android/components/meal_page_text/secondary_big_text_component.dart'; -import 'package:ernaehrung/android/components/meal_page_text/secondary_text_component.dart'; -import 'package:ernaehrung/android/components/meal_page_text/title_component.dart'; -import 'package: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 - ), - ); - - -} diff --git a/lib/android/pages/nav_pages/today_page.dart b/lib/android/pages/nav_pages/today_page.dart deleted file mode 100644 index 34e39e0..0000000 --- a/lib/android/pages/nav_pages/today_page.dart +++ /dev/null @@ -1,40 +0,0 @@ -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 createState() => _TodayPageState(); -} - -class _TodayPageState extends State { - @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) - ); - } - }); - }))); - } -} diff --git a/lib/android/pages/welcome.dart b/lib/android/pages/welcome.dart deleted file mode 100644 index 0ee92cb..0000000 --- a/lib/android/pages/welcome.dart +++ /dev/null @@ -1,208 +0,0 @@ -import 'package:ernaehrung/android/pages/nav_pages/main_page.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_form_builder/flutter_form_builder.dart'; -import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:hive_flutter/hive_flutter.dart'; - -import '../models/user.dart'; - -class OnboardingPage extends StatefulWidget { - const OnboardingPage({Key? key}) : super(key: key); - - @override - State createState() => _OnboardingPageState(); -} - -class _OnboardingPageState extends State { - 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(); - - 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_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"), - )), - ], - ), - ), - )), - ); - } -} diff --git a/lib/android/andoird_app.dart b/lib/app.dart similarity index 57% rename from lib/android/andoird_app.dart rename to lib/app.dart index 7663da4..86c9c2c 100644 --- a/lib/android/andoird_app.dart +++ b/lib/app.dart @@ -1,8 +1,8 @@ -import 'package:ernaehrung/android/pages/nav_pages/main_page.dart'; -import 'package:ernaehrung/android/pages/welcome.dart'; +import 'package:ernaehrung/pages/nav_pages/main_page.dart'; +import 'package:ernaehrung/pages/user_data_form/initial_user_data_form.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:hive/hive.dart'; - import 'models/user.dart'; class AndroidApp extends StatelessWidget { @@ -10,12 +10,12 @@ class AndroidApp extends StatelessWidget { @override Widget build(BuildContext context) { - final box = Hive.box('USER_BOX'); - print("got it ${box.get("USER")}"); + final box = Hive.box(dotenv.env['USER_BOX'] ?? 'USER'); return MaterialApp( + debugShowCheckedModeBanner: false, title: 'Flutter Demo', theme: ThemeData( - scaffoldBackgroundColor: Colors.grey.shade100, //<-- SEE + scaffoldBackgroundColor: Colors.grey.shade200, //<-- SEE ), home: box.get("USER") == null ? const OnboardingPage() : const MainPage(), routes: { diff --git a/lib/functions/db_crud.dart b/lib/functions/db_crud.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/functions/welcome_crud.dart b/lib/functions/welcome_crud.dart deleted file mode 100644 index 99f147c..0000000 --- a/lib/functions/welcome_crud.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:hive/hive.dart'; - -void storeUserData(String sname, String fname, int weight, int height, int calories) async { - final userBox = Hive.box(dotenv.env['USER_BOX']!); - userBox.put(dotenv.env['FIRST_NAME_FIELD']!, sname); - userBox.put(dotenv.env['SECOND_NAME_FIELD']!, fname); - userBox.put(dotenv.env['WEIGHT_FIELD']!, weight); - userBox.put(dotenv.env['HEIGHT_FIELD']!, height); - userBox.put(dotenv.env['CALORIES_FIELD']!, calories); -} \ No newline at end of file diff --git a/lib/android/config/cast_helper.dart b/lib/helper/cast_helper.dart similarity index 100% rename from lib/android/config/cast_helper.dart rename to lib/helper/cast_helper.dart diff --git a/lib/android/config/format_helper.dart b/lib/helper/format_helper.dart similarity index 55% rename from lib/android/config/format_helper.dart rename to lib/helper/format_helper.dart index fc79dd8..c7615de 100644 --- a/lib/android/config/format_helper.dart +++ b/lib/helper/format_helper.dart @@ -1,14 +1,37 @@ +import 'package:flutter/cupertino.dart'; + import '../models/food.dart'; -String getFoodListStringByFood(String foodName, int count, int calories){ +String getFoodListStringByFood(String foodName, int count, int calories, BuildContext? context){ int maxWidth = 35; + if(context != null){ + maxWidth = isScreenWidthAbove1000(context) ? 100 : 35; + } String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... $count x $calories kcal" : "$foodName $count x $calories kcal"; return limitedText; } -String getWeeklyRankingString(String foodName){ - int maxWidth = 45; - String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... " : foodName; + +bool isScreenWidthAbove1000(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + return screenWidth > 400; +} + +String getWeeklyRankingString(String foodName,BuildContext? context){ + int maxWidth = 40; + if(context != null){ + maxWidth = isScreenWidthAbove1000(context) ? 100 : 40; + } + String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ..." : foodName; + return limitedText; +} + +String getToastFoodNameString(Food food,BuildContext? context){ + int maxWidth = 25; + if(context != null){ + maxWidth = isScreenWidthAbove1000(context) ? 100 : 25; + } + String limitedText = food.name.length > maxWidth ? "${food.name.substring(0, maxWidth - 3)} ..." : food.name; return limitedText; } @@ -24,6 +47,7 @@ Map> getMapOfDistinctElementsWithCounterAndCalories(List return resultMap; } + List getListOfDistinctElements(List foods){ List result = []; for(int i = 0; i < foods.length;i++){ diff --git a/lib/android/config/setup_todaybox_config.dart b/lib/helper/setup_todaybox.dart similarity index 76% rename from lib/android/config/setup_todaybox_config.dart rename to lib/helper/setup_todaybox.dart index 36d3734..d514f57 100644 --- a/lib/android/config/setup_todaybox_config.dart +++ b/lib/helper/setup_todaybox.dart @@ -7,11 +7,10 @@ final List emptyList = []; void setupTodayBox() async{ - final todayBox = Hive.box(dotenv.env['MEALPLAN_BOX']!); + final todayBox = Hive.box(dotenv.env['TODAY_BOX']!); putIfKeyNotExists(todayBox, 'FRÜHSTÜCK', []); putIfKeyNotExists(todayBox, 'MITTAGESSEN', []); putIfKeyNotExists(todayBox, 'ABENDESSEN', []); - } @@ -20,6 +19,3 @@ void putIfKeyNotExists(Box box, String key, List value) { box.put(key, value); } } -String getFormatedTodayDate(){ - return DateTime.now().toString().substring(0,10); -} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 2ec1e7f..467b4b6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,38 +1,28 @@ -import 'package:ernaehrung/android/models/food.dart'; -import 'package:ernaehrung/android/models/user.dart'; -import 'package:ernaehrung/web/web_app.dart'; import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'android/andoird_app.dart'; -import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb; -import 'android/config/setup_todaybox_config.dart'; +import 'app.dart'; +import 'helper/setup_todaybox.dart'; +import 'models/food.dart'; +import 'models/user.dart'; void main() async { await dotenv.load(fileName: ".env"); await Hive.initFlutter(); - if (!Hive.isAdapterRegistered(0)) { Hive.registerAdapter(FoodAdapter()); } - if (!Hive.isAdapterRegistered(1)) { Hive.registerAdapter(UserAdapter()); } - - - 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_BOX'); - //Hive.deleteFromDisk(); + 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(dotenv.env['USER_BOX'] ?? 'USER'); setupTodayBox(); + //Hive.deleteFromDisk(); + runApp(const AndroidApp()); - if (defaultTargetPlatform == TargetPlatform.android) { - runApp(const AndroidApp()); - } else if (kIsWeb) { - runApp(const WebApp()); - } } diff --git a/lib/mockdata.dart b/lib/mockdata.dart deleted file mode 100644 index 6c11fb1..0000000 --- a/lib/mockdata.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'android/models/card.dart'; - -List essen = [ - CardModel('Haferflocken', 10, 1.1, 1.2), - CardModel('Kekse', 20, 2.2, 2.3), - CardModel('Bier', 30, 3.3, 3.4), -]; - -Map, List> cards = , List>{ - { - 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 -}; \ No newline at end of file diff --git a/lib/android/models/card.dart b/lib/models/card.dart similarity index 100% rename from lib/android/models/card.dart rename to lib/models/card.dart diff --git a/lib/android/models/card_item.dart b/lib/models/card_item.dart similarity index 100% rename from lib/android/models/card_item.dart rename to lib/models/card_item.dart diff --git a/lib/android/models/food.dart b/lib/models/food.dart similarity index 100% rename from lib/android/models/food.dart rename to lib/models/food.dart diff --git a/lib/android/models/food.g.dart b/lib/models/food.g.dart similarity index 100% rename from lib/android/models/food.g.dart rename to lib/models/food.g.dart diff --git a/lib/android/models/food_dto.dart b/lib/models/food_dto.dart similarity index 100% rename from lib/android/models/food_dto.dart rename to lib/models/food_dto.dart diff --git a/lib/models/form_builder.dart b/lib/models/form_builder.dart new file mode 100644 index 0000000..ce4502f --- /dev/null +++ b/lib/models/form_builder.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class FormTextField{ + final String title; + final TextInputType textInputType; + final num? maxLength; + final String? maxLengthErrorMessage; + final String? minLengthErrorMessage; + final num? minLength; + final num? numericMax; + final num? numericMin; + final String? numericMaxErrorMessage; + final String? numericMinErrorMessage; + + FormTextField( + this.title, + this.textInputType, + this.maxLength, + this.maxLengthErrorMessage, + this.minLengthErrorMessage, + this.minLength, + this.numericMax, + this.numericMin, + this.numericMaxErrorMessage, + this.numericMinErrorMessage); +} diff --git a/lib/android/models/user.dart b/lib/models/user.dart similarity index 100% rename from lib/android/models/user.dart rename to lib/models/user.dart diff --git a/lib/android/models/user.g.dart b/lib/models/user.g.dart similarity index 100% rename from lib/android/models/user.g.dart rename to lib/models/user.g.dart diff --git a/lib/pages/nav_pages/main_page.dart b/lib/pages/nav_pages/main_page.dart new file mode 100644 index 0000000..1ea2f4c --- /dev/null +++ b/lib/pages/nav_pages/main_page.dart @@ -0,0 +1,100 @@ +import 'package:ernaehrung/pages/nav_pages/subpages/statistics_page/statistics_page.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/today_page/today_page.dart'; +import 'package:flutter/material.dart'; +import '../../services/statistics.dart'; +import 'subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart'; +import '../user_data_form/user_data_form.dart'; +import 'subpages/progress_page/progress_page.dart'; + +class MainPage extends StatefulWidget { + const MainPage({Key? key}) : super(key: key); + + @override + MainPageState createState() => MainPageState(); +} + +class MainPageState extends State { + 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'), + ], + ), + ); + } +} diff --git a/lib/pages/nav_pages/subpages/progress_page/progress_page.dart b/lib/pages/nav_pages/subpages/progress_page/progress_page.dart new file mode 100644 index 0000000..0a33a66 --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/progress_page.dart @@ -0,0 +1,40 @@ + +import 'package:flutter/material.dart'; + +import 'sub_components/charts/progress_charts_overview.dart'; +import 'sub_components/list_view/progress_all_meals_component.dart'; + +class ProgressPage extends StatefulWidget { + final String title; + final Color backgroundColor = const Color(0xff47a44b); + + const ProgressPage({Key? key, required this.title}) : super(key: key); + + String get getTitle => title; + + @override + String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { + return getTitle; + } + + @override + State createState() => ProgressState(); +} + +class ProgressState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: SizedBox( + width: double.infinity, + height: double.infinity, + child: SingleChildScrollView( + child: Column( + children: const [ + ProgressChartsOverviewComponent(), + ProgressAllMealsComponent(), + ], + ), + ))); + } +} diff --git a/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/progress_charts_overview.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/progress_charts_overview.dart new file mode 100644 index 0000000..281c160 --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/progress_charts_overview.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +import 'sub_components/tabs/timespan_tabs.dart'; +import 'sub_components/charts/progress_charts.dart'; + +class ProgressChartsOverviewComponent extends StatelessWidget { + const ProgressChartsOverviewComponent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 8, horizontal: 16), + child: Column( + children: const [ + TimespanTabsComponent(), + ProgressChartsComponent(), + ], + ), + ), + ); + } +} diff --git a/lib/android/components/meal_page_text/statistics_text_component.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart similarity index 73% rename from lib/android/components/meal_page_text/statistics_text_component.dart rename to lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart index 098fe8a..845ccb5 100644 --- a/lib/android/components/meal_page_text/statistics_text_component.dart +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart @@ -1,10 +1,10 @@ import 'package:flutter/cupertino.dart'; -class StaticsTextComponent extends StatelessWidget { +class HorizontalChartTextComponent extends StatelessWidget { final String name; final bool titleOrSecondary; - const StaticsTextComponent(this.name, this.titleOrSecondary, {super.key}); + const HorizontalChartTextComponent(this.name, this.titleOrSecondary, {super.key}); @override Widget build(BuildContext context) { diff --git a/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_charts.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_charts.dart new file mode 100644 index 0000000..143f923 --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_charts.dart @@ -0,0 +1,52 @@ +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_circular_chart.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_horizontal_chart.dart'; +import 'package:flutter/material.dart'; +import '../../../../../../../../services/statistics.dart'; + +class ProgressChartsComponent extends StatelessWidget { + final double heightStatisticsContainer = 220.0; + final double widthStatisticsContainer = double.infinity; + + const ProgressChartsComponent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder>( + 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)"), + ], + )) + ], + ), + ); + }); + } +} diff --git a/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_circular_chart.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_circular_chart.dart new file mode 100644 index 0000000..08065ef --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_circular_chart.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:percent_indicator/circular_percent_indicator.dart'; +import '../../../../../../../../services/statistics.dart'; + +class ProgressCircularChartComponent extends StatelessWidget { + final int totalCalories; + const ProgressCircularChartComponent(this.totalCalories, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: DataService.instance.eatenCalories, + builder: (context, value, child) { + double progress = + double.parse((value / totalCalories).toStringAsFixed(1)); + progress = progress > 1.0 ? 1.0 : progress; + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularPercentIndicator( + animation: true, + radius: 60.0, + lineWidth: 5.0, + percent: progress, + center: Text( + "$value/$totalCalories Kcal", + textAlign: TextAlign.center, + ), + progressColor: Colors.lightGreen, + ), + ], + ); + }, + ); + } +} diff --git a/lib/android/components/circular/line_circular_with_text_component.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_horizontal_chart.dart similarity index 70% rename from lib/android/components/circular/line_circular_with_text_component.dart rename to lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_horizontal_chart.dart index 1cd91c4..037e821 100644 --- a/lib/android/components/circular/line_circular_with_text_component.dart +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_horizontal_chart.dart @@ -1,15 +1,15 @@ -import 'package:ernaehrung/android/components/meal_page_text/statistics_text_component.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:percent_indicator/linear_percent_indicator.dart'; -class LineCircularWiTextComponent extends StatelessWidget { +class ProgressHorizontalChartComponent extends StatelessWidget { final Color progressColor; final double value; final int total; final String textName; - const LineCircularWiTextComponent( + const ProgressHorizontalChartComponent( this.progressColor, this.value, this.total, this.textName, {super.key}); @@ -22,7 +22,7 @@ class LineCircularWiTextComponent extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - StaticsTextComponent(double.parse(value.toString()).toStringAsFixed(2), true), + HorizontalChartTextComponent(double.parse(value.toString()).toStringAsFixed(2), true), const SizedBox(height: 4,), LinearPercentIndicator( padding: EdgeInsets.zero, @@ -31,7 +31,7 @@ class LineCircularWiTextComponent extends StatelessWidget { progressColor: progressColor, ), const SizedBox(height: 4,), - StaticsTextComponent(textName, false), + HorizontalChartTextComponent(textName, false), ], ), ); diff --git a/lib/android/components/meal_page_text/days_component.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart similarity index 62% rename from lib/android/components/meal_page_text/days_component.dart rename to lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart index 00451e3..804a2b3 100644 --- a/lib/android/components/meal_page_text/days_component.dart +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart @@ -1,6 +1,6 @@ -import 'package:ernaehrung/android/components/meal_page_text/days_text_component.dart'; -import 'package:ernaehrung/android/config/statistics.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart'; import 'package:flutter/material.dart'; +import '../../../../../../../../services/statistics.dart'; enum TimeSpan { day, @@ -9,37 +9,35 @@ enum TimeSpan { } -class DaysMealPageComponent extends StatefulWidget { - const DaysMealPageComponent({Key? key}) : super(key: key); +class TimespanTabsComponent extends StatefulWidget { + const TimespanTabsComponent({Key? key}) : super(key: key); @override State createState() => _DaysMealPageState(); } -class _DaysMealPageState extends State { +class _DaysMealPageState extends State { int activatedIndex = 0; void updateValue(int index) { setState(() { activatedIndex = index; if(activatedIndex == 0){ - StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.day); + DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.day); }else if(activatedIndex == 1){ - StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.week); + DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.week); }else if(activatedIndex == 2){ - StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.month); + DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.month); } }); } @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 0), - child: Row( + return Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - DaysTextComponent( + TimespanTabsTextComponent( timeSpan: TimeSpan.day, textColor: activatedIndex == 0 ? const Color(0xff47a44b) @@ -48,7 +46,7 @@ class _DaysMealPageState extends State { index: 0 ), - DaysTextComponent( + TimespanTabsTextComponent( timeSpan: TimeSpan.week, textColor: activatedIndex == 1 ? const Color(0xff47a44b) @@ -56,7 +54,7 @@ class _DaysMealPageState extends State { onPressed: updateValue, index: 1 ), - DaysTextComponent( + TimespanTabsTextComponent( timeSpan: TimeSpan.month, textColor: activatedIndex == 2 ? const Color(0xff47a44b) @@ -65,7 +63,6 @@ class _DaysMealPageState extends State { index: 2 ), ], - ), ); } } diff --git a/lib/android/components/meal_page_text/days_text_component.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart similarity index 63% rename from lib/android/components/meal_page_text/days_text_component.dart rename to lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart index 120e535..396ece1 100644 --- a/lib/android/components/meal_page_text/days_text_component.dart +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart @@ -1,16 +1,17 @@ -import 'package:ernaehrung/android/components/meal_page_text/days_component.dart'; -import 'package:ernaehrung/android/config/statistics.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart'; import 'package:flutter/material.dart'; -class DaysTextComponent extends StatelessWidget { +import '../../../../../../../../services/statistics.dart'; + +class TimespanTabsTextComponent extends StatelessWidget { late final String timeSpan; late final TimeSpan timespan; Function(int i) onPressed; int index; Color textColor; - late StatisticsService statisticsService; + late DataService statisticsService; - DaysTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){ + TimespanTabsTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){ timespan = timeSpan; switch(timeSpan){ case TimeSpan.day: diff --git a/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_all_meals_component.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_all_meals_component.dart new file mode 100644 index 0000000..6406e89 --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_all_meals_component.dart @@ -0,0 +1,29 @@ +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_food_list.dart'; +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import '../../../../../../services/statistics.dart'; +import '../../../../../shared_components/title.dart'; + +class ProgressAllMealsComponent extends StatelessWidget { + const ProgressAllMealsComponent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.fromLTRB(0, 16, 0, 0), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TitleComponent("Alle Mahlzeiten"), + ProgressFoodListComponent( + box: Hive.box(DataService.instance.progressBoxName), + ) + ], + ), + ); + } +} diff --git a/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_card.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_card.dart new file mode 100644 index 0000000..fb92fca --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_card.dart @@ -0,0 +1,134 @@ +import 'package:basic_utils/basic_utils.dart'; +import 'package:flutter/material.dart'; +import '../../../../../../helper/format_helper.dart'; +import '../../../../../../models/food.dart'; +import '../../../../../search_food/search_food.dart'; + +class ProgressCardComponent extends StatefulWidget { + final String eatingMealName; + final List selectedMeal; + final bool addButtonVisible; + + const ProgressCardComponent( + {Key? key, + required this.eatingMealName, + required this.selectedMeal, + this.addButtonVisible = true}) + : super(key: key); + + @override + State createState() => _ProgressCardComponentState(); +} + +class _ProgressCardComponentState extends State { + 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> map = + getMapOfDistinctElementsWithCounterAndCalories( + widget.selectedMeal); + String foodName = map.keys.elementAt(i); + List 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(), + ], + )); + } +} diff --git a/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_food_list.dart b/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_food_list.dart new file mode 100644 index 0000000..5141bee --- /dev/null +++ b/lib/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_food_list.dart @@ -0,0 +1,34 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hive_flutter/adapters.dart'; +import '../../../../../../helper/cast_helper.dart'; +import '../../../../../../services/statistics.dart'; +import 'progress_card.dart'; + +class ProgressFoodListComponent extends StatelessWidget { + final Box box; + const ProgressFoodListComponent({super.key, required this.box}); + + @override + Widget build(BuildContext context) { + + return ValueListenableBuilder( + valueListenable: box.listenable(), + builder: (context, box, widget) { + final mealTypes = ['FRÜHSTÜCK','MITTAGESSEN','ABENDESSEN']; // Specify the desired orde + return ListView.builder( + primary: false, + shrinkWrap: true, + itemCount: box.keys.length, + itemBuilder: (context, i) { + return ProgressCardComponent( + eatingMealName: mealTypes[i], + selectedMeal: castDynamicToListFood(box.get(mealTypes[i])), + addButtonVisible: box.name != DataService.instance.progressBoxName.toLowerCase(), + ); + } + ); + }); + } + + +} diff --git a/lib/pages/nav_pages/subpages/statistics_page/statistics_page.dart b/lib/pages/nav_pages/subpages/statistics_page/statistics_page.dart new file mode 100644 index 0000000..6bdcbcb --- /dev/null +++ b/lib/pages/nav_pages/subpages/statistics_page/statistics_page.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import '../../../../helper/format_helper.dart'; +import '../../../../services/statistics.dart'; +import 'sub_components/chart.dart'; +import '../../../shared_components/secondary_text.dart'; +import '../../../shared_components/title.dart'; + +class StatisticsPage extends StatelessWidget { + final String title; + final Color backgroundColor = const Color(0xff47a44b); + + const StatisticsPage({Key? key, required this.title}) : super(key: key); + + String get getTitle => title; + + @override + String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { + return getTitle; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + child: Column( + children: [ + const ChartComponent(), + Container( + margin: const EdgeInsets.fromLTRB(0, 16, 0, 0), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Padding( + padding: + const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: ValueListenableBuilder( + valueListenable: + DataService.instance.weeklyCaloryRanking, + builder: (context, value, child) { + return Column( + children: [ + const TitleComponent( + "Lebensmittel mit dem höchsten Kaloriengehalt"), + const SizedBox( + height: 5, + ), + for (var item in value) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SecondaryTextComponent( + getWeeklyRankingString(item.name,context), + value.indexOf(item)+1 + ), + SecondaryTextComponent( + item.calories.toString(), + null + ), + ], + ), + ], + ); + }, + ), + )) + ], + ), + ), + ); + } +} diff --git a/lib/pages/nav_pages/subpages/statistics_page/sub_components/chart.dart b/lib/pages/nav_pages/subpages/statistics_page/sub_components/chart.dart new file mode 100644 index 0000000..7af503d --- /dev/null +++ b/lib/pages/nav_pages/subpages/statistics_page/sub_components/chart.dart @@ -0,0 +1,308 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import '../../../../../services/statistics.dart'; +import '../../../../shared_components/secondary_text.dart'; +import '../../../../shared_components/title.dart'; + +class ChartComponent extends StatelessWidget { + const ChartComponent({Key? key}) : super(key: key); + + BarTouchData get barTouchData => BarTouchData( + enabled: false, + touchTooltipData: BarTouchTooltipData( + tooltipBgColor: Colors.transparent, + tooltipPadding: EdgeInsets.zero, + tooltipMargin: 4, + getTooltipItem: ( + BarChartGroupData group, + int groupIndex, + BarChartRodData rod, + int rodIndex, + ) { + return BarTooltipItem( + rod.toY.round().toString(), + const TextStyle( + color: Colors.transparent, + fontWeight: FontWeight.bold, + ), + ); + }, + ), + ); + + Widget getTitles(double value, TitleMeta meta) { + const style = TextStyle( + color: Colors.orange, + fontWeight: FontWeight.bold, + fontSize: 14, + ); + String text; + switch (value.toInt()) { + case 0: + text = 'M'; + break; + case 1: + text = 'T'; + break; + case 2: + text = 'W'; + break; + case 3: + text = 'T'; + break; + case 4: + text = 'F'; + break; + case 5: + text = 'S'; + break; + case 6: + text = 'S'; + break; + default: + text = ''; + break; + } + return SideTitleWidget( + axisSide: meta.axisSide, + space: 4, + child: Text(text, style: style), + ); + } + + FlTitlesData get titlesData => FlTitlesData( + show: true, + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 30, + getTitlesWidget: getTitles, + ), + ), + topTitles: AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + rightTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: false, + ), + ), + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + getTitlesWidget: (value, _) { + // Return a custom widget for each axis value + return Container( + constraints: + const BoxConstraints.tightFor(width: double.infinity), + child: Padding( + padding: const EdgeInsets.only(right: 3.0), + // Adjust the margin value as needed + child: FittedBox( + fit: BoxFit.scaleDown, + alignment: Alignment.centerLeft, + child: Text( + value.toInt().toString(), + style: const TextStyle( + color: Colors.orange, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ); + }, + ), + )); + + FlBorderData get borderData => FlBorderData( + show: true, // Set to true to display the chart border + border: const Border( + bottom: BorderSide(color: Colors.black, width: 1), + left: + BorderSide(color: Colors.black, width: 1), // Hide the left border + ), + ); + + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Padding( + padding: + const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Column( + children: [ + ValueListenableBuilder( + valueListenable: DataService + .instance.dailyAverageForCurrentWeek, + builder: (context, value, child) { + return SizedBox( + height: 100, + width: 400, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TitleComponent("Kalorien"), + const SizedBox( + height: 10, + ), + const SecondaryTextComponent( + "Durchschnittlich", + null + ), + Text( + "${value.toString()} kcal/Tag", + style: const TextStyle( + color: Colors.black, + fontSize: 30, + fontWeight: FontWeight.w600 + ), + textAlign: TextAlign.left, + ), + + ], + ), + ); + }, + ), + ValueListenableBuilder( + valueListenable: + DataService.instance.barChartData, + builder: (context, value, child) { + return SizedBox( + height: 300, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 15, + // Adjust the height of the legend as needed + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + margin: const EdgeInsets.symmetric( + horizontal: 8.0), + // Adjust the spacing between legend items + child: Row( + children: [ + Container( + width: 12, + height: 12, + decoration: const BoxDecoration( + color: Colors.yellow, + // Use the color of the first bar rod for the legend item + shape: BoxShape.circle, + ), + ), + const SizedBox(width: 4.0), + // Adjust the spacing between the color indicator and the legend label + const Text( + 'Frühstück', + // Replace with your desired legend label + style: TextStyle( + fontSize: + 12), // Adjust the font size of the legend labels + ), + ], + ), + ), + Container( + margin: const EdgeInsets.symmetric( + horizontal: 8.0), + // Adjust the spacing between legend items + child: Row( + children: [ + Container( + width: 12, + height: 12, + decoration: const BoxDecoration( + color: Colors.red, + // Use the color of the first bar rod for the legend item + shape: BoxShape.circle, + ), + ), + const SizedBox(width: 4.0), + // Adjust the spacing between the color indicator and the legend label + const Text( + 'Mittagessen', + // Replace with your desired legend label + style: TextStyle( + fontSize: + 12), // Adjust the font size of the legend labels + ), + ], + ), + ), + Container( + margin: const EdgeInsets.symmetric( + horizontal: 8.0), + // Adjust the spacing between legend items + child: Row( + children: [ + Container( + width: 12, + height: 12, + decoration: const BoxDecoration( + color: Colors.green, + // Use the color of the first bar rod for the legend item + shape: BoxShape.circle, + ), + ), + const SizedBox(width: 4.0), + // Adjust the spacing between the color indicator and the legend label + const Text( + 'Abendessen', + // Replace with your desired legend label + style: TextStyle( + fontSize: + 12), // Adjust the font size of the legend labels + ), + ], + ), + ), + ], + ), + ), + Container( + margin: + const EdgeInsets.fromLTRB(0, 24, 0, 0), + height: 250, + child: BarChart( + BarChartData( + barTouchData: barTouchData, + titlesData: titlesData, + borderData: borderData, + barGroups: value, + gridData: FlGridData(show: false), + alignment: BarChartAlignment.spaceAround, + extraLinesData: ExtraLinesData( + horizontalLines: [ + HorizontalLine( + y: DataService.instance.getCaloryTargetForOneDay(), // Specify the y-value where you want the line to be positioned + color: Colors.black, // Change the color as per your requirement + strokeWidth: 2, // Adjust the width as needed + dashArray: [3, 2], + label: HorizontalLineLabel( + show: true, + labelResolver: (x) => "Zielwert" + ) + ), + ], + ), + ), + ), + ), + ], + ), + ); + }, + ), + ], + ), + )); + } +} diff --git a/lib/pages/nav_pages/subpages/today_page/sub_components/meals.dart b/lib/pages/nav_pages/subpages/today_page/sub_components/meals.dart new file mode 100644 index 0000000..19f2160 --- /dev/null +++ b/lib/pages/nav_pages/subpages/today_page/sub_components/meals.dart @@ -0,0 +1,32 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:hive_flutter/adapters.dart'; +import '../../../../../services/statistics.dart'; +import 'today_card/today_card.dart'; + +class MealsComponent extends StatelessWidget { + MealsComponent({Key? key}) : super(key: key); + final List 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], + ); + }); + }); + } +} diff --git a/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_data_food.dart b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_data_food.dart new file mode 100644 index 0000000..244dbec --- /dev/null +++ b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_data_food.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import '../../../../../../../helper/format_helper.dart'; +import '../../../../../../../models/food.dart'; +import 'card_food_item.dart'; + + +class CardDataFoodComponent extends StatelessWidget { + final List 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> map = + getMapOfDistinctElementsWithCounterAndCalories( + foods); + String foodName = map.keys.elementAt(i); + List 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 + ), + ) + )); + } +} diff --git a/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_food_item.dart b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_food_item.dart new file mode 100644 index 0000000..5041a54 --- /dev/null +++ b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_food_item.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class CardFoodItemComponent extends StatelessWidget { + final String foodName; + final List 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), + ), + ], + )); + } +} diff --git a/lib/android/components/card/card_title_component.dart b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_title.dart similarity index 54% rename from lib/android/components/card/card_title_component.dart rename to lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_title.dart index 0e099b2..2fd86cc 100644 --- a/lib/android/components/card/card_title_component.dart +++ b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_title.dart @@ -11,18 +11,26 @@ class CardTitleComponent extends StatelessWidget { return Container( decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.all(Radius.circular(16)) + borderRadius: BorderRadius.all(Radius.circular(12)) ), child: Padding( padding: - const EdgeInsets - .symmetric( - vertical: 16, - horizontal: 8 - ), + const EdgeInsets.symmetric(vertical: 16,horizontal: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [Text(title), Text(calories)], + children: [ + Text(title, + style: const TextStyle( + fontSize: 20 + ), + ), + Text( + calories, + style: const TextStyle( + fontSize: 17 + ), + ) + ], ), ), ); diff --git a/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/today_card.dart b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/today_card.dart new file mode 100644 index 0000000..ae95ce4 --- /dev/null +++ b/lib/pages/nav_pages/subpages/today_page/sub_components/today_card/today_card.dart @@ -0,0 +1,92 @@ +import 'package:basic_utils/basic_utils.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_data_food.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_title.dart'; +import 'package:flutter/material.dart'; +import '../../../../../../helper/cast_helper.dart'; +import '../../../../../../models/food.dart'; +import '../../../../../search_food/search_food.dart'; + +class TodayCardComponent extends StatelessWidget { + final String title; + final Color color; + final List 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 foods){ + int summary = 0; + for(int i=0; i createState() => _TodayPageState(); +} + +class _TodayPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold(body: SingleChildScrollView(child: MealsComponent())); + } +} diff --git a/lib/android/pages/nav_pages/search_food.dart b/lib/pages/search_food/search_food.dart similarity index 79% rename from lib/android/pages/nav_pages/search_food.dart rename to lib/pages/search_food/search_food.dart index d29caa5..6fa8251 100644 --- a/lib/android/pages/nav_pages/search_food.dart +++ b/lib/pages/search_food/search_food.dart @@ -1,6 +1,5 @@ +import 'package:ernaehrung/pages/search_food/sub_components/search.dart'; import 'package:flutter/material.dart'; - -import '../../components/search_component.dart'; import '../../models/food.dart'; import '../../models/food_dto.dart'; @@ -28,8 +27,11 @@ class _SearchFoodPageState extends State { if (snapshot.hasData) { return SearchComponent(snapshot.data!, widget.cardName); }else { - return const Placeholder(); + return const Center( + child: CircularProgressIndicator(), // Loading animation + ); } - }))); + }) + )); } } diff --git a/lib/pages/search_food/sub_components/search.dart b/lib/pages/search_food/sub_components/search.dart new file mode 100644 index 0000000..554913a --- /dev/null +++ b/lib/pages/search_food/sub_components/search.dart @@ -0,0 +1,76 @@ +import 'package:empty_widget/empty_widget.dart'; +import 'package:flutter/material.dart'; +import '../../../models/food.dart'; +import 'searched_food.dart'; + +class SearchComponent extends StatefulWidget { + final List foods; + final String cardName; + const SearchComponent(this.foods, this.cardName, {super.key}); + + @override + State createState() => _SearchComponentState(); +} + +class _SearchComponentState extends State { + final TextEditingController controller = TextEditingController(); + late List allFoods = widget.foods; + List 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; + }); + } + +} diff --git a/lib/pages/search_food/sub_components/searched_food.dart b/lib/pages/search_food/sub_components/searched_food.dart new file mode 100644 index 0000000..40b111c --- /dev/null +++ b/lib/pages/search_food/sub_components/searched_food.dart @@ -0,0 +1,202 @@ +import 'package:assorted_layout_widgets/assorted_layout_widgets.dart'; +import 'package:basic_utils/basic_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:hive/hive.dart'; +import '../../../helper/cast_helper.dart'; +import '../../../helper/format_helper.dart'; +import '../../../models/food.dart'; +import '../../../services/statistics.dart'; + +class SearchedFoodComponent extends StatefulWidget { + final Food food; + final String cardName; + const SearchedFoodComponent(this.food, this.cardName, {Key? key}) : super(key: key); + + @override + State createState() => _SearchFoodComponentState(); +} + +class _SearchFoodComponentState extends State { + 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 newValues){ + List 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), + ), + ), + ) + + ], + ), + ); + + + + + + } +} diff --git a/lib/pages/shared_components/form_builder.dart b/lib/pages/shared_components/form_builder.dart new file mode 100644 index 0000000..ed457c1 --- /dev/null +++ b/lib/pages/shared_components/form_builder.dart @@ -0,0 +1,175 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:hive/hive.dart'; +import '../../models/form_builder.dart'; +import '../../models/user.dart'; +import 'form_builder_text_field.dart'; + +class FormBuilderComponent extends StatefulWidget { + final bool lockTextFields; + + const FormBuilderComponent({Key? key, required this.lockTextFields}) + : super(key: key); + + @override + State createState() => _FormBuilderComponentState(); +} + +class _FormBuilderComponentState extends State { + final formKey = GlobalKey(); + + final List 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(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 route) + => false) + ); + }, + child: const Text("Eingaben bestätigen"), + )), + ], + )), + )); + } +} diff --git a/lib/pages/shared_components/form_builder_text_field.dart b/lib/pages/shared_components/form_builder_text_field.dart new file mode 100644 index 0000000..b341e3b --- /dev/null +++ b/lib/pages/shared_components/form_builder_text_field.dart @@ -0,0 +1,119 @@ +import 'package:basic_utils/basic_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:hive/hive.dart'; +import '../../models/form_builder.dart'; +import '../../models/user.dart'; + +class FormBuilderTextFieldComponent extends StatefulWidget { + final bool isSettingsPage; + final FormTextField formTextField; + + const FormBuilderTextFieldComponent(this.isSettingsPage, this.formTextField, + {super.key}); + + @override + State createState() => _FormBuilderTextFieldComponentState(); +} + +class _FormBuilderTextFieldComponentState extends State { + 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(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) + ]), + ); + } +} diff --git a/lib/pages/shared_components/secondary_text.dart b/lib/pages/shared_components/secondary_text.dart new file mode 100644 index 0000000..cc515b8 --- /dev/null +++ b/lib/pages/shared_components/secondary_text.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +class SecondaryTextComponent extends StatelessWidget { + final String title; + final int? rank; + + const SecondaryTextComponent(this.title, this.rank,{Key? key,}) : super(key: key); + + @override + Widget build(BuildContext context) { + final TextStyle textStyle = TextStyle( + color: Colors.grey.shade500, + fontSize: 14, + fontWeight: FontWeight.bold, + ); + + Widget textWidget; + + if (rank != null) { + textWidget = Container( + decoration: BoxDecoration( + color: getRankColor(rank!), + borderRadius: BorderRadius.circular(15), + ), + padding: const EdgeInsets.all(8), + child: Row( + children: [ + Text( + '$rank.', + style: rank! <= 3 ? textStyle.copyWith(color: Colors.white) :textStyle.copyWith(color: Colors.grey), + ), + const SizedBox(width: 4), + Text( + title.toString(), + style: rank! <= 3 ? textStyle.copyWith(color: Colors.white) :textStyle.copyWith(color: Colors.grey), + ), + ], + ), + ); + } else { + textWidget = Text( + title.toString(), + style: textStyle, + ); + } + + return Padding( + padding: const EdgeInsets.only(top: 8.0), + child: textWidget, + ); + } + + Color getRankColor(int rank) { + if (rank == 1) { + return Colors.amber; + } else if (rank == 2) { + return Colors.grey; + } else if (rank == 3) { + return Colors.brown; + } else { + return Colors.transparent; + } + } +} diff --git a/lib/android/components/meal_page_text/title_component.dart b/lib/pages/shared_components/title.dart similarity index 100% rename from lib/android/components/meal_page_text/title_component.dart rename to lib/pages/shared_components/title.dart diff --git a/lib/pages/user_data_form/initial_user_data_form.dart b/lib/pages/user_data_form/initial_user_data_form.dart new file mode 100644 index 0000000..98828f1 --- /dev/null +++ b/lib/pages/user_data_form/initial_user_data_form.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import '../shared_components/form_builder.dart'; + +class OnboardingPage extends StatefulWidget { + const OnboardingPage({Key? key}) : super(key: key); + + @override + State createState() => _OnboardingPageState(); +} + +class _OnboardingPageState extends State { + + @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,) + ); + } +} diff --git a/lib/pages/user_data_form/user_data_form.dart b/lib/pages/user_data_form/user_data_form.dart new file mode 100644 index 0000000..565037f --- /dev/null +++ b/lib/pages/user_data_form/user_data_form.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import '../shared_components/form_builder.dart'; + + +class SettingsPage extends StatefulWidget { + const SettingsPage({Key? key}) : super(key: key); + + @override + State createState() => _SettingsPageState(); +} + +class _SettingsPageState extends State { + @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), + ); + } +} \ No newline at end of file diff --git a/lib/android/config/statistics.dart b/lib/services/statistics.dart similarity index 79% rename from lib/android/config/statistics.dart rename to lib/services/statistics.dart index 5790811..9569748 100644 --- a/lib/android/config/statistics.dart +++ b/lib/services/statistics.dart @@ -1,41 +1,52 @@ 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:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:hive/hive.dart'; +import '../pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart'; import '../models/food.dart'; -import 'format_helper.dart'; +import '../models/user.dart'; +import '../helper/cast_helper.dart'; +import '../helper/format_helper.dart'; -class StatisticsService { +class DataService { - static final StatisticsService _instance = StatisticsService._internal(); - factory StatisticsService() => _instance; + static final DataService _instance = DataService._internal(); + factory DataService() => _instance; - static StatisticsService get instance => _instance; + static DataService get instance => _instance; - StatisticsService._internal() { + DataService._internal() { + // TO RUN TESTS -> COMMENT initBoxes() out -> HIVE behavior is tested in other tests initBoxes(); } - final String todayStatisticsBoxName = dotenv.env['STATISTICS_TODAY_BOX'] ?? 'STATISTICS_TODAY_BOX'; - final String mainStatisticsBoxName = dotenv.env['STATISTICS_MAIN_BOX'] ?? 'STATISTICS_MAIN_BOX'; - final String progressStatisticsBoxName = dotenv.env['STATISTICS_PROGRESS_BOX'] ?? 'STATISTICS_PROGRESS_BOX'; + String progressBoxName = dotenv.env['PROGRESS_BOX'] ?? 'PROGRESS_BOX'; + String mainBoxName = dotenv.env['MAIN_BOX'] ?? 'MAIN_BOX'; + String statisticsBoxName = dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS_BOX'; ValueNotifier eatenCalories = ValueNotifier(0); - ValueNotifier> ingredients = ValueNotifier>([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> ingredients = ValueNotifier>([0,0,0,0,0,0,0]); ValueNotifier dailyAverageForCurrentWeek = ValueNotifier(0); ValueNotifier> weeklyCaloryRanking = ValueNotifier>([]); ValueNotifier> barChartData = ValueNotifier>([]); initBoxes()async{ - Box reducedBox = Hive.box(todayStatisticsBoxName); - Box progressBox = Hive.box(progressStatisticsBoxName); + Box reducedBox = Hive.box(progressBoxName); + Box progressBox = Hive.box(statisticsBoxName); putIfKeyNotExists([reducedBox,progressBox], 'FRÜHSTÜCK', []); putIfKeyNotExists([reducedBox,progressBox], 'MITTAGESSEN', []); putIfKeyNotExists([reducedBox,progressBox], 'ABENDESSEN', []); - updateReducedBoxByTimespan(TimeSpan.day); + updateStatisticsTodayBoxByTimespan(TimeSpan.day); } void putIfKeyNotExists(List boxes, String key, dynamic value) { @@ -46,34 +57,35 @@ class StatisticsService { } } - updateReducedBoxByTimespan(TimeSpan timeSpan){ - clearReducedBoxBeforeUpdate(); + updateStatisticsTodayBoxByTimespan(TimeSpan timespan){ + clearBoxByBox(Hive.box(progressBoxName)); int timestamp = getTimestampFromNow(); - switch(timeSpan){ + int dayLen = 1; + switch(timespan){ case TimeSpan.day: - getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(todayStatisticsBoxName)); + getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(progressBoxName)); break; case TimeSpan.week: List currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp); for(int i = 0;i < currentWeek.length;i++){ - getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(todayStatisticsBoxName)); + getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(progressBoxName)); } + dayLen = currentWeek.length; break; case TimeSpan.month: List currentMonth = getTimestampsByTimestampAndTimespan(TimeSpan.month,timestamp); for(int i = 0;i < currentMonth.length;i++){ - getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(todayStatisticsBoxName)); + getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(progressBoxName)); } + dayLen = currentMonth.length; break; } - updateCalculationsAndNotfiyListenersForPorgressStatistics(); + updateCalculationsAndNotfiyListenersForPorgressStatistics(dayLen); } - void updateCalculationsAndNotfiyListenersForPorgressStatistics(){ - eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(todayStatisticsBoxName)); - eatenCalories.notifyListeners(); - ingredients.value = getAllEatenIngredientsForTodayStatistics(); - ingredients.notifyListeners(); + void updateCalculationsAndNotfiyListenersForPorgressStatistics(int dayLen){ + eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(progressBoxName)); + ingredients.value = getAllEatenIngredientsForTodayStatistics(dayLen.roundToDouble()); } void getNewFoodAndUpdateBoxByTimestampAndBox(int timestamp, Box box){ @@ -83,7 +95,19 @@ class StatisticsService { } } + bool timestampIsValid(int timestamp){ + try{ + DateTime.fromMillisecondsSinceEpoch(timestamp*1000); + return true; + }catch(e){ + return false; + } + } + List getTimestampsByTimestampAndTimespan(TimeSpan timespan, int timestamp) { + if(!timestampIsValid(timestamp)){ + return []; + } int range = timespan == TimeSpan.week ? 7 : 31; int targetWeekday = DateTime.monday; // Example target weekday (Monday) DateTime currentDateTime = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000); @@ -99,8 +123,7 @@ class StatisticsService { return timestampsForWeekdays; } - clearReducedBoxBeforeUpdate(){ - Box box = Hive.box(todayStatisticsBoxName); + clearBoxByBox(Box box){ for(int i = 0; i < box.keys.length;i++){ box.put(box.keys.elementAt(i), []); } @@ -121,7 +144,7 @@ class StatisticsService { } Map> getFoodMapForGivenTimestampFromMainBox(int timestamp){ - Box box = Hive.box(mainStatisticsBoxName); + Box box = Hive.box(mainBoxName); dynamic matchingTimestamp = getMatchingTimestamp(box, timestamp); if(matchingTimestamp != null){ return castDynamicMap(box.get(matchingTimestamp)); @@ -152,6 +175,9 @@ class StatisticsService { } isDateEqual(int timestamp1, int timestamp2){ + if(!timestampIsValid(timestamp1) || !timestampIsValid(timestamp2)){ + return false; + } return getDayAsIntFromTimestamp(timestamp1) == getDayAsIntFromTimestamp(timestamp2) && getMonthAsIntFromTimestamp(timestamp1) == getMonthAsIntFromTimestamp(timestamp2) && @@ -160,7 +186,7 @@ class StatisticsService { addItemToMainBox(Food value, String mealType){ // Hive.deleteFromDisk(); - Box box = Hive.box(mainStatisticsBoxName); + Box box = Hive.box(mainBoxName); DateTime dateTime = DateTime.now(); // DEBUG @@ -204,8 +230,24 @@ class StatisticsService { return sum as int; } - List getAllEatenIngredientsForTodayStatistics(){ - Box box = Hive.box(todayStatisticsBoxName); + double getCaloryTargetForOneDay(){ + final Box userBox = Hive.box(dotenv.env['USER_BOX'] ?? 'USER'); + return userBox.get("USER").kalorien.toDouble(); + } + + List getAllEatenIngredientsForTodayStatistics(double dayLen){ + Box box = Hive.box(progressBoxName); + final Box userBox = Hive.box(dotenv.env['USER_BOX'] ?? 'USER'); + final calorieSummary = userBox.get("USER").kalorien; + + const double fatPercentPerThousandCalorie = 3.7; + const double proteinPercentPerThousandCalorie = 4.5; + const double carbsPercentPerThousandCalorie = 12.8; + + double fatSummary = (calorieSummary / 100) * fatPercentPerThousandCalorie; + double carbSummary = (calorieSummary / 100) * carbsPercentPerThousandCalorie; + double proteinSummary = (calorieSummary / 100) * proteinPercentPerThousandCalorie; + num fat = 0; num protein = 0; num carbs = 0; @@ -216,20 +258,26 @@ class StatisticsService { 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(){ dailyAverageForCurrentWeek.value = getAverageCaloriesForCurrentWeekOnDailyBasis(); - dailyAverageForCurrentWeek.notifyListeners(); weeklyCaloryRanking.value = getWeeklyCaloryRanking(); - weeklyCaloryRanking.notifyListeners(); barChartData.value = getBarChartData(); - barChartData.notifyListeners(); } void updateProgressBoxValues(){ - Box box = Hive.box(progressStatisticsBoxName); + Box box = Hive.box(statisticsBoxName); box.clear(); int timestamp = getTimestampFromNow(); List currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp); @@ -240,7 +288,7 @@ class StatisticsService { } int getAverageCaloriesForCurrentWeekOnDailyBasis(){ - Box box = Hive.box(progressStatisticsBoxName); + Box box = Hive.box(statisticsBoxName); return getAllEatenCaloriesByBox(box)~/7; } @@ -264,7 +312,11 @@ class StatisticsService { int getSumOfCaloriesByFoodList(List foods){ int sum = 0; for(int i = 0; i < foods.length;i++){ - sum += foods[i].calories as int; + try{ + sum += foods[i].calories as int; + }catch(e){ + throw const FormatException('please check formats'); + } } return sum; } @@ -419,17 +471,10 @@ class StatisticsService { return now.millisecondsSinceEpoch.toInt() ~/ 1000; } - showItems(){ - print("Statistics.dart - showItems() - ITEMS"); - //Hive.box(boxName).clear(); - print(Hive.box(mainStatisticsBoxName).keys.length); - for(int i = 0; i < Hive.box(mainStatisticsBoxName).keys.length; i++){ - print(Hive.box(mainStatisticsBoxName).keys.elementAt(i)); - print(Hive.box(mainStatisticsBoxName).values.elementAt(i)); - //print(Hive.box(boxName).keys.elementAt(i) + " " + Hive.box(boxName).values.elementAt(i)); - } + List getMealsOfTodayByMealtype(String mealtype){ + int timestamp = getTimestampFromNow(); + return getFoodMapForGivenTimestampFromMainBox(timestamp)[mealtype] ?? []; + } - - } \ No newline at end of file diff --git a/lib/web/component/header_button_component.dart b/lib/web/component/header_button_component.dart deleted file mode 100644 index 9dbb8ae..0000000 --- a/lib/web/component/header_button_component.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:flutter/material.dart'; - -class HeaderButton extends StatelessWidget { - final String buttonText; - final Widget page; - - const HeaderButton(this.buttonText, this.page, {super.key}); - - @override - Widget build(BuildContext context) { - return ElevatedButton(onPressed: (){ - Navigator.push( - context, - MaterialPageRoute(builder: (context) => page), - ); - }, child: Text(buttonText)); - } -} diff --git a/lib/web/component/header_component.dart b/lib/web/component/header_component.dart deleted file mode 100644 index 784d3e7..0000000 --- a/lib/web/component/header_component.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:ernaehrung/web/component/header_button_component.dart'; -import 'package:flutter/cupertino.dart'; - -class HeaderComponentWeb extends StatelessWidget { - HeaderComponentWeb({Key? key}) : super(key: key); - - final List 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}'; - } - - -} diff --git a/lib/web/component/section_component.dart b/lib/web/component/section_component.dart deleted file mode 100644 index 7f49866..0000000 --- a/lib/web/component/section_component.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:ernaehrung/android/components/statistics_circular_indicator_component.dart'; -import 'package:ernaehrung/android/config/cast_helper.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:hive_flutter/adapters.dart'; -import '../../android/components/card_component.dart'; -import '../../android/components/diet_chart_component.dart'; - -class SectionComponent extends StatelessWidget { - const SectionComponent({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SingleChildScrollView( - child: Column( - children: [ - StatisticsPercentComponent(300, 100, 400), - DietChatComponent(1500), - ValueListenableBuilder( - valueListenable: Hive.box("TODAY").listenable(), - builder: (context, box, widget) { - return ListView.builder( - primary: false, - shrinkWrap: true, - itemCount: box.keys.length, - itemBuilder: (context, i) { - if(box.keyAt(i).toString() == "DATE"){ - return const SizedBox.shrink(); - }else{ - return CardComponent( - eatingMealName: box.keyAt(i).toString(), - selectedMeal: castDynamicToListFood(box.getAt(i)), - ); - } - } - ); - }), - ], - ), - ); - } -} diff --git a/lib/web/mobile.dart b/lib/web/mobile.dart deleted file mode 100644 index d522d38..0000000 --- a/lib/web/mobile.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:ernaehrung/web/component/header_component.dart'; -import 'package:ernaehrung/web/component/section_component.dart'; -import 'package:flutter/material.dart'; - -class MobileScreen extends StatelessWidget { - const MobileScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final screenWidth = MediaQuery.of(context).size.width; - return SizedBox( - width: screenWidth, - height: screenWidth, - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(8), - child: Column( - children: [ - HeaderComponentWeb(), - Container( - margin: const EdgeInsets.fromLTRB(0, 24, 0, 0), - child: const Center( - child: SectionComponent() - ), - ) - ], - ), - ), - )); - } -} diff --git a/lib/web/web_app.dart b/lib/web/web_app.dart deleted file mode 100644 index fc02f0c..0000000 --- a/lib/web/web_app.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:ernaehrung/web/mobile.dart'; -import 'package:flutter/material.dart'; -import 'package:sizer/sizer.dart'; - -class WebApp extends StatelessWidget { - const WebApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Sizer( - builder: (context, orientation, deviceType) { - return MaterialApp( - debugShowCheckedModeBanner: false, - title: 'Sizer', - theme: ThemeData.light(), - home: const HomeScreen() , - ); - }, - ); - } -} - -class HomeScreen extends StatefulWidget { - const HomeScreen({Key? key}) : super(key: key); - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - - 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), - ], - ) - ); - } -} - - diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..675b719 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include 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); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..3e303c1 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + dynamic_color ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index e777c67..4d88d02 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,12 @@ import FlutterMacOS import Foundation +import dynamic_color +import macos_ui import path_provider_foundation 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")) } diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index c0d1a8b..0000000 --- a/pubspec.lock +++ /dev/null @@ -1,794 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: "8880b4cfe7b5b17d57c052a5a3a8cc1d4f546261c7cc8fbd717bd53f48db0568" - url: "https://pub.dev" - source: hosted - version: "59.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: a89627f49b0e70e068130a36571409726b04dab12da7e5625941d2c8ec278b96 - url: "https://pub.dev" - source: hosted - version: "5.11.1" - animate_gradient: - dependency: "direct main" - description: - name: animate_gradient - sha256: de5fa49579fed8184a9d9d30c3f46a74a3227ba148d283c20bc0e92ed9cc1545 - url: "https://pub.dev" - source: hosted - version: "0.0.2" - args: - dependency: transitive - description: - name: args - sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a - url: "https://pub.dev" - source: hosted - version: "2.4.1" - assorted_layout_widgets: - dependency: "direct main" - description: - name: assorted_layout_widgets - sha256: "63f96e75d78a037987696e0ad24be9dd18c8404d16b0785d159f4a72f2ca490d" - url: "https://pub.dev" - source: hosted - version: "8.0.0" - async: - dependency: transitive - description: - name: async - sha256: "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" diff --git a/pubspec.yaml b/pubspec.yaml index 0cbeda4..fe1eb47 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,8 +47,13 @@ dependencies: sizer: ^2.0.15 fl_chart: ^0.62.0 basic_utils: ^5.5.4 - flutter_form_builder: ^9.0.0 - form_builder_validators: ^9.0.0 + flutter_form_builder: ^8.0.0 + form_builder_validators: ^8.0.0 + fluttertoast: ^8.0.7 + flutter_profile_picture: ^2.0.0 + bs_flutter_modal: ^1.0.6 + adaptive_dialog: ^1.8.3+1 + path_provider: ^2.0.15 dev_dependencies: @@ -78,9 +83,6 @@ flutter: assets: - assets/json/csvjson_full.json - assets/json/csvjson_minified.json - - assets/images/fries.png - - assets/images/ice.png - - assets/images/tea.png - .env # To add assets to your application, add an assets section, like this: # assets: diff --git a/test/hiveboy_test.dart b/test/hiveboy_test.dart new file mode 100644 index 0000000..fbe3d89 --- /dev/null +++ b/test/hiveboy_test.dart @@ -0,0 +1,356 @@ +import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/src/adapters/date_time_adapter.dart'; +import 'package:hive/src/hive_impl.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:path_provider/path_provider.dart'; + +class _TestAdapter extends TypeAdapter { + _TestAdapter([this.typeId = 0]); + + @override + final int typeId; + + @override + int read(_) => 5; + + @override + void write(_, __) {} +} + +void main() { +// Initialize hive. + Hive.initFlutter(); + + group('HiveImpl', () { + Future 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(), + ); + expect(hive.findAdapterForTypeId(16)!.adapter, isA()); + }); + + 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('INTBOX'); + expect( + () => hive.box('intBox'), + throwsArgumentError, + ); + + await hive.openBox('DYNAMICBOX'); + expect( + () => hive.box('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('INTBOX'); + expect( + () => hive.lazyBox('intBox'), + throwsArgumentError, + ); + + await hive.openLazyBox('DYNAMICBOX'); + expect( + () => hive.lazyBox('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); + }); + }); + }); +} diff --git a/test/statistics_test.dart b/test/statistics_test.dart new file mode 100644 index 0000000..ed0c232 --- /dev/null +++ b/test/statistics_test.dart @@ -0,0 +1,98 @@ +import 'package:ernaehrung/helper/format_helper.dart'; +import 'package:ernaehrung/models/food.dart'; +import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart'; +import 'package:ernaehrung/services/statistics.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_test/flutter_test.dart'; + +// TO RUN TESTS COMMENT initBoxes() (services/statistics.dart line 21) out -> HIVE behavior is tested in other tests + +late DataService dataService; +Future 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 day = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.day,getTimestampFromNow()); + expect(31, day.length); + List week = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.week,getTimestampFromNow()); + expect(7, week.length); + List month = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.month,getTimestampFromNow()); + expect(31, month.length); + List 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)); + }); + +}