Compare commits
No commits in common. "main" and "feature/chart-progress-page" have entirely different histories.
main
...
feature/ch
|
@ -3,661 +3,601 @@
|
|||
"packages": [
|
||||
{
|
||||
"name": "_fe_analyzer_shared",
|
||||
"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",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "analyzer",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/analyzer-5.13.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/analyzer-5.11.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "animate_gradient",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animate_gradient-0.0.2+1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/animate_gradient-0.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.16"
|
||||
},
|
||||
{
|
||||
"name": "animations",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/animations-2.0.7",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "args",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.4.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/args-2.4.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "assorted_layout_widgets",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/assorted_layout_widgets-8.0.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/assorted_layout_widgets-8.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "async",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.10.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/async-2.10.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "basic_utils",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/basic_utils-5.5.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/basic_utils-5.5.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "boolean_selector",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/boolean_selector-2.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.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/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build-2.3.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build-2.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "build_config",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_config-1.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_config-1.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "build_daemon",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_daemon-3.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_daemon-3.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "build_resolvers",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_resolvers-2.2.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_resolvers-2.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "build_runner",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner-2.3.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner-2.3.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "build_runner_core",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/build_runner_core-7.2.7+1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner_core-7.2.7",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "built_collection",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_collection-5.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_collection-5.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "built_value",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/built_value-8.6.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_value-8.5.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "card_swiper",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/card_swiper-2.0.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/card_swiper-2.0.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "characters",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/characters-1.2.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/characters-1.2.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "checked_yaml",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/checked_yaml-2.0.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/checked_yaml-2.0.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "clock",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/clock-1.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "code_builder",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/code_builder-4.5.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/code_builder-4.4.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "collection",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.17.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/collection-1.17.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "convert",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/convert-3.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/convert-3.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "crypto",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/crypto-3.0.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "cupertino_icons",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.5",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "dart_style",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/dart_style-2.3.1",
|
||||
"rootUri": "file:///Users/bogdan/.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/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/empty_widget-0.0.5",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/empty_widget-0.0.5",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "equatable",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/equatable-2.0.5",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/equatable-2.0.5",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "fake_async",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fake_async-1.3.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/fake_async-1.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "ffi",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.0.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/ffi-2.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "file",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/file-6.1.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/file-6.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "fixnum",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fixnum-1.1.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/fixnum-1.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "fl_chart",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/fl_chart-0.62.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/fl_chart-0.62.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "flutter",
|
||||
"rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter",
|
||||
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "flutter_dotenv",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_dotenv-5.1.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_dotenv-5.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "flutter_form_builder",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_form_builder-8.0.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_form_builder-8.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "flutter_lints",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_lints-2.0.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_lints-2.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "flutter_localizations",
|
||||
"rootUri": "file:///C:/Users/Nutzer/flutter/packages/flutter_localizations",
|
||||
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_localizations",
|
||||
"packageUri": "lib/",
|
||||
"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/Nutzer/flutter/packages/flutter_test",
|
||||
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_test",
|
||||
"packageUri": "lib/",
|
||||
"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/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/form_builder_validators-8.6.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/form_builder_validators-8.6.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "frontend_server_client",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/frontend_server_client-3.2.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "glob",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/glob-2.1.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/glob-2.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
"languageVersion": "2.15"
|
||||
},
|
||||
{
|
||||
"name": "graphs",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/graphs-2.3.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/graphs-2.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "hive",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive-2.2.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive-2.2.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "hive_flutter",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_flutter-1.1.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_flutter-1.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "hive_generator",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/hive_generator-2.0.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_generator-2.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "http",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http-0.13.6",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/http-0.13.6",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "http_multi_server",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/http_multi_server-3.2.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "http_parser",
|
||||
"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",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_parser-4.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "intl",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/intl-0.17.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/intl-0.17.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "io",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/io-1.0.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/io-1.0.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "js",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/js-0.6.5",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/js-0.6.5",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.16"
|
||||
},
|
||||
{
|
||||
"name": "json_annotation",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/json_annotation-4.8.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/json_annotation-4.8.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "lints",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/lints-2.0.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/lints-2.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "logging",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/logging-1.2.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/logging-1.1.1",
|
||||
"packageUri": "lib/",
|
||||
"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"
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "matcher",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matcher-0.12.13",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/matcher-0.12.13",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "material_color_utilities",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/material_color_utilities-0.2.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.13"
|
||||
},
|
||||
{
|
||||
"name": "matrix4_transform",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/matrix4_transform-2.0.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/matrix4_transform-2.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.13"
|
||||
},
|
||||
{
|
||||
"name": "meta",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/meta-1.8.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/meta-1.8.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "mime",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/mime-1.0.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/mime-1.0.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "package_config",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/package_config-2.1.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/package_config-2.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path-1.8.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path-1.8.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "path_provider",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider-2.0.15",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider-2.0.14",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "path_provider_android",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_android-2.0.27",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "path_provider_foundation",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_foundation-2.2.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "path_provider_linux",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.1.11",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "path_provider_platform_interface",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_platform_interface-2.0.6",
|
||||
"rootUri": "file:///Users/bogdan/.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/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.1.7",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "percent_indicator",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/percent_indicator-4.2.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/percent_indicator-4.2.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "platform",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/platform-3.1.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/platform-3.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "plugin_platform_interface",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/plugin_platform_interface-2.1.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "pointycastle",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pointycastle-3.7.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pointycastle-3.7.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "pool",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pool-1.5.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pool-1.5.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "process",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/process-4.2.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/process-4.2.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "pub_semver",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pub_semver-2.1.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pub_semver-2.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "pubspec_parse",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/pubspec_parse-1.2.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "responsive_framework",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/responsive_framework-1.0.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/responsive_framework-1.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "searchable_listview",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/searchable_listview-2.4.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/searchable_listview-2.4.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "shelf",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf-1.4.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf-1.4.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "shelf_web_socket",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/shelf_web_socket-1.0.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "sizer",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/sizer-2.0.15",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/sizer-2.0.15",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "sky_engine",
|
||||
"rootUri": "file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine",
|
||||
"rootUri": "file:///usr/local/Caskroom/flutter/3.7.7/flutter/bin/cache/pkg/sky_engine",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "source_gen",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_gen-1.3.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_gen-1.3.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "source_helper",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_helper-1.3.3",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_helper-1.3.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "source_span",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/source_span-1.9.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_span-1.9.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "stack_trace",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stack_trace-1.11.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/stack_trace-1.11.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "stream_channel",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_channel-2.1.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_channel-2.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "stream_transform",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/stream_transform-2.1.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_transform-2.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "string_scanner",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.2.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/string_scanner-1.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "term_glyph",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/term_glyph-1.2.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/term_glyph-1.2.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "test_api",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.4.16",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/test_api-0.4.16",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "timing",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/timing-1.0.1",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/timing-1.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "typed_data",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.3.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/typed_data-1.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "universal_io",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/universal_io-2.2.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/universal_io-2.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.15"
|
||||
},
|
||||
{
|
||||
"name": "vector_math",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/vector_math-2.1.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/vector_math-2.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "watcher",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/watcher-1.0.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/watcher-1.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "web_socket_channel",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/web_socket_channel-2.4.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.15"
|
||||
},
|
||||
{
|
||||
"name": "win32",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/win32-4.1.4",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/win32-4.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "xdg_directories",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.0.0",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/xdg_directories-1.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "yaml",
|
||||
"rootUri": "file:///C:/Users/Nutzer/AppData/Local/Pub/Cache/hosted/pub.dev/yaml-3.1.2",
|
||||
"rootUri": "file:///Users/bogdan/.pub-cache/hosted/pub.dev/yaml-3.1.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
|
@ -668,7 +608,7 @@
|
|||
"languageVersion": "2.19"
|
||||
}
|
||||
],
|
||||
"generated": "2023-06-25T12:05:16.357241Z",
|
||||
"generated": "2023-05-30T21:33:05.140346Z",
|
||||
"generator": "pub",
|
||||
"generatorVersion": "2.19.6"
|
||||
}
|
||||
|
|
|
@ -1,445 +1,405 @@
|
|||
_fe_analyzer_shared
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-59.0.0/lib/
|
||||
analyzer
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/analyzer-5.11.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/analyzer-5.11.1/lib/
|
||||
animate_gradient
|
||||
2.16
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/animate_gradient-0.0.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/animate_gradient-0.0.2/lib/
|
||||
args
|
||||
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/
|
||||
2.18
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/args-2.4.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/args-2.4.1/lib/
|
||||
assorted_layout_widgets
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/assorted_layout_widgets-8.0.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/assorted_layout_widgets-8.0.0/lib/
|
||||
async
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/async-2.10.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/async-2.10.0/lib/
|
||||
basic_utils
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/basic_utils-5.5.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/basic_utils-5.5.4/lib/
|
||||
boolean_selector
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib/
|
||||
build
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build-2.3.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build-2.3.1/lib/
|
||||
build_config
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_config-1.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_config-1.1.1/lib/
|
||||
build_daemon
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_daemon-3.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_daemon-3.1.1/lib/
|
||||
build_resolvers
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_resolvers-2.2.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_resolvers-2.2.0/lib/
|
||||
build_runner
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner-2.3.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner-2.3.3/lib/
|
||||
build_runner_core
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner_core-7.2.7/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/build_runner_core-7.2.7/lib/
|
||||
built_collection
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_collection-5.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_collection-5.1.1/lib/
|
||||
built_value
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_value-8.5.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/built_value-8.5.0/lib/
|
||||
card_swiper
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/card_swiper-2.0.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/card_swiper-2.0.4/lib/
|
||||
characters
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/characters-1.2.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/characters-1.2.1/lib/
|
||||
checked_yaml
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/checked_yaml-2.0.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/checked_yaml-2.0.3/lib/
|
||||
clock
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/clock-1.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/
|
||||
code_builder
|
||||
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/
|
||||
2.17
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/code_builder-4.4.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/code_builder-4.4.0/lib/
|
||||
collection
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/collection-1.17.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/collection-1.17.0/lib/
|
||||
convert
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/convert-3.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/convert-3.1.1/lib/
|
||||
crypto
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/crypto-3.0.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/crypto-3.0.3/lib/
|
||||
cupertino_icons
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5/lib/
|
||||
dart_style
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/dart_style-2.3.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/dart_style-2.3.1/lib/
|
||||
empty_widget
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/empty_widget-0.0.5/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/empty_widget-0.0.5/lib/
|
||||
equatable
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/equatable-2.0.5/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/equatable-2.0.5/lib/
|
||||
fake_async
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fake_async-1.3.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fake_async-1.3.1/lib/
|
||||
ffi
|
||||
2.17
|
||||
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:///Users/bogdan/.pub-cache/hosted/pub.dev/ffi-2.0.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/ffi-2.0.1/lib/
|
||||
file
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/file-6.1.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/file-6.1.4/lib/
|
||||
fixnum
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fixnum-1.1.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fixnum-1.1.0/lib/
|
||||
fl_chart
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fl_chart-0.62.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/fl_chart-0.62.0/lib/
|
||||
flutter_dotenv
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_dotenv-5.0.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_dotenv-5.0.2/lib/
|
||||
flutter_form_builder
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_form_builder-8.0.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_form_builder-8.0.0/lib/
|
||||
flutter_lints
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_lints-2.0.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/flutter_lints-2.0.1/lib/
|
||||
form_builder_validators
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/form_builder_validators-8.6.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/form_builder_validators-8.6.1/lib/
|
||||
frontend_server_client
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib/
|
||||
glob
|
||||
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/
|
||||
2.15
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/glob-2.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/glob-2.1.1/lib/
|
||||
graphs
|
||||
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/
|
||||
2.12
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/graphs-2.2.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/graphs-2.2.0/lib/
|
||||
hive
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive-2.2.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/
|
||||
hive_flutter
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_flutter-1.1.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_flutter-1.1.0/lib/
|
||||
hive_generator
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_generator-2.0.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/hive_generator-2.0.0/lib/
|
||||
http
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http-0.13.6/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http-0.13.6/lib/
|
||||
http_multi_server
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1/lib/
|
||||
http_parser
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_parser-4.0.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/http_parser-4.0.2/lib/
|
||||
intl
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/intl-0.17.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/intl-0.17.0/lib/
|
||||
io
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/io-1.0.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/io-1.0.4/lib/
|
||||
js
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/js-0.6.5/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/js-0.6.5/lib/
|
||||
json_annotation
|
||||
2.19
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/
|
||||
lints
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/lints-2.0.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/lints-2.0.1/lib/
|
||||
logging
|
||||
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/
|
||||
2.18
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/logging-1.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/logging-1.1.1/lib/
|
||||
matcher
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matcher-0.12.13/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matcher-0.12.13/lib/
|
||||
material_color_utilities
|
||||
2.13
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/
|
||||
matrix4_transform
|
||||
2.13
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matrix4_transform-2.0.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/matrix4_transform-2.0.1/lib/
|
||||
meta
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/meta-1.8.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/meta-1.8.0/lib/
|
||||
mime
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/mime-1.0.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/mime-1.0.4/lib/
|
||||
package_config
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/package_config-2.1.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/package_config-2.1.0/lib/
|
||||
path
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path-1.8.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path-1.8.2/lib/
|
||||
path_provider
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider-2.0.14/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider-2.0.14/lib/
|
||||
path_provider_android
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/lib/
|
||||
path_provider_foundation
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/lib/
|
||||
path_provider_linux
|
||||
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/
|
||||
2.17
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10/lib/
|
||||
path_provider_platform_interface
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.0.6/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.0.6/lib/
|
||||
path_provider_windows
|
||||
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/
|
||||
2.17
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/lib/
|
||||
percent_indicator
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/percent_indicator-4.2.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/percent_indicator-4.2.3/lib/
|
||||
platform
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/platform-3.1.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/platform-3.1.0/lib/
|
||||
plugin_platform_interface
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.4/lib/
|
||||
pointycastle
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pointycastle-3.7.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pointycastle-3.7.3/lib/
|
||||
pool
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pool-1.5.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pool-1.5.1/lib/
|
||||
process
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/process-4.2.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/process-4.2.4/lib/
|
||||
pub_semver
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/lib/
|
||||
pubspec_parse
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3/lib/
|
||||
responsive_framework
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/responsive_framework-1.0.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/responsive_framework-1.0.0/lib/
|
||||
searchable_listview
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/searchable_listview-2.4.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/searchable_listview-2.4.0/lib/
|
||||
shelf
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf-1.4.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf-1.4.1/lib/
|
||||
shelf_web_socket
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/lib/
|
||||
sizer
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/sizer-2.0.15/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/sizer-2.0.15/lib/
|
||||
source_gen
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_gen-1.3.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_gen-1.3.0/lib/
|
||||
source_helper
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_helper-1.3.3/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_helper-1.3.3/lib/
|
||||
source_span
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_span-1.9.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/
|
||||
stack_trace
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/
|
||||
stream_channel
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/
|
||||
stream_transform
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/lib/
|
||||
string_scanner
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib/
|
||||
term_glyph
|
||||
2.12
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/
|
||||
test_api
|
||||
2.18
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/test_api-0.4.16/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/test_api-0.4.16/lib/
|
||||
timing
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/timing-1.0.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/timing-1.0.1/lib/
|
||||
typed_data
|
||||
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/
|
||||
2.12
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/typed_data-1.3.1/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/typed_data-1.3.1/lib/
|
||||
universal_io
|
||||
2.15
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/universal_io-2.2.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/universal_io-2.2.0/lib/
|
||||
vector_math
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/vector_math-2.1.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/
|
||||
watcher
|
||||
2.14
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/watcher-1.0.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/watcher-1.0.2/lib/
|
||||
web_socket_channel
|
||||
2.15
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/lib/
|
||||
win32
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/win32-4.1.4/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/win32-4.1.4/lib/
|
||||
xdg_directories
|
||||
2.17
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/xdg_directories-1.0.0/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/xdg_directories-1.0.0/lib/
|
||||
yaml
|
||||
2.19
|
||||
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
|
||||
2.12
|
||||
file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine/
|
||||
file:///C:/Users/Nutzer/flutter/bin/cache/pkg/sky_engine/lib/
|
||||
flutter
|
||||
2.17
|
||||
file:///C:/Users/Nutzer/flutter/packages/flutter/
|
||||
file:///C:/Users/Nutzer/flutter/packages/flutter/lib/
|
||||
flutter_localizations
|
||||
2.17
|
||||
file:///C:/Users/Nutzer/flutter/packages/flutter_localizations/
|
||||
file:///C:/Users/Nutzer/flutter/packages/flutter_localizations/lib/
|
||||
flutter_test
|
||||
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/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/yaml-3.1.2/
|
||||
file:///Users/bogdan/.pub-cache/hosted/pub.dev/yaml-3.1.2/lib/
|
||||
ernaehrung
|
||||
2.19
|
||||
file:///C:/Users/Nutzer/source/repos/Flutter-Ernaehrungsapp/
|
||||
file:///C:/Users/Nutzer/source/repos/Flutter-Ernaehrungsapp/lib/
|
||||
file:///Users/bogdan/IdeaProjects/ernaehrung/
|
||||
file:///Users/bogdan/IdeaProjects/ernaehrung/lib/
|
||||
sky_engine
|
||||
2.12
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/bin/cache/pkg/sky_engine/
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/bin/cache/pkg/sky_engine/lib/
|
||||
flutter
|
||||
2.17
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter/
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter/lib/
|
||||
flutter_localizations
|
||||
2.17
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_localizations/
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_localizations/lib/
|
||||
flutter_test
|
||||
2.17
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_test/
|
||||
file:///usr/local/Caskroom/flutter/3.7.7/flutter/packages/flutter_test/lib/
|
||||
2
|
||||
|
|
8
.env
8
.env
|
@ -5,16 +5,10 @@ AGE_FIELD=AGE
|
|||
WEIGHT_FIELD=WEIGHT
|
||||
HEIGHT_FIELD=HEIGHT
|
||||
CALORIES_FIELD=CALORIES
|
||||
|
||||
TODAY_BOX=TODAY
|
||||
DATE_FIELD=DATE # datum
|
||||
BREAKFAST_FIELD=FRÜHSTÜCK # frühstück
|
||||
LUNCH_FIELD=MITTAGESSEN # mittagessen
|
||||
DINNER_FIELD=ABENDESSEN # abendessen
|
||||
YESTERDAY_AND_BEFORE=YESTERDAY # gestern und alles was davor war
|
||||
TOMORROW_AND_AFTER=TOMORROW # morgen und alles was kommen wird
|
||||
|
||||
TODAY_BOX=TODAY
|
||||
PROGRESS_BOX=PROGRESS
|
||||
STATISTICS_BOX=STATISTICS
|
||||
MAIN_BOX=MAIN
|
||||
USER_BOX=USER
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"bs_flutter_modal","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_modal-1.0.6\\\\","native_build":true,"dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_utils-1.0.2\\\\","native_build":true,"dependencies":[]},{"name":"fluttertoast","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\fluttertoast-8.2.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.2.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"bs_flutter_modal","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_modal-1.0.6\\\\","native_build":true,"dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_utils-1.0.2\\\\","native_build":true,"dependencies":[]},{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"fluttertoast","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\fluttertoast-8.2.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.0.27\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"macos_ui","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\macos_ui-1.12.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.2.3\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_linux","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.1.11\\\\","native_build":false,"dependencies":[]}],"windows":[{"name":"dynamic_color","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.6.5\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_windows-2.1.7\\\\","native_build":false,"dependencies":[]}],"web":[{"name":"bs_flutter_modal","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_modal-1.0.6\\\\","dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bs_flutter_utils-1.0.2\\\\","dependencies":[]},{"name":"fluttertoast","path":"C:\\\\Users\\\\Nutzer\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\fluttertoast-8.2.2\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"bs_flutter_modal","dependencies":["bs_flutter_utils"]},{"name":"bs_flutter_utils","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"fluttertoast","dependencies":[]},{"name":"macos_ui","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2023-06-25 14:42:43.177562","version":"3.7.11"}
|
||||
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_foundation","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.2/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.10/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/bogdan/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2023-05-31 22:57:37.224562","version":"3.7.9"}
|
Binary file not shown.
After Width: | Height: | Size: 554 B |
Binary file not shown.
After Width: | Height: | Size: 509 B |
Binary file not shown.
After Width: | Height: | Size: 573 B |
|
@ -1,8 +1,8 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/main_page.dart';
|
||||
import 'package:ernaehrung/pages/user_data_form/initial_user_data_form.dart';
|
||||
import 'package:ernaehrung/android/pages/nav_pages/main_page.dart';
|
||||
import 'package:ernaehrung/android/pages/welcome.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>(dotenv.env['USER_BOX'] ?? 'USER');
|
||||
final box = Hive.box<User>('USER_BOX');
|
||||
print("got it ${box.get("USER")}");
|
||||
return MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
title: 'Flutter Demo',
|
||||
theme: ThemeData(
|
||||
scaffoldBackgroundColor: Colors.grey.shade200, //<-- SEE
|
||||
scaffoldBackgroundColor: Colors.grey.shade100, //<-- SEE
|
||||
),
|
||||
home: box.get("USER") == null ? const OnboardingPage() : const MainPage(),
|
||||
routes: {
|
|
@ -0,0 +1,27 @@
|
|||
import 'package:ernaehrung/android/components/food_list_component.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'meal_page_text/title_component.dart';
|
||||
|
||||
class MealPageStatisticsFoodComponent extends StatelessWidget {
|
||||
const MealPageStatisticsFoodComponent({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
const TitleComponent("Nahrung"),
|
||||
FoodComponent(box: Hive.box('STATISTICS_REDUCED'),)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
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:flutter/material.dart';
|
||||
|
||||
import '../../models/food.dart';
|
||||
import '../../pages/nav_pages/search_food.dart';
|
||||
|
||||
class CardComponent extends StatelessWidget {
|
||||
final String title;
|
||||
final List<dynamic> foods;
|
||||
|
||||
const CardComponent(this.title, this.foods, {super.key});
|
||||
|
||||
List<Food> castDynamicToListFood(List<dynamic> dynamicList) {
|
||||
List<Food> foodList = [];
|
||||
for (Food element in dynamicList) {
|
||||
foodList.add(element);
|
||||
}
|
||||
return foodList;
|
||||
}
|
||||
|
||||
Route createRoute(String cardName) {
|
||||
return PageRouteBuilder(
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
SearchFoodPage(cardName),
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||
const begin = Offset(0.0, 1.0);
|
||||
const end = Offset.zero;
|
||||
const curve = Curves.ease;
|
||||
|
||||
var tween =
|
||||
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
|
||||
|
||||
return SlideTransition(
|
||||
position: animation.drive(tween),
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
height: 300,
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFF6E7BFB),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(16)),
|
||||
border: Border.all(
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
margin: const EdgeInsets.fromLTRB(0, 16, 0, 16),
|
||||
child: Column(
|
||||
children: [
|
||||
CardTitleComponent(
|
||||
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'),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
import 'package:ernaehrung/android/components/card/card_food_item_component.dart';
|
||||
import 'package:ernaehrung/android/models/food.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CardDataFoodComponent extends StatelessWidget {
|
||||
final List<Food> foods;
|
||||
|
||||
const CardDataFoodComponent(this.foods, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
height: 180,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
ListView.builder(
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemCount: foods.length,
|
||||
itemBuilder: (context, i) {
|
||||
return Column(
|
||||
children: [
|
||||
CardFoodItemComponent(foods[i]),
|
||||
Divider(
|
||||
color: Colors.grey.shade300,
|
||||
thickness: 1.2,
|
||||
)
|
||||
],
|
||||
);
|
||||
})
|
||||
],
|
||||
),
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
import 'package:ernaehrung/android/models/food.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CardFoodItemComponent extends StatelessWidget {
|
||||
final Food food;
|
||||
|
||||
const CardFoodItemComponent(this.food, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.fromLTRB(0, 8, 0, 4),
|
||||
width: double.infinity,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 6,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
food.name.toString(),
|
||||
style: const TextStyle(color: Colors.white),
|
||||
softWrap: true,
|
||||
),
|
||||
Text(
|
||||
food.calories.toString(),
|
||||
style: const TextStyle(color: Colors.white),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 1, child: TextButton(onPressed: () {}, child: Text("+")))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -11,26 +11,18 @@ class CardTitleComponent extends StatelessWidget {
|
|||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12))
|
||||
borderRadius: BorderRadius.all(Radius.circular(16))
|
||||
),
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 16,horizontal: 16),
|
||||
const EdgeInsets
|
||||
.symmetric(
|
||||
vertical: 16,
|
||||
horizontal: 8
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(title,
|
||||
style: const TextStyle(
|
||||
fontSize: 20
|
||||
),
|
||||
),
|
||||
Text(
|
||||
calories,
|
||||
style: const TextStyle(
|
||||
fontSize: 17
|
||||
),
|
||||
)
|
||||
],
|
||||
children: [Text(title), Text(calories)],
|
||||
),
|
||||
),
|
||||
);
|
|
@ -0,0 +1,155 @@
|
|||
import 'package:basic_utils/basic_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import '../config/format_helper.dart';
|
||||
import '../models/food.dart';
|
||||
import '../pages/nav_pages/search_food.dart';
|
||||
|
||||
class CardComponent extends StatefulWidget {
|
||||
final String eatingMealName;
|
||||
final List<Food> selectedMeal;
|
||||
final bool addButtonVisible;
|
||||
|
||||
const CardComponent(
|
||||
{Key? key, required this.eatingMealName, required this.selectedMeal, this.addButtonVisible = true})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<CardComponent> createState() => _CardComponentState();
|
||||
}
|
||||
|
||||
class _CardComponentState extends State<CardComponent> {
|
||||
Route createRoute(String cardName) {
|
||||
return PageRouteBuilder(
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
SearchFoodPage(cardName),
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||
const begin = Offset(0.0, 1.0);
|
||||
const end = Offset.zero;
|
||||
const curve = Curves.ease;
|
||||
|
||||
var tween =
|
||||
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
|
||||
|
||||
return SlideTransition(
|
||||
position: animation.drive(tween),
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
getImageOfMeal() {
|
||||
if (widget.eatingMealName.toLowerCase() == dotenv.env['BREAKFAST_FIELD']!.toLowerCase()) {
|
||||
return const Image(image: AssetImage('assets/images/tea.png'));
|
||||
} else if (widget.eatingMealName.toLowerCase() == dotenv.env['LUNCH_FIELD']!.toLowerCase()) {
|
||||
return const Image(image: AssetImage('assets/images/fries.png'));
|
||||
} else if (widget.eatingMealName.toLowerCase() == dotenv.env['DINNER_FIELD']!.toLowerCase()) {
|
||||
return const Image(image: AssetImage('assets/images/ice.png'));
|
||||
}
|
||||
}
|
||||
|
||||
String capitalize(String s) => s[0].toUpperCase() + s.substring(1);
|
||||
|
||||
String listFoodAsString() {
|
||||
String mealAsString = "";
|
||||
for (final food in widget.selectedMeal) {
|
||||
mealAsString = "${food.name} ";
|
||||
}
|
||||
return mealAsString;
|
||||
}
|
||||
|
||||
Widget getElevatedButton() {
|
||||
if(widget.addButtonVisible){
|
||||
return ElevatedButton(
|
||||
onPressed: () async {
|
||||
Navigator.of(context).push(createRoute(widget.eatingMealName));
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
shape: const CircleBorder(),
|
||||
padding: const EdgeInsets.all(0),
|
||||
),
|
||||
child: const Text(
|
||||
'+',
|
||||
style: TextStyle(fontSize: 28),
|
||||
),
|
||||
);
|
||||
}else{
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int getCountedCalories() {
|
||||
double calories = 0;
|
||||
for (Food food in widget.selectedMeal) {
|
||||
if (food.calories is int){
|
||||
calories += food.calories as int;
|
||||
}else if(food.calories is double){
|
||||
calories += food.calories as double;
|
||||
}
|
||||
}
|
||||
return calories.round();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
margin: const EdgeInsets.fromLTRB(0, 24, 0, 0),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
getImageOfMeal(),
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.6,
|
||||
child: Text(
|
||||
StringUtils.capitalize(widget.eatingMealName),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
softWrap: false,
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
getElevatedButton(),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.8,
|
||||
child:ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: getMapOfDistinctElementsWithCounterAndCalories(widget.selectedMeal).keys.length,
|
||||
itemBuilder: (context, i) {
|
||||
Map<String,List<int>> map = getMapOfDistinctElementsWithCounterAndCalories(widget.selectedMeal);
|
||||
String foodName = map.keys.elementAt(i);
|
||||
List<int> values = map.values.elementAt(i);
|
||||
return Text(
|
||||
getFoodListStringByFood(foodName, values[0], values[1])
|
||||
);
|
||||
}
|
||||
),
|
||||
),
|
||||
widget.selectedMeal.isNotEmpty
|
||||
? const Divider()
|
||||
: const SizedBox.shrink(),
|
||||
widget.selectedMeal.isNotEmpty
|
||||
? Text("${getCountedCalories()} kcal")
|
||||
: const SizedBox.shrink(),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
import 'package:ernaehrung/android/config/statistics.dart';
|
||||
import 'package:ernaehrung/android/models/user.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:percent_indicator/circular_percent_indicator.dart';
|
||||
|
||||
class CircularLoadingComponent extends StatelessWidget {
|
||||
CircularLoadingComponent({Key? key}) : super(key: key);
|
||||
final int? targetCaolries = Hive.box<User>("USER_BOX").get("USER")?.kalorien;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {;
|
||||
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: StatisticsService.instance.eatenCalories,
|
||||
builder: (context, value, child) {
|
||||
double progress = double.parse((value / targetCaolries!).toStringAsFixed(1));
|
||||
progress = progress > 1.0 ? 1.0 : progress;
|
||||
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CircularPercentIndicator(
|
||||
animation: true,
|
||||
radius: 60.0,
|
||||
lineWidth: 5.0,
|
||||
percent: progress,
|
||||
center: Text(
|
||||
"$value/$targetCaolries Kcal",
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
progressColor: Colors.lightGreen,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -1,15 +1,15 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/horizontal_chart_text_component.dart';
|
||||
import 'package:ernaehrung/android/components/meal_page_text/statistics_text_component.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:percent_indicator/linear_percent_indicator.dart';
|
||||
|
||||
class ProgressHorizontalChartComponent extends StatelessWidget {
|
||||
class LineCircularWiTextComponent extends StatelessWidget {
|
||||
final Color progressColor;
|
||||
final double value;
|
||||
final int total;
|
||||
final String textName;
|
||||
|
||||
const ProgressHorizontalChartComponent(
|
||||
const LineCircularWiTextComponent(
|
||||
this.progressColor, this.value, this.total, this.textName,
|
||||
{super.key});
|
||||
|
||||
|
@ -22,7 +22,7 @@ class ProgressHorizontalChartComponent extends StatelessWidget {
|
|||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
HorizontalChartTextComponent(double.parse(value.toString()).toStringAsFixed(2), true),
|
||||
StaticsTextComponent(double.parse(value.toString()).toStringAsFixed(2), true),
|
||||
const SizedBox(height: 4,),
|
||||
LinearPercentIndicator(
|
||||
padding: EdgeInsets.zero,
|
||||
|
@ -31,7 +31,7 @@ class ProgressHorizontalChartComponent extends StatelessWidget {
|
|||
progressColor: progressColor,
|
||||
),
|
||||
const SizedBox(height: 4,),
|
||||
HorizontalChartTextComponent(textName, false),
|
||||
StaticsTextComponent(textName, false),
|
||||
],
|
||||
),
|
||||
);
|
|
@ -0,0 +1,74 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:percent_indicator/linear_percent_indicator.dart';
|
||||
|
||||
class DietChatComponent extends StatefulWidget {
|
||||
final double fatPercentPerThousandCalorie = 3.7;
|
||||
final double proteinPercentPerThousandCalorie = 4.5;
|
||||
final double carbsPercentPerThousandCalorie = 12.8;
|
||||
|
||||
final String carbs = "Kohlenhydrate";
|
||||
final String protein = "Protein";
|
||||
final String fat = "Fett";
|
||||
|
||||
late String fatGramm, carbGramm, proteinGramm = "";
|
||||
late double fatSummary, carbSummary, proteinSummary = 0.0;
|
||||
|
||||
DietChatComponent(int calorienSummary, {super.key, int calorienLeft = 0}){
|
||||
fatSummary = (calorienSummary / 100) * fatPercentPerThousandCalorie;
|
||||
carbSummary = (calorienSummary / 100) * carbsPercentPerThousandCalorie;
|
||||
proteinSummary = (calorienSummary / 100) * proteinPercentPerThousandCalorie;
|
||||
fatGramm = '0 / $fatSummary g';
|
||||
carbGramm = '0 / $carbSummary g';
|
||||
proteinGramm = '0 / $proteinSummary g';
|
||||
}
|
||||
|
||||
@override
|
||||
State<DietChatComponent> createState() => _DietChatComponentState();
|
||||
}
|
||||
|
||||
class _DietChatComponentState extends State<DietChatComponent> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
Text(widget.carbs),
|
||||
LinearPercentIndicator(
|
||||
width: 100.0,
|
||||
lineHeight: 8.0,
|
||||
percent: 0.9,
|
||||
progressColor: Colors.blue,
|
||||
),
|
||||
Text(widget.carbGramm)
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text(widget.protein),
|
||||
LinearPercentIndicator(
|
||||
width: 100.0,
|
||||
lineHeight: 8.0,
|
||||
percent: 0.9,
|
||||
progressColor: Colors.blue,
|
||||
),
|
||||
Text(widget.proteinGramm)
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text(widget.fat),
|
||||
LinearPercentIndicator(
|
||||
width: 100.0,
|
||||
lineHeight: 8.0,
|
||||
percent: 0.9,
|
||||
progressColor: Colors.blue,
|
||||
),
|
||||
Text(widget.fatGramm)
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
import 'package:ernaehrung/android/config/cast_helper.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:hive_flutter/adapters.dart';
|
||||
import 'card_component.dart';
|
||||
|
||||
class FoodComponent extends StatelessWidget {
|
||||
final Box box;
|
||||
const FoodComponent({super.key, required this.box});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: box.listenable(),
|
||||
builder: (context, box, widget) {
|
||||
return ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: box.keys.length,
|
||||
itemBuilder: (context, i) {
|
||||
if (box.keyAt(i).toString() == "DATE") {
|
||||
return const SizedBox.shrink();
|
||||
} else {
|
||||
return CardComponent(
|
||||
eatingMealName: box.keyAt(i).toString(),
|
||||
selectedMeal: castDynamicToListFood(box.getAt(i)),
|
||||
addButtonVisible: box.name != 'statistics_reduced',
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
import 'package:assorted_layout_widgets/assorted_layout_widgets.dart';
|
||||
import 'package:ernaehrung/android/config/cast_helper.dart';
|
||||
import 'package:ernaehrung/android/config/statistics.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import '../models/food.dart';
|
||||
|
||||
class SearchedFoodComponent extends StatefulWidget {
|
||||
final Food food;
|
||||
final String cardName;
|
||||
const SearchedFoodComponent(this.food, this.cardName, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SearchedFoodComponent> createState() => _SearchFoodComponentState();
|
||||
}
|
||||
|
||||
class _SearchFoodComponentState extends State<SearchedFoodComponent> {
|
||||
StatisticsService statisticsService = StatisticsService();
|
||||
|
||||
void storeFood() async {
|
||||
statisticsService.addItemToMainBox(widget.food, widget.cardName);
|
||||
final todayBox = Hive.box(dotenv.env['TODAY_BOX']!);
|
||||
if (!todayBox.isOpen){
|
||||
Hive.openBox(dotenv.env['TODAY_BOX']!);
|
||||
}
|
||||
addValuesToList(todayBox, widget.cardName, [widget.food]);
|
||||
}
|
||||
|
||||
void addValuesToList(box, String key, List<Food> newValues){
|
||||
List<Food> existingList = castDynamicToListFood(box.get(key));
|
||||
for(int i = 0; i < newValues.length;i++){
|
||||
if(!existingList.contains(newValues[i])){
|
||||
existingList.add(newValues[i]);
|
||||
}
|
||||
}
|
||||
box.put(key, existingList);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
decoration:
|
||||
const BoxDecoration(color: Color.fromARGB(234, 234, 123, 5)),
|
||||
child: WrapSuper(
|
||||
spacing: 32,
|
||||
wrapType: WrapType.balanced,
|
||||
wrapFit: WrapFit.larger,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.6,
|
||||
child: Text(
|
||||
widget.food.name,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
softWrap: false,
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20.0),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.6,
|
||||
child: Text(
|
||||
"${widget.food.fatg} 100g "
|
||||
"${widget.food.calories} 100g "
|
||||
"${widget.food.carbohydrateg.toString()} 100g",
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
softWrap: false,
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20.0),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
storeFood();
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
foregroundColor: Colors.white,
|
||||
backgroundColor: Colors.green,
|
||||
shadowColor: Colors.greenAccent,
|
||||
elevation: 3,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(32.0)),
|
||||
maximumSize: Size(
|
||||
MediaQuery.of(context).size.width * 0.2, 36), //////// HERE
|
||||
),
|
||||
child: const Text('+'),
|
||||
)
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs_text.dart';
|
||||
import 'package:ernaehrung/android/components/meal_page_text/days_text_component.dart';
|
||||
import 'package:ernaehrung/android/config/statistics.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../../../../../../services/statistics.dart';
|
||||
|
||||
enum TimeSpan {
|
||||
day,
|
||||
|
@ -9,35 +9,38 @@ enum TimeSpan {
|
|||
}
|
||||
|
||||
|
||||
class TimespanTabsComponent extends StatefulWidget {
|
||||
const TimespanTabsComponent({Key? key}) : super(key: key);
|
||||
class DaysMealPageComponent extends StatefulWidget {
|
||||
const DaysMealPageComponent({Key? key}) : super(key: key);
|
||||
@override
|
||||
State<StatefulWidget> createState() => _DaysMealPageState();
|
||||
}
|
||||
|
||||
|
||||
class _DaysMealPageState extends State<TimespanTabsComponent> {
|
||||
class _DaysMealPageState extends State<DaysMealPageComponent> {
|
||||
int activatedIndex = 0;
|
||||
StatisticsService statisticsService = StatisticsService();
|
||||
|
||||
void updateValue(int index) {
|
||||
setState(() {
|
||||
activatedIndex = index;
|
||||
if(activatedIndex == 0){
|
||||
DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.day);
|
||||
statisticsService.updateReducedBoxByTimespan(TimeSpan.day);
|
||||
}else if(activatedIndex == 1){
|
||||
DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.week);
|
||||
statisticsService.updateReducedBoxByTimespan(TimeSpan.week);
|
||||
}else if(activatedIndex == 2){
|
||||
DataService.instance.updateStatisticsTodayBoxByTimespan(TimeSpan.month);
|
||||
statisticsService.updateReducedBoxByTimespan(TimeSpan.month);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
TimespanTabsTextComponent(
|
||||
DaysTextComponent(
|
||||
timeSpan: TimeSpan.day,
|
||||
textColor: activatedIndex == 0
|
||||
? const Color(0xff47a44b)
|
||||
|
@ -46,7 +49,7 @@ class _DaysMealPageState extends State<TimespanTabsComponent> {
|
|||
index: 0
|
||||
|
||||
),
|
||||
TimespanTabsTextComponent(
|
||||
DaysTextComponent(
|
||||
timeSpan: TimeSpan.week,
|
||||
textColor: activatedIndex == 1
|
||||
? const Color(0xff47a44b)
|
||||
|
@ -54,7 +57,7 @@ class _DaysMealPageState extends State<TimespanTabsComponent> {
|
|||
onPressed: updateValue,
|
||||
index: 1
|
||||
),
|
||||
TimespanTabsTextComponent(
|
||||
DaysTextComponent(
|
||||
timeSpan: TimeSpan.month,
|
||||
textColor: activatedIndex == 2
|
||||
? const Color(0xff47a44b)
|
||||
|
@ -63,6 +66,7 @@ class _DaysMealPageState extends State<TimespanTabsComponent> {
|
|||
index: 2
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,17 +1,16 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
|
||||
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
|
||||
import 'package:ernaehrung/android/config/statistics.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../../../../../../services/statistics.dart';
|
||||
|
||||
class TimespanTabsTextComponent extends StatelessWidget {
|
||||
class DaysTextComponent extends StatelessWidget {
|
||||
late final String timeSpan;
|
||||
late final TimeSpan timespan;
|
||||
Function(int i) onPressed;
|
||||
int index;
|
||||
Color textColor;
|
||||
late DataService statisticsService;
|
||||
late StatisticsService statisticsService;
|
||||
|
||||
TimespanTabsTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){
|
||||
DaysTextComponent({super.key, required TimeSpan timeSpan, required this.textColor, required this.onPressed, required this.index}){
|
||||
timespan = timeSpan;
|
||||
switch(timeSpan){
|
||||
case TimeSpan.day:
|
|
@ -0,0 +1,19 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class SecondaryBigTextComponent extends StatelessWidget {
|
||||
final String title;
|
||||
|
||||
const SecondaryBigTextComponent(this.title, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Text(
|
||||
title.toString(),
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: 30,
|
||||
fontWeight: FontWeight.w600),
|
||||
textAlign: TextAlign.left,
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class SecondaryTextComponent extends StatelessWidget {
|
||||
final String title;
|
||||
|
||||
const SecondaryTextComponent(this.title, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Text(
|
||||
title.toString(),
|
||||
style: TextStyle(
|
||||
color: Colors.grey.shade500,
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w500),
|
||||
textAlign: TextAlign.left,
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
class HorizontalChartTextComponent extends StatelessWidget {
|
||||
class StaticsTextComponent extends StatelessWidget {
|
||||
final String name;
|
||||
final bool titleOrSecondary;
|
||||
|
||||
const HorizontalChartTextComponent(this.name, this.titleOrSecondary, {super.key});
|
||||
const StaticsTextComponent(this.name, this.titleOrSecondary, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
|
@ -0,0 +1,56 @@
|
|||
import 'package:ernaehrung/android/components/circular/circular_component.dart';
|
||||
import 'package:ernaehrung/android/components/circular/line_circular_with_text_component.dart';
|
||||
import 'package:ernaehrung/android/config/statistics.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class StatisticsPercentage extends StatelessWidget {
|
||||
final double heightStatisticsContainer = 220.0;
|
||||
final double widthStatisticsContainer = double.infinity;
|
||||
|
||||
const StatisticsPercentage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration:
|
||||
BoxDecoration(border: Border.all(width: 2.0, color: Colors.black)),
|
||||
height: heightStatisticsContainer,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
|
||||
child: FittedBox(
|
||||
child: CircularLoadingComponent(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: ValueListenableBuilder<List<double>>(
|
||||
valueListenable: StatisticsService.instance.ingredients,
|
||||
builder: (context, value, child) {
|
||||
print("value ${value}");
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
// TODO adjust 200 to values from user box
|
||||
LineCircularWiTextComponent(
|
||||
Colors.lightGreen, value[0], 200, "Fat (g)"),
|
||||
LineCircularWiTextComponent(
|
||||
Colors.lightGreen, value[1], 200, "Protein (g)"),
|
||||
LineCircularWiTextComponent(
|
||||
Colors.lightGreen, value[2], 200, "Carbohydrate (g)"),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import 'package:empty_widget/empty_widget.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
class NotFoundComponent extends StatelessWidget {
|
||||
const NotFoundComponent({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return EmptyWidget(
|
||||
image: null,
|
||||
packageImage: PackageImage.Image_1,
|
||||
title: 'Gericht existiert nicht',
|
||||
titleTextStyle: const TextStyle(
|
||||
fontSize: 18,
|
||||
color: Color(0xff9da9c7),
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
import 'package:empty_widget/empty_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../models/food.dart';
|
||||
import 'founded_search_component.dart';
|
||||
|
||||
class SearchComponent extends StatefulWidget {
|
||||
final List<Food> foods;
|
||||
final String cardName;
|
||||
const SearchComponent(this.foods, this.cardName, {super.key});
|
||||
|
||||
@override
|
||||
State<SearchComponent> createState() => _SearchComponentState();
|
||||
}
|
||||
|
||||
class _SearchComponentState extends State<SearchComponent> {
|
||||
final TextEditingController controller = TextEditingController();
|
||||
late List<Food> allFoods = widget.foods;
|
||||
List<Food> foundedFood = [];
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
constraints: const BoxConstraints.expand(),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(0, 16, 0, 0),
|
||||
child: Column(
|
||||
children: [
|
||||
TextField(
|
||||
controller: controller,
|
||||
decoration: InputDecoration(
|
||||
prefix: const Icon(Icons.search),
|
||||
hintText: 'Suche nach Gericht',
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: Colors.blue))),
|
||||
onChanged: findOnChanged,
|
||||
),
|
||||
Expanded(
|
||||
child: controller.text.isNotEmpty && foundedFood.isNotEmpty
|
||||
? ListView.builder(
|
||||
itemCount: foundedFood.length,
|
||||
itemBuilder: (context, index) {
|
||||
final food = foundedFood[index];
|
||||
return SearchedFoodComponent(food, widget.cardName);
|
||||
})
|
||||
: EmptyWidget())
|
||||
],
|
||||
)));
|
||||
}
|
||||
|
||||
void findOnChanged(String searchedFood) async {
|
||||
foundedFood.clear();
|
||||
if(searchedFood.isEmpty){
|
||||
setState(() {});
|
||||
return;
|
||||
}else{
|
||||
for (final food in allFoods) {
|
||||
if (food.name.toString().toLowerCase().contains(searchedFood)) {
|
||||
foundedFood.add(food);
|
||||
}
|
||||
}
|
||||
setState(() => {foundedFood});
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
import 'package:ernaehrung/android/components/circular/circular_component.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class StatisticsPercentComponent extends StatelessWidget {
|
||||
late int eaten, calorienBurned, calorienLeft, calorienLeftPercent;
|
||||
|
||||
StatisticsPercentComponent(this.eaten, this.calorienBurned, this.calorienLeft, {super.key});
|
||||
|
||||
int get getEaten => eaten;
|
||||
get getCalorienBurned => calorienBurned;
|
||||
get getCalorienLeft => calorienLeft;
|
||||
get getCalorienLeftPercent => calorienLeftPercent;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("$eaten gegessen"),
|
||||
CircularLoadingComponent(),
|
||||
Text("$calorienBurned verbrannt"),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,192 @@
|
|||
import 'package:ernaehrung/android/pages/nav_pages/main_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class WelcomePageStateTextFieldState extends StatefulWidget {
|
||||
const WelcomePageStateTextFieldState({super.key});
|
||||
|
||||
@override
|
||||
State<WelcomePageStateTextFieldState> createState() =>
|
||||
_WelcomePageStateTextFieldState();
|
||||
}
|
||||
|
||||
class _WelcomePageStateTextFieldState
|
||||
extends State<WelcomePageStateTextFieldState> {
|
||||
final firstnameTextEditingController = TextEditingController();
|
||||
final secondnameTextEditingController = TextEditingController();
|
||||
final weightTextEditingController = TextEditingController();
|
||||
final heightTextEditingController = TextEditingController();
|
||||
final caloriesTextEditingController = TextEditingController();
|
||||
|
||||
bool isNameVisible = false;
|
||||
bool isSNameVisible = false;
|
||||
bool isWeightVisible = false;
|
||||
bool isHeightVisible = false;
|
||||
bool isCaloriesVisible = false;
|
||||
|
||||
void setNameVisible(bool visibility) {
|
||||
setState(() => isNameVisible = visibility);
|
||||
}
|
||||
|
||||
void setSNameVisible(bool visibility) {
|
||||
setState(() => isSNameVisible = visibility);
|
||||
}
|
||||
|
||||
void setWeightVisible(bool visibility) {
|
||||
setState(() => isWeightVisible = visibility);
|
||||
}
|
||||
|
||||
void setHeightVisible(bool visibility) {
|
||||
setState(() => isHeightVisible = visibility);
|
||||
}
|
||||
|
||||
void setCaloriesVisible(bool visibility) {
|
||||
setState(() => isCaloriesVisible = visibility);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
TextFormField(
|
||||
onChanged: (newText) {
|
||||
if (newText.isNotEmpty) {
|
||||
setNameVisible(true);
|
||||
} else {
|
||||
setNameVisible(false);
|
||||
}
|
||||
},
|
||||
controller: firstnameTextEditingController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Name',
|
||||
border: const OutlineInputBorder(gapPadding: 8),
|
||||
suffixIcon: isNameVisible
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
firstnameTextEditingController.clear();
|
||||
setState(() => isNameVisible = false);
|
||||
},
|
||||
icon: const Icon(Icons.clear))
|
||||
: null,
|
||||
),
|
||||
keyboardType: TextInputType.text,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
TextFormField(
|
||||
onChanged: (newText) {
|
||||
if (newText.isNotEmpty) {
|
||||
setSNameVisible(true);
|
||||
} else {
|
||||
setSNameVisible(false);
|
||||
}
|
||||
},
|
||||
controller: secondnameTextEditingController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Vorname',
|
||||
border: const OutlineInputBorder(gapPadding: 8),
|
||||
suffixIcon: isSNameVisible
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
secondnameTextEditingController.clear();
|
||||
setState(() => isSNameVisible = false);
|
||||
},
|
||||
icon: const Icon(Icons.clear))
|
||||
: null,
|
||||
),
|
||||
keyboardType: TextInputType.text),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
TextFormField(
|
||||
onChanged: (newText) {
|
||||
if (newText.isNotEmpty) {
|
||||
setWeightVisible(true);
|
||||
} else {
|
||||
setWeightVisible(false);
|
||||
}
|
||||
},
|
||||
controller: weightTextEditingController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Gewicht',
|
||||
border: const OutlineInputBorder(gapPadding: 8),
|
||||
suffixIcon: isWeightVisible
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
weightTextEditingController.clear();
|
||||
setState(() => isWeightVisible = false);
|
||||
},
|
||||
icon: const Icon(Icons.clear))
|
||||
: null,
|
||||
),
|
||||
keyboardType: TextInputType.number),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
TextFormField(
|
||||
onChanged: (newText) {
|
||||
if (newText.isNotEmpty) {
|
||||
setHeightVisible(true);
|
||||
} else {
|
||||
setHeightVisible(false);
|
||||
}
|
||||
},
|
||||
controller: heightTextEditingController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Größe',
|
||||
border: const OutlineInputBorder(gapPadding: 8),
|
||||
suffixIcon: isHeightVisible
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
heightTextEditingController.clear();
|
||||
setState(() => isHeightVisible = false);
|
||||
},
|
||||
icon: const Icon(Icons.clear))
|
||||
: null,
|
||||
),
|
||||
keyboardType: TextInputType.number),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
TextFormField(
|
||||
onChanged: (newText) {
|
||||
if (newText.isNotEmpty) {
|
||||
setCaloriesVisible(true);
|
||||
} else {
|
||||
setCaloriesVisible(false);
|
||||
}
|
||||
},
|
||||
controller: caloriesTextEditingController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'gewünschte Kalorienzufuhr',
|
||||
border: const OutlineInputBorder(gapPadding: 8),
|
||||
suffixIcon: isCaloriesVisible
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
caloriesTextEditingController.clear();
|
||||
setState(() => isCaloriesVisible = false);
|
||||
},
|
||||
icon: const Icon(Icons.clear))
|
||||
: null,
|
||||
),
|
||||
keyboardType: TextInputType.number),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
Navigator.pushAndRemoveUntil(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const MainPage()),
|
||||
(r) => false);
|
||||
},
|
||||
child: const Text('Bestätigen'))
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,37 +1,14 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
import '../models/food.dart';
|
||||
|
||||
String getFoodListStringByFood(String foodName, int count, int calories, BuildContext? context){
|
||||
String getFoodListStringByFood(String foodName, int count, int calories){
|
||||
int maxWidth = 35;
|
||||
if(context != null){
|
||||
maxWidth = isScreenWidthAbove1000(context) ? 100 : 35;
|
||||
}
|
||||
String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... $count x $calories kcal" : "$foodName $count x $calories kcal";
|
||||
return limitedText;
|
||||
}
|
||||
|
||||
|
||||
bool isScreenWidthAbove1000(BuildContext context) {
|
||||
double screenWidth = MediaQuery.of(context).size.width;
|
||||
return screenWidth > 400;
|
||||
}
|
||||
|
||||
String getWeeklyRankingString(String foodName,BuildContext? context){
|
||||
int maxWidth = 40;
|
||||
if(context != null){
|
||||
maxWidth = isScreenWidthAbove1000(context) ? 100 : 40;
|
||||
}
|
||||
String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ..." : foodName;
|
||||
return limitedText;
|
||||
}
|
||||
|
||||
String getToastFoodNameString(Food food,BuildContext? context){
|
||||
int maxWidth = 25;
|
||||
if(context != null){
|
||||
maxWidth = isScreenWidthAbove1000(context) ? 100 : 25;
|
||||
}
|
||||
String limitedText = food.name.length > maxWidth ? "${food.name.substring(0, maxWidth - 3)} ..." : food.name;
|
||||
String getWeeklyRankingString(String foodName){
|
||||
int maxWidth = 50;
|
||||
String limitedText = foodName.length > maxWidth ? "${foodName.substring(0, maxWidth - 3)} ... " : foodName;
|
||||
return limitedText;
|
||||
}
|
||||
|
||||
|
@ -47,7 +24,6 @@ Map<String,List<int>> getMapOfDistinctElementsWithCounterAndCalories(List<Food>
|
|||
return resultMap;
|
||||
}
|
||||
|
||||
|
||||
List<Food> getListOfDistinctElements(List<Food> foods){
|
||||
List<Food> result = [];
|
||||
for(int i = 0; i < foods.length;i++){
|
|
@ -11,6 +11,7 @@ void setupTodayBox() async{
|
|||
putIfKeyNotExists(todayBox, 'FRÜHSTÜCK', []);
|
||||
putIfKeyNotExists(todayBox, 'MITTAGESSEN', []);
|
||||
putIfKeyNotExists(todayBox, 'ABENDESSEN', []);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -19,3 +20,6 @@ void putIfKeyNotExists(Box box, String key, List<Food> value) {
|
|||
box.put(key, value);
|
||||
}
|
||||
}
|
||||
String getFormatedTodayDate(){
|
||||
return DateTime.now().toString().substring(0,10);
|
||||
}
|
|
@ -1,52 +1,39 @@
|
|||
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 '../models/user.dart';
|
||||
import '../helper/cast_helper.dart';
|
||||
import '../helper/format_helper.dart';
|
||||
import 'format_helper.dart';
|
||||
|
||||
class DataService {
|
||||
class StatisticsService {
|
||||
|
||||
static final DataService _instance = DataService._internal();
|
||||
factory DataService() => _instance;
|
||||
static final StatisticsService _instance = StatisticsService._internal();
|
||||
factory StatisticsService() => _instance;
|
||||
|
||||
static DataService get instance => _instance;
|
||||
static StatisticsService get instance => _instance;
|
||||
|
||||
DataService._internal() {
|
||||
// TO RUN TESTS -> COMMENT initBoxes() out -> HIVE behavior is tested in other tests
|
||||
StatisticsService._internal() {
|
||||
initBoxes();
|
||||
}
|
||||
String progressBoxName = dotenv.env['PROGRESS_BOX'] ?? 'PROGRESS_BOX';
|
||||
String mainBoxName = dotenv.env['MAIN_BOX'] ?? 'MAIN_BOX';
|
||||
String statisticsBoxName = dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS_BOX';
|
||||
|
||||
final String reducedStatisticsBoxName = 'STATISTICS_REDUCED';
|
||||
final String mainStatisticsBoxName = 'STATISTICS_MAIN';
|
||||
final String progressStatisticsBoxName = 'STATISTICS_PROGRESS';
|
||||
ValueNotifier<int> eatenCalories = ValueNotifier<int>(0);
|
||||
/*
|
||||
* fat 0
|
||||
* protein 1
|
||||
* carbon 2
|
||||
* fat for one day, week, month, 3
|
||||
* protein for one day, week, month 4
|
||||
* carbon for one day, week, month 5
|
||||
* calories for one day, week, month 6
|
||||
* */
|
||||
ValueNotifier<List<double>> ingredients = ValueNotifier<List<double>>([0,0,0,0,0,0,0]);
|
||||
ValueNotifier<List<double>> ingredients = ValueNotifier<List<double>>([0,0,0]);
|
||||
ValueNotifier<int> dailyAverageForCurrentWeek = ValueNotifier<int>(0);
|
||||
ValueNotifier<List<Food>> weeklyCaloryRanking = ValueNotifier<List<Food>>([]);
|
||||
ValueNotifier<List<BarChartGroupData>> barChartData = ValueNotifier<List<BarChartGroupData>>([]);
|
||||
|
||||
initBoxes()async{
|
||||
Box reducedBox = Hive.box(progressBoxName);
|
||||
Box progressBox = Hive.box(statisticsBoxName);
|
||||
Box reducedBox = Hive.box(reducedStatisticsBoxName);
|
||||
Box progressBox = Hive.box(progressStatisticsBoxName);
|
||||
|
||||
putIfKeyNotExists([reducedBox,progressBox], 'FRÜHSTÜCK', []);
|
||||
putIfKeyNotExists([reducedBox,progressBox], 'MITTAGESSEN', []);
|
||||
putIfKeyNotExists([reducedBox,progressBox], 'ABENDESSEN', []);
|
||||
updateStatisticsTodayBoxByTimespan(TimeSpan.day);
|
||||
updateReducedBoxByTimespan(TimeSpan.day);
|
||||
}
|
||||
|
||||
void putIfKeyNotExists(List<Box> boxes, String key, dynamic value) {
|
||||
|
@ -57,35 +44,34 @@ class DataService {
|
|||
}
|
||||
}
|
||||
|
||||
updateStatisticsTodayBoxByTimespan(TimeSpan timespan){
|
||||
clearBoxByBox(Hive.box(progressBoxName));
|
||||
updateReducedBoxByTimespan(TimeSpan timeSpan){
|
||||
clearReducedBoxBeforeUpdate();
|
||||
int timestamp = getTimestampFromNow();
|
||||
int dayLen = 1;
|
||||
switch(timespan){
|
||||
switch(timeSpan){
|
||||
case TimeSpan.day:
|
||||
getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(progressBoxName));
|
||||
getNewFoodAndUpdateBoxByTimestampAndBox(timestamp, Hive.box(reducedStatisticsBoxName));
|
||||
break;
|
||||
case TimeSpan.week:
|
||||
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
|
||||
for(int i = 0;i < currentWeek.length;i++){
|
||||
getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(progressBoxName));
|
||||
getNewFoodAndUpdateBoxByTimestampAndBox(currentWeek[i],Hive.box(reducedStatisticsBoxName));
|
||||
}
|
||||
dayLen = currentWeek.length;
|
||||
break;
|
||||
case TimeSpan.month:
|
||||
List<int> currentMonth = getTimestampsByTimestampAndTimespan(TimeSpan.month,timestamp);
|
||||
for(int i = 0;i < currentMonth.length;i++){
|
||||
getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(progressBoxName));
|
||||
getNewFoodAndUpdateBoxByTimestampAndBox(currentMonth[i],Hive.box(reducedStatisticsBoxName));
|
||||
}
|
||||
dayLen = currentMonth.length;
|
||||
break;
|
||||
}
|
||||
updateCalculationsAndNotfiyListenersForPorgressStatistics(dayLen);
|
||||
updateCalculationsAndNotfiyListenersForPorgressStatistics();
|
||||
}
|
||||
|
||||
void updateCalculationsAndNotfiyListenersForPorgressStatistics(int dayLen){
|
||||
eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(progressBoxName));
|
||||
ingredients.value = getAllEatenIngredientsForTodayStatistics(dayLen.roundToDouble());
|
||||
void updateCalculationsAndNotfiyListenersForPorgressStatistics(){
|
||||
eatenCalories.value = getAllEatenCaloriesByBox(Hive.box(reducedStatisticsBoxName));
|
||||
eatenCalories.notifyListeners();
|
||||
ingredients.value = getAllEatenIngredientsForTodayStatistics();
|
||||
ingredients.notifyListeners();
|
||||
}
|
||||
|
||||
void getNewFoodAndUpdateBoxByTimestampAndBox(int timestamp, Box box){
|
||||
|
@ -95,19 +81,7 @@ class DataService {
|
|||
}
|
||||
}
|
||||
|
||||
bool timestampIsValid(int timestamp){
|
||||
try{
|
||||
DateTime.fromMillisecondsSinceEpoch(timestamp*1000);
|
||||
return true;
|
||||
}catch(e){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
List<int> getTimestampsByTimestampAndTimespan(TimeSpan timespan, int timestamp) {
|
||||
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);
|
||||
|
@ -123,7 +97,8 @@ class DataService {
|
|||
return timestampsForWeekdays;
|
||||
}
|
||||
|
||||
clearBoxByBox(Box box){
|
||||
clearReducedBoxBeforeUpdate(){
|
||||
Box box = Hive.box(reducedStatisticsBoxName);
|
||||
for(int i = 0; i < box.keys.length;i++){
|
||||
box.put(box.keys.elementAt(i), []);
|
||||
}
|
||||
|
@ -144,15 +119,15 @@ class DataService {
|
|||
}
|
||||
|
||||
Map<String,List<Food>> getFoodMapForGivenTimestampFromMainBox(int timestamp){
|
||||
Box box = Hive.box(mainBoxName);
|
||||
dynamic matchingTimestamp = getMatchingTimestamp(box, timestamp);
|
||||
Box box = Hive.box(mainStatisticsBoxName);
|
||||
dynamic matchingTimestamp = getMatchingTimeStamp(box, timestamp);
|
||||
if(matchingTimestamp != null){
|
||||
return castDynamicMap(box.get(matchingTimestamp));
|
||||
}
|
||||
return <String,List<Food>>{};
|
||||
}
|
||||
|
||||
getMatchingTimestamp(Box box,int newTimestamp){
|
||||
getMatchingTimeStamp(Box box,int newTimestamp){
|
||||
if(box.keys.isNotEmpty){
|
||||
for(int i = 0; i < box.keys.length;i++){
|
||||
int timestamp = box.keys.elementAt(i);
|
||||
|
@ -175,9 +150,6 @@ class DataService {
|
|||
}
|
||||
|
||||
isDateEqual(int timestamp1, int timestamp2){
|
||||
if(!timestampIsValid(timestamp1) || !timestampIsValid(timestamp2)){
|
||||
return false;
|
||||
}
|
||||
return
|
||||
getDayAsIntFromTimestamp(timestamp1) == getDayAsIntFromTimestamp(timestamp2) &&
|
||||
getMonthAsIntFromTimestamp(timestamp1) == getMonthAsIntFromTimestamp(timestamp2) &&
|
||||
|
@ -186,7 +158,7 @@ class DataService {
|
|||
|
||||
addItemToMainBox(Food value, String mealType){
|
||||
// Hive.deleteFromDisk();
|
||||
Box box = Hive.box(mainBoxName);
|
||||
Box box = Hive.box(mainStatisticsBoxName);
|
||||
DateTime dateTime = DateTime.now();
|
||||
|
||||
// DEBUG
|
||||
|
@ -194,7 +166,7 @@ class DataService {
|
|||
|
||||
int newTimestamp = dateTime.millisecondsSinceEpoch.toInt() ~/ 1000;
|
||||
|
||||
dynamic matchingTimestamp = getMatchingTimestamp(box, newTimestamp);
|
||||
dynamic matchingTimestamp = getMatchingTimeStamp(box, newTimestamp);
|
||||
if(matchingTimestamp != null){
|
||||
newTimestamp = matchingTimestamp;
|
||||
}
|
||||
|
@ -230,24 +202,8 @@ class DataService {
|
|||
return sum as int;
|
||||
}
|
||||
|
||||
double getCaloryTargetForOneDay(){
|
||||
final Box userBox = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
|
||||
return userBox.get("USER").kalorien.toDouble();
|
||||
}
|
||||
|
||||
List<double> getAllEatenIngredientsForTodayStatistics(double dayLen){
|
||||
Box box = Hive.box(progressBoxName);
|
||||
final Box userBox = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
|
||||
final calorieSummary = userBox.get("USER").kalorien;
|
||||
|
||||
const double fatPercentPerThousandCalorie = 3.7;
|
||||
const double proteinPercentPerThousandCalorie = 4.5;
|
||||
const double carbsPercentPerThousandCalorie = 12.8;
|
||||
|
||||
double fatSummary = (calorieSummary / 100) * fatPercentPerThousandCalorie;
|
||||
double carbSummary = (calorieSummary / 100) * carbsPercentPerThousandCalorie;
|
||||
double proteinSummary = (calorieSummary / 100) * proteinPercentPerThousandCalorie;
|
||||
|
||||
List<double> getAllEatenIngredientsForTodayStatistics(){
|
||||
Box box = Hive.box(reducedStatisticsBoxName);
|
||||
num fat = 0;
|
||||
num protein = 0;
|
||||
num carbs = 0;
|
||||
|
@ -258,26 +214,20 @@ class DataService {
|
|||
carbs += food.carbohydrateg;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
fat.roundToDouble(),
|
||||
protein.roundToDouble(),
|
||||
carbs.roundToDouble(),
|
||||
fatSummary * dayLen,
|
||||
proteinSummary * dayLen,
|
||||
carbSummary * dayLen,
|
||||
calorieSummary * dayLen
|
||||
];
|
||||
return [fat.roundToDouble(),protein.roundToDouble(),carbs.roundToDouble()];
|
||||
}
|
||||
|
||||
void updateCalculationsAndNotfiyListenersForTodayStatistics(){
|
||||
dailyAverageForCurrentWeek.value = getAverageCaloriesForCurrentWeekOnDailyBasis();
|
||||
dailyAverageForCurrentWeek.notifyListeners();
|
||||
weeklyCaloryRanking.value = getWeeklyCaloryRanking();
|
||||
weeklyCaloryRanking.notifyListeners();
|
||||
barChartData.value = getBarChartData();
|
||||
barChartData.notifyListeners();
|
||||
}
|
||||
|
||||
void updateProgressBoxValues(){
|
||||
Box box = Hive.box(statisticsBoxName);
|
||||
Box box = Hive.box(progressStatisticsBoxName);
|
||||
box.clear();
|
||||
int timestamp = getTimestampFromNow();
|
||||
List<int> currentWeek = getTimestampsByTimestampAndTimespan(TimeSpan.week,timestamp);
|
||||
|
@ -288,7 +238,7 @@ class DataService {
|
|||
}
|
||||
|
||||
int getAverageCaloriesForCurrentWeekOnDailyBasis(){
|
||||
Box box = Hive.box(statisticsBoxName);
|
||||
Box box = Hive.box(progressStatisticsBoxName);
|
||||
return getAllEatenCaloriesByBox(box)~/7;
|
||||
}
|
||||
|
||||
|
@ -312,11 +262,7 @@ class DataService {
|
|||
int getSumOfCaloriesByFoodList(List<Food> foods){
|
||||
int sum = 0;
|
||||
for(int i = 0; i < foods.length;i++){
|
||||
try{
|
||||
sum += foods[i].calories as int;
|
||||
}catch(e){
|
||||
throw const FormatException('please check formats');
|
||||
}
|
||||
sum += foods[i].calories as int;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
@ -344,7 +290,8 @@ class DataService {
|
|||
if(value > maxValue){
|
||||
maxValue = value;
|
||||
}
|
||||
result[i][j] = value;
|
||||
|
||||
result[i][j] = (value * 175) ~/ 100;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -364,6 +311,8 @@ class DataService {
|
|||
color: Colors.green,
|
||||
toY: result[0][2].toDouble(), // Second segment color
|
||||
),],
|
||||
showingTooltipIndicators: [0],
|
||||
groupVertically: true
|
||||
),
|
||||
BarChartGroupData(
|
||||
x: 1,
|
||||
|
@ -381,6 +330,7 @@ class DataService {
|
|||
color: Colors.green,
|
||||
toY: result[1][2].toDouble(), // Second segment color
|
||||
),],
|
||||
showingTooltipIndicators: [0],
|
||||
),
|
||||
BarChartGroupData(
|
||||
x: 2,
|
||||
|
@ -397,6 +347,7 @@ class DataService {
|
|||
color: Colors.green,
|
||||
toY: result[2][2].toDouble(), // Second segment color
|
||||
),],
|
||||
showingTooltipIndicators: [0],
|
||||
),
|
||||
BarChartGroupData(
|
||||
x: 3,
|
||||
|
@ -430,6 +381,7 @@ class DataService {
|
|||
color: Colors.green,
|
||||
toY: result[4][2].toDouble(), // Second segment color
|
||||
),],
|
||||
showingTooltipIndicators: [0],
|
||||
),
|
||||
BarChartGroupData(
|
||||
x: 5,
|
||||
|
@ -445,7 +397,7 @@ class DataService {
|
|||
width: 7.5, // Adjust the width of the bar if needed
|
||||
color: Colors.green,
|
||||
toY: result[5][2].toDouble(), // Second segment color
|
||||
),],
|
||||
),], showingTooltipIndicators: [0],
|
||||
),
|
||||
BarChartGroupData(
|
||||
x: 6,
|
||||
|
@ -471,10 +423,17 @@ class DataService {
|
|||
return now.millisecondsSinceEpoch.toInt() ~/ 1000;
|
||||
}
|
||||
|
||||
List<Food> getMealsOfTodayByMealtype(String mealtype){
|
||||
int timestamp = getTimestampFromNow();
|
||||
return getFoodMapForGivenTimestampFromMainBox(timestamp)[mealtype] ?? [];
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
|
||||
import 'package:ernaehrung/android/config/statistics.dart';
|
||||
import 'package:ernaehrung/android/pages/nav_pages/progress_page.dart';
|
||||
import 'package:ernaehrung/android/pages/nav_pages/today_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'meal_plan_page.dart';
|
||||
|
||||
class MainPage extends StatefulWidget {
|
||||
const MainPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
MainPageState createState() => MainPageState();
|
||||
}
|
||||
|
||||
class MainPageState extends State<MainPage> {
|
||||
List pages = [
|
||||
const TodayPage(title: 'Today'),
|
||||
const MealPlanPage(title: 'Meal Plan'),
|
||||
const ProgressPage(title: 'Progress')
|
||||
];
|
||||
|
||||
int currentIndex = 0;
|
||||
|
||||
void onTap(int index) {
|
||||
setState(() {
|
||||
currentIndex = index;
|
||||
if(currentIndex == 1){
|
||||
StatisticsService.instance.updateReducedBoxByTimespan(TimeSpan.day);
|
||||
}else if(currentIndex == 2){
|
||||
StatisticsService.instance.updateProgressBoxValues();
|
||||
}
|
||||
pages[currentIndex];
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(pages[currentIndex].title),
|
||||
backgroundColor: Colors.grey.shade100,
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
|
||||
child: pages[currentIndex],
|
||||
),
|
||||
bottomNavigationBar: BottomNavigationBar(
|
||||
currentIndex: currentIndex,
|
||||
selectedItemColor: Colors.black54,
|
||||
unselectedItemColor: Colors.grey.withOpacity(0.5),
|
||||
showSelectedLabels: false,
|
||||
showUnselectedLabels: false,
|
||||
elevation: 0,
|
||||
onTap: onTap,
|
||||
items: const [
|
||||
BottomNavigationBarItem(icon: Icon(Icons.today), label: 'Today'),
|
||||
BottomNavigationBarItem(
|
||||
icon: Icon(Icons.area_chart), label: 'Progress'),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.apple), label: 'Meal Plan'),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
import 'package:ernaehrung/android/components/MealPageFoodComponent.dart';
|
||||
import 'package:ernaehrung/android/components/meal_page_text/days_component.dart';
|
||||
import 'package:ernaehrung/android/components/meal_page_text/statistics_today_component.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MealPlanPage extends StatefulWidget {
|
||||
final String title;
|
||||
final Color backgroundColor = const Color(0xff47a44b);
|
||||
|
||||
const MealPlanPage({Key? key, required this.title}) : super(key: key);
|
||||
|
||||
String get getTitle => title;
|
||||
|
||||
@override
|
||||
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
||||
return getTitle;
|
||||
}
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => _MealPlanState();
|
||||
}
|
||||
|
||||
class _MealPlanState extends State<MealPlanPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
margin: const EdgeInsets.all(8),
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: const [
|
||||
DaysMealPageComponent(),
|
||||
StatisticsPercentage(),
|
||||
MealPageStatisticsFoodComponent(),
|
||||
],
|
||||
),
|
||||
)));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,216 @@
|
|||
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,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const TitleComponent("Kalorien"),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
const SecondaryTextComponent("Durchschnittlich"),
|
||||
SecondaryBigTextComponent(value.toString()),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
ValueListenableBuilder(
|
||||
valueListenable: StatisticsService.instance.barChartData,
|
||||
builder: (context, value, child) {
|
||||
return SizedBox(
|
||||
height: 205,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 200,
|
||||
child: BarChart(
|
||||
BarChartData(
|
||||
barTouchData: barTouchData,
|
||||
titlesData: titlesData,
|
||||
borderData: borderData,
|
||||
barGroups: value,
|
||||
gridData: FlGridData(show: false),
|
||||
alignment: BarChartAlignment.spaceAround,
|
||||
maxY: 200,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
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.orange,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
Widget getTitles(double value, TitleMeta meta) {
|
||||
const style = TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 14,
|
||||
);
|
||||
String text;
|
||||
switch (value.toInt()) {
|
||||
case 0:
|
||||
text = '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,
|
||||
),
|
||||
),
|
||||
leftTitles: AxisTitles(
|
||||
sideTitles: SideTitles(showTitles: false),
|
||||
),
|
||||
topTitles: AxisTitles(
|
||||
sideTitles: SideTitles(showTitles: false),
|
||||
),
|
||||
rightTitles: AxisTitles(
|
||||
sideTitles: SideTitles(showTitles: false),
|
||||
),
|
||||
);
|
||||
|
||||
FlBorderData get borderData => FlBorderData(
|
||||
show: false,
|
||||
);
|
||||
|
||||
LinearGradient get _barsGradient => const LinearGradient(
|
||||
colors: [
|
||||
Colors.cyan,
|
||||
Colors.deepPurple,
|
||||
],
|
||||
begin: Alignment.bottomCenter,
|
||||
end: Alignment.topCenter,
|
||||
);
|
||||
LinearGradient get _breakfastGradient => const LinearGradient(
|
||||
colors: [
|
||||
Colors.green,
|
||||
Colors.yellow,
|
||||
],
|
||||
begin: Alignment.bottomCenter,
|
||||
end: Alignment.topCenter,
|
||||
);
|
||||
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
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';
|
||||
|
||||
|
@ -27,11 +28,8 @@ class _SearchFoodPageState extends State<SearchFoodPage> {
|
|||
if (snapshot.hasData) {
|
||||
return SearchComponent(snapshot.data!, widget.cardName);
|
||||
}else {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(), // Loading animation
|
||||
);
|
||||
return const Placeholder();
|
||||
}
|
||||
})
|
||||
));
|
||||
})));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
import 'package:ernaehrung/android/components/card/card_component.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hive_flutter/adapters.dart';
|
||||
|
||||
class TodayPage extends StatefulWidget {
|
||||
final String title;
|
||||
final Color backgroundColor = const Color(0xff47a44b);
|
||||
|
||||
const TodayPage({Key? key, required this.title}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<TodayPage> createState() => _TodayPageState();
|
||||
}
|
||||
|
||||
class _TodayPageState extends State<TodayPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: SingleChildScrollView(
|
||||
child: ValueListenableBuilder(
|
||||
valueListenable: Hive.box("TODAY").listenable(),
|
||||
builder: (context, box, widget) {
|
||||
return ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: box.keys.length,
|
||||
itemBuilder: (context, i) {
|
||||
if (box.keyAt(i).toString() == "DATE") {
|
||||
return const SizedBox.shrink();
|
||||
} else {
|
||||
return CardComponent(
|
||||
box.keyAt(i).toString(),
|
||||
box.getAt(i)
|
||||
);
|
||||
}
|
||||
});
|
||||
})));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,208 @@
|
|||
import 'package:ernaehrung/android/pages/nav_pages/main_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
import '../models/user.dart';
|
||||
|
||||
class OnboardingPage extends StatefulWidget {
|
||||
const OnboardingPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<OnboardingPage> createState() => _OnboardingPageState();
|
||||
}
|
||||
|
||||
class _OnboardingPageState extends State<OnboardingPage> {
|
||||
InputDecoration decoration(String hintText) {
|
||||
return InputDecoration(
|
||||
border: const OutlineInputBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10.0))),
|
||||
filled: true,
|
||||
hintStyle: TextStyle(color: Colors.grey.shade400),
|
||||
hintText: hintText,
|
||||
labelText: hintText,
|
||||
fillColor: Colors.white70);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final _formKey = GlobalKey<FormBuilderState>();
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("Welcome"),
|
||||
backgroundColor: Colors.grey.shade100,
|
||||
),
|
||||
body: FormBuilder(
|
||||
key: _formKey,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: FormBuilderTextField(
|
||||
name: 'vorname',
|
||||
decoration: decoration("Vorname"),
|
||||
keyboardType: TextInputType.text,
|
||||
maxLength: 30,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
FormBuilderValidators.minLength(2,
|
||||
errorText:
|
||||
"Die Name sollte mindestens 2 Zeichen lang sein"),
|
||||
FormBuilderValidators.maxLength(30,
|
||||
errorText:
|
||||
"Die Name sollte maximal 30 Zeichen lang sein")
|
||||
]),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: FormBuilderTextField(
|
||||
name: 'nachname',
|
||||
decoration: decoration("Nachname"),
|
||||
keyboardType: TextInputType.text,
|
||||
maxLength: 30,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
FormBuilderValidators.minLength(2,
|
||||
errorText:
|
||||
"Die Nachname sollte mindestens 2 Zeichen lang sein"),
|
||||
FormBuilderValidators.maxLength(30,
|
||||
errorText:
|
||||
"Die Nachname sollte maximal 30 Zeichen lang sein")
|
||||
]),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: FormBuilderTextField(
|
||||
name: 'gewicht',
|
||||
decoration: decoration("Gewicht"),
|
||||
keyboardType: TextInputType.number,
|
||||
maxLength: 7,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
FormBuilderValidators.numeric(
|
||||
errorText:
|
||||
"Der Gewicht sollte mindestens 10 kg sein"),
|
||||
FormBuilderValidators.max(200,
|
||||
errorText:
|
||||
"Der Gewicht sollte maximal 200 kg sein"),
|
||||
FormBuilderValidators.min(10,
|
||||
errorText:
|
||||
"Der Gewicht sollte mindestens 10 kg sein")
|
||||
]),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: FormBuilderTextField(
|
||||
name: 'groesse',
|
||||
decoration: decoration("Größe"),
|
||||
keyboardType: TextInputType.number,
|
||||
maxLength: 7,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
FormBuilderValidators.numeric(
|
||||
errorText: "Die Größe sollte mindestens 60cm sein"),
|
||||
FormBuilderValidators.max(230,
|
||||
errorText: "Die Größe sollte maximal 230cm sein"),
|
||||
FormBuilderValidators.min(60,
|
||||
errorText: "Die Größe sollte mindestens 60cm sein")
|
||||
]),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: FormBuilderTextField(
|
||||
name: 'alter',
|
||||
decoration: decoration("Alter"),
|
||||
keyboardType: TextInputType.number,
|
||||
maxLength: 7,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
FormBuilderValidators.numeric(
|
||||
errorText:
|
||||
"Das Alter sollte mindestens 6 Jahre alt sein"),
|
||||
FormBuilderValidators.max(99,
|
||||
errorText:
|
||||
"Das Alter sollte maximal 99 Jahre alt sein"),
|
||||
FormBuilderValidators.min(6,
|
||||
errorText:
|
||||
"Das Alter sollte mindestens 6 Jahre alt sein")
|
||||
]),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: FormBuilderTextField(
|
||||
name: 'kalorien',
|
||||
decoration:
|
||||
decoration("gewünschte Kalorienzufuhr: min. 1000"),
|
||||
keyboardType: TextInputType.number,
|
||||
maxLength: 7,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
FormBuilderValidators.numeric(
|
||||
errorText:
|
||||
"Die Kalorienanzahl sollte mindestens 1000 Kcal sein"),
|
||||
FormBuilderValidators.max(30000),
|
||||
FormBuilderValidators.min(1000,
|
||||
errorText:
|
||||
"Die Kalorienanzahl sollte mindestens 1000 Kcal sein")
|
||||
]),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 0),
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
minimumSize: const Size.fromHeight(40), //
|
||||
backgroundColor: const Color(0xFF6E7BFB),
|
||||
foregroundColor: const Color(0xFFffffff),
|
||||
shape: const StadiumBorder(),
|
||||
),
|
||||
onPressed: () {
|
||||
final Box box = Hive.box<User>("USER_BOX");
|
||||
box.put("USER", User(
|
||||
_formKey.currentState?.fields['vorname']?.value,
|
||||
_formKey.currentState?.fields['nachname']?.value,
|
||||
int.parse(_formKey.currentState?.fields['gewicht']?.value),
|
||||
int.parse(_formKey.currentState?.fields['groesse']?.value),
|
||||
int.parse(_formKey.currentState?.fields['alter']?.value),
|
||||
int.parse(_formKey.currentState?.fields['kalorien']?.value)
|
||||
));
|
||||
|
||||
print(box.get("USER"));
|
||||
|
||||
Navigator
|
||||
.of(context)
|
||||
.pushReplacement(MaterialPageRoute(builder: (BuildContext context) => const MainPage()));
|
||||
},
|
||||
child: const Text("Eingaben bestätigen"),
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
|
||||
void storeUserData(String sname, String fname, int weight, int height, int calories) async {
|
||||
final userBox = Hive.box(dotenv.env['USER_BOX']!);
|
||||
userBox.put(dotenv.env['FIRST_NAME_FIELD']!, sname);
|
||||
userBox.put(dotenv.env['SECOND_NAME_FIELD']!, fname);
|
||||
userBox.put(dotenv.env['WEIGHT_FIELD']!, weight);
|
||||
userBox.put(dotenv.env['HEIGHT_FIELD']!, height);
|
||||
userBox.put(dotenv.env['CALORIES_FIELD']!, calories);
|
||||
}
|
|
@ -1,28 +1,36 @@
|
|||
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 'app.dart';
|
||||
import 'helper/setup_todaybox.dart';
|
||||
import 'models/food.dart';
|
||||
import 'models/user.dart';
|
||||
import 'android/andoird_app.dart';
|
||||
import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb;
|
||||
|
||||
import 'android/config/setup_todaybox_config.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['PROGRESS_BOX'] ?? 'PROGRESS');
|
||||
await Hive.openBox( dotenv.env['STATISTICS_BOX'] ?? 'STATISTICS');
|
||||
await Hive.openBox(dotenv.env['MAIN_BOX'] ?? 'MAIN');
|
||||
await Hive.openBox(dotenv.env['TODAY_BOX'] ?? 'TODAY');
|
||||
await Hive.openBox<User>(dotenv.env['USER_BOX'] ?? 'USER');
|
||||
setupTodayBox();
|
||||
//Hive.deleteFromDisk();
|
||||
runApp(const AndroidApp());
|
||||
|
||||
await Hive.openBox('STATISTICS_REDUCED');
|
||||
await Hive.openBox('STATISTICS_PROGRESS');
|
||||
await Hive.openBox('STATISTICS_MAIN');
|
||||
await Hive.openBox('TODAY');
|
||||
await Hive.openBox<User>('USER_BOX');
|
||||
setupTodayBox();
|
||||
|
||||
if (defaultTargetPlatform == TargetPlatform.android) {
|
||||
runApp(const AndroidApp());
|
||||
} else if (kIsWeb) {
|
||||
runApp(const WebApp());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'android/models/card.dart';
|
||||
|
||||
List<CardModel> essen = [
|
||||
CardModel('Haferflocken', 10, 1.1, 1.2),
|
||||
CardModel('Kekse', 20, 2.2, 2.3),
|
||||
CardModel('Bier', 30, 3.3, 3.4),
|
||||
];
|
||||
|
||||
Map<Map<Image, String>, List<CardModel>> cards = <Map<Image, String>, List<CardModel>>{
|
||||
{
|
||||
const Image(image: AssetImage('assets/images/fries.png')): 'Frühstück'
|
||||
}: essen,
|
||||
{
|
||||
const Image(image: AssetImage('assets/images/ice.png')): 'Mittagessen'
|
||||
}: essen,
|
||||
{
|
||||
const Image(image: AssetImage('assets/images/tea.png')): 'Abendessen'
|
||||
}: essen
|
||||
};
|
|
@ -1,26 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class FormTextField{
|
||||
final String title;
|
||||
final TextInputType textInputType;
|
||||
final num? maxLength;
|
||||
final String? maxLengthErrorMessage;
|
||||
final String? minLengthErrorMessage;
|
||||
final num? minLength;
|
||||
final num? numericMax;
|
||||
final num? numericMin;
|
||||
final String? numericMaxErrorMessage;
|
||||
final String? numericMinErrorMessage;
|
||||
|
||||
FormTextField(
|
||||
this.title,
|
||||
this.textInputType,
|
||||
this.maxLength,
|
||||
this.maxLengthErrorMessage,
|
||||
this.minLengthErrorMessage,
|
||||
this.minLength,
|
||||
this.numericMax,
|
||||
this.numericMin,
|
||||
this.numericMaxErrorMessage,
|
||||
this.numericMinErrorMessage);
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/statistics_page/statistics_page.dart';
|
||||
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/today_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../services/statistics.dart';
|
||||
import 'subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
|
||||
import '../user_data_form/user_data_form.dart';
|
||||
import 'subpages/progress_page/progress_page.dart';
|
||||
|
||||
class MainPage extends StatefulWidget {
|
||||
const MainPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
MainPageState createState() => MainPageState();
|
||||
}
|
||||
|
||||
class MainPageState extends State<MainPage> {
|
||||
List pages = [
|
||||
const TodayPage(title: 'Essensplan'),
|
||||
const ProgressPage(title: 'Gesamtübersicht'),
|
||||
const StatisticsPage(title: 'Statistiken')
|
||||
];
|
||||
|
||||
int currentIndex = 0;
|
||||
|
||||
void onTap(int index) async {
|
||||
setState(() {
|
||||
currentIndex = index;
|
||||
if (currentIndex == 1) {
|
||||
DataService.instance
|
||||
.updateStatisticsTodayBoxByTimespan(TimeSpan.day);
|
||||
} else if (currentIndex == 2) {
|
||||
DataService.instance.updateProgressBoxValues();
|
||||
}
|
||||
pages[currentIndex];
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
extendBodyBehindAppBar: false,
|
||||
appBar: AppBar(
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
pages[currentIndex].title,
|
||||
style: const TextStyle(
|
||||
color: Colors.black
|
||||
),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const SettingsPage()),
|
||||
);
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.green, // Set the background color to green
|
||||
),
|
||||
child: Row(
|
||||
children: const [
|
||||
Icon(
|
||||
Icons.account_circle,
|
||||
size: 30,
|
||||
color: Colors.white,
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
|
||||
],
|
||||
),
|
||||
backgroundColor: Colors.transparent,
|
||||
foregroundColor: Colors.grey.shade400,
|
||||
elevation: 0,
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8),
|
||||
child: pages[currentIndex],
|
||||
),
|
||||
bottomNavigationBar: BottomNavigationBar(
|
||||
currentIndex: currentIndex,
|
||||
selectedItemColor: Colors.black54,
|
||||
unselectedItemColor: Colors.grey.withOpacity(0.5),
|
||||
showSelectedLabels: false,
|
||||
showUnselectedLabels: false,
|
||||
elevation: 0,
|
||||
onTap: onTap,
|
||||
items: const [
|
||||
BottomNavigationBarItem(icon: Icon(Icons.today), label: 'Today'),
|
||||
BottomNavigationBarItem(
|
||||
icon: Icon(Icons.area_chart), label: 'Progress'),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.apple), label: 'Meal Plan'),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'sub_components/charts/progress_charts_overview.dart';
|
||||
import 'sub_components/list_view/progress_all_meals_component.dart';
|
||||
|
||||
class ProgressPage extends StatefulWidget {
|
||||
final String title;
|
||||
final Color backgroundColor = const Color(0xff47a44b);
|
||||
|
||||
const ProgressPage({Key? key, required this.title}) : super(key: key);
|
||||
|
||||
String get getTitle => title;
|
||||
|
||||
@override
|
||||
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
||||
return getTitle;
|
||||
}
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => ProgressState();
|
||||
}
|
||||
|
||||
class ProgressState extends State<ProgressPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: SizedBox(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: const [
|
||||
ProgressChartsOverviewComponent(),
|
||||
ProgressAllMealsComponent(),
|
||||
],
|
||||
),
|
||||
)));
|
||||
}
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'sub_components/tabs/timespan_tabs.dart';
|
||||
import 'sub_components/charts/progress_charts.dart';
|
||||
|
||||
class ProgressChartsOverviewComponent extends StatelessWidget {
|
||||
const ProgressChartsOverviewComponent({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(8))),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 16),
|
||||
child: Column(
|
||||
children: const [
|
||||
TimespanTabsComponent(),
|
||||
ProgressChartsComponent(),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_circular_chart.dart';
|
||||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/charts/progress_horizontal_chart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../../../../../../services/statistics.dart';
|
||||
|
||||
class ProgressChartsComponent extends StatelessWidget {
|
||||
final double heightStatisticsContainer = 220.0;
|
||||
final double widthStatisticsContainer = double.infinity;
|
||||
|
||||
const ProgressChartsComponent({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ValueListenableBuilder<List<double>>(
|
||||
valueListenable: DataService.instance.ingredients,
|
||||
builder: (context, value, child) {
|
||||
return Container(
|
||||
height: heightStatisticsContainer,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 0, horizontal: 8),
|
||||
child: FittedBox(
|
||||
child: ProgressCircularChartComponent(value[6].toInt()),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
// TODO adjust 200 to values from user box
|
||||
ProgressHorizontalChartComponent(Colors.lightGreen, value[0],
|
||||
value[3].toInt(), "Fat (g)"),
|
||||
ProgressHorizontalChartComponent(Colors.lightGreen, value[1],
|
||||
value[4].toInt(), "Protein (g)"),
|
||||
ProgressHorizontalChartComponent(Colors.lightGreen, value[2],
|
||||
value[5].toInt(), "Carbohydrate (g)"),
|
||||
],
|
||||
))
|
||||
],
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:percent_indicator/circular_percent_indicator.dart';
|
||||
import '../../../../../../../../services/statistics.dart';
|
||||
|
||||
class ProgressCircularChartComponent extends StatelessWidget {
|
||||
final int totalCalories;
|
||||
const ProgressCircularChartComponent(this.totalCalories, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: DataService.instance.eatenCalories,
|
||||
builder: (context, value, child) {
|
||||
double progress =
|
||||
double.parse((value / totalCalories).toStringAsFixed(1));
|
||||
progress = progress > 1.0 ? 1.0 : progress;
|
||||
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CircularPercentIndicator(
|
||||
animation: true,
|
||||
radius: 60.0,
|
||||
lineWidth: 5.0,
|
||||
percent: progress,
|
||||
center: Text(
|
||||
"$value/$totalCalories Kcal",
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
progressColor: Colors.lightGreen,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/list_view/progress_food_list.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import '../../../../../../services/statistics.dart';
|
||||
import '../../../../../shared_components/title.dart';
|
||||
|
||||
class ProgressAllMealsComponent extends StatelessWidget {
|
||||
const ProgressAllMealsComponent({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.fromLTRB(0, 16, 0, 0),
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(8))),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const TitleComponent("Alle Mahlzeiten"),
|
||||
ProgressFoodListComponent(
|
||||
box: Hive.box(DataService.instance.progressBoxName),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,134 +0,0 @@
|
|||
import 'package:basic_utils/basic_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../../../../helper/format_helper.dart';
|
||||
import '../../../../../../models/food.dart';
|
||||
import '../../../../../search_food/search_food.dart';
|
||||
|
||||
class ProgressCardComponent extends StatefulWidget {
|
||||
final String eatingMealName;
|
||||
final List<Food> selectedMeal;
|
||||
final bool addButtonVisible;
|
||||
|
||||
const ProgressCardComponent(
|
||||
{Key? key,
|
||||
required this.eatingMealName,
|
||||
required this.selectedMeal,
|
||||
this.addButtonVisible = true})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<ProgressCardComponent> createState() => _ProgressCardComponentState();
|
||||
}
|
||||
|
||||
class _ProgressCardComponentState extends State<ProgressCardComponent> {
|
||||
Route createRoute(String cardName) {
|
||||
return PageRouteBuilder(
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
SearchFoodPage(cardName),
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||
const begin = Offset(0.0, 1.0);
|
||||
const end = Offset.zero;
|
||||
const curve = Curves.ease;
|
||||
|
||||
var tween =
|
||||
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
|
||||
|
||||
return SlideTransition(
|
||||
position: animation.drive(tween),
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
String capitalize(String s) => s[0].toUpperCase() + s.substring(1);
|
||||
|
||||
Widget getElevatedButton() {
|
||||
if (widget.addButtonVisible) {
|
||||
return ElevatedButton(
|
||||
onPressed: () async {
|
||||
Navigator.of(context).push(createRoute(widget.eatingMealName));
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
shape: const CircleBorder(),
|
||||
padding: const EdgeInsets.all(0),
|
||||
),
|
||||
child: const Text(
|
||||
'+',
|
||||
style: TextStyle(fontSize: 28),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
}
|
||||
|
||||
int getCountedCalories() {
|
||||
double calories = 0;
|
||||
for (Food food in widget.selectedMeal) {
|
||||
if (food.calories is int) {
|
||||
calories += food.calories as int;
|
||||
} else if (food.calories is double) {
|
||||
calories += food.calories as double;
|
||||
}
|
||||
}
|
||||
return calories.round();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.fromLTRB(0, 16, 0, 0),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
StringUtils.capitalize(widget.eatingMealName),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
softWrap: false,
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 16),
|
||||
),
|
||||
getElevatedButton(),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 1,
|
||||
child: ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: getMapOfDistinctElementsWithCounterAndCalories(
|
||||
widget.selectedMeal)
|
||||
.keys
|
||||
.length,
|
||||
itemBuilder: (context, i) {
|
||||
Map<String, List<int>> map =
|
||||
getMapOfDistinctElementsWithCounterAndCalories(
|
||||
widget.selectedMeal);
|
||||
String foodName = map.keys.elementAt(i);
|
||||
List<int> values = map.values.elementAt(i);
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 10.0), // Adjust the padding as needed
|
||||
child: Text(
|
||||
"${i+1}. ${getFoodListStringByFood(foodName, values[0], values[1], context)}",
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
widget.selectedMeal.isNotEmpty
|
||||
? Column(
|
||||
children: [
|
||||
const Divider(),
|
||||
Text("${getCountedCalories()} kcal")
|
||||
],
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:hive_flutter/adapters.dart';
|
||||
import '../../../../../../helper/cast_helper.dart';
|
||||
import '../../../../../../services/statistics.dart';
|
||||
import 'progress_card.dart';
|
||||
|
||||
class ProgressFoodListComponent extends StatelessWidget {
|
||||
final Box box;
|
||||
const ProgressFoodListComponent({super.key, required this.box});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: box.listenable(),
|
||||
builder: (context, box, widget) {
|
||||
final mealTypes = ['FRÜHSTÜCK','MITTAGESSEN','ABENDESSEN']; // Specify the desired orde
|
||||
return ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: box.keys.length,
|
||||
itemBuilder: (context, i) {
|
||||
return ProgressCardComponent(
|
||||
eatingMealName: mealTypes[i],
|
||||
selectedMeal: castDynamicToListFood(box.get(mealTypes[i])),
|
||||
addButtonVisible: box.name != DataService.instance.progressBoxName.toLowerCase(),
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,71 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import '../../../../helper/format_helper.dart';
|
||||
import '../../../../services/statistics.dart';
|
||||
import 'sub_components/chart.dart';
|
||||
import '../../../shared_components/secondary_text.dart';
|
||||
import '../../../shared_components/title.dart';
|
||||
|
||||
class StatisticsPage extends StatelessWidget {
|
||||
final String title;
|
||||
final Color backgroundColor = const Color(0xff47a44b);
|
||||
|
||||
const StatisticsPage({Key? key, required this.title}) : super(key: key);
|
||||
|
||||
String get getTitle => title;
|
||||
|
||||
@override
|
||||
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
||||
return getTitle;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
const ChartComponent(),
|
||||
Container(
|
||||
margin: const EdgeInsets.fromLTRB(0, 16, 0, 0),
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(8))),
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
child: ValueListenableBuilder(
|
||||
valueListenable:
|
||||
DataService.instance.weeklyCaloryRanking,
|
||||
builder: (context, value, child) {
|
||||
return Column(
|
||||
children: [
|
||||
const TitleComponent(
|
||||
"Lebensmittel mit dem höchsten Kaloriengehalt"),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
for (var item in value)
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SecondaryTextComponent(
|
||||
getWeeklyRankingString(item.name,context),
|
||||
value.indexOf(item)+1
|
||||
),
|
||||
SecondaryTextComponent(
|
||||
item.calories.toString(),
|
||||
null
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,308 +0,0 @@
|
|||
import 'package:fl_chart/fl_chart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../../../services/statistics.dart';
|
||||
import '../../../../shared_components/secondary_text.dart';
|
||||
import '../../../../shared_components/title.dart';
|
||||
|
||||
class ChartComponent extends StatelessWidget {
|
||||
const ChartComponent({Key? key}) : super(key: key);
|
||||
|
||||
BarTouchData get barTouchData => BarTouchData(
|
||||
enabled: false,
|
||||
touchTooltipData: BarTouchTooltipData(
|
||||
tooltipBgColor: Colors.transparent,
|
||||
tooltipPadding: EdgeInsets.zero,
|
||||
tooltipMargin: 4,
|
||||
getTooltipItem: (
|
||||
BarChartGroupData group,
|
||||
int groupIndex,
|
||||
BarChartRodData rod,
|
||||
int rodIndex,
|
||||
) {
|
||||
return BarTooltipItem(
|
||||
rod.toY.round().toString(),
|
||||
const TextStyle(
|
||||
color: Colors.transparent,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
Widget getTitles(double value, TitleMeta meta) {
|
||||
const style = TextStyle(
|
||||
color: Colors.orange,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 14,
|
||||
);
|
||||
String text;
|
||||
switch (value.toInt()) {
|
||||
case 0:
|
||||
text = 'M';
|
||||
break;
|
||||
case 1:
|
||||
text = 'T';
|
||||
break;
|
||||
case 2:
|
||||
text = 'W';
|
||||
break;
|
||||
case 3:
|
||||
text = 'T';
|
||||
break;
|
||||
case 4:
|
||||
text = 'F';
|
||||
break;
|
||||
case 5:
|
||||
text = 'S';
|
||||
break;
|
||||
case 6:
|
||||
text = 'S';
|
||||
break;
|
||||
default:
|
||||
text = '';
|
||||
break;
|
||||
}
|
||||
return SideTitleWidget(
|
||||
axisSide: meta.axisSide,
|
||||
space: 4,
|
||||
child: Text(text, style: style),
|
||||
);
|
||||
}
|
||||
|
||||
FlTitlesData get titlesData => FlTitlesData(
|
||||
show: true,
|
||||
bottomTitles: AxisTitles(
|
||||
sideTitles: SideTitles(
|
||||
showTitles: true,
|
||||
reservedSize: 30,
|
||||
getTitlesWidget: getTitles,
|
||||
),
|
||||
),
|
||||
topTitles: AxisTitles(
|
||||
sideTitles: SideTitles(showTitles: false),
|
||||
),
|
||||
rightTitles: AxisTitles(
|
||||
sideTitles: SideTitles(
|
||||
showTitles: false,
|
||||
),
|
||||
),
|
||||
leftTitles: AxisTitles(
|
||||
sideTitles: SideTitles(
|
||||
showTitles: true,
|
||||
getTitlesWidget: (value, _) {
|
||||
// Return a custom widget for each axis value
|
||||
return Container(
|
||||
constraints:
|
||||
const BoxConstraints.tightFor(width: double.infinity),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 3.0),
|
||||
// Adjust the margin value as needed
|
||||
child: FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
value.toInt().toString(),
|
||||
style: const TextStyle(
|
||||
color: Colors.orange,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
));
|
||||
|
||||
FlBorderData get borderData => FlBorderData(
|
||||
show: true, // Set to true to display the chart border
|
||||
border: const Border(
|
||||
bottom: BorderSide(color: Colors.black, width: 1),
|
||||
left:
|
||||
BorderSide(color: Colors.black, width: 1), // Hide the left border
|
||||
),
|
||||
);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(8))),
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
child: Column(
|
||||
children: [
|
||||
ValueListenableBuilder(
|
||||
valueListenable: DataService
|
||||
.instance.dailyAverageForCurrentWeek,
|
||||
builder: (context, value, child) {
|
||||
return SizedBox(
|
||||
height: 100,
|
||||
width: 400,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const TitleComponent("Kalorien"),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
const SecondaryTextComponent(
|
||||
"Durchschnittlich",
|
||||
null
|
||||
),
|
||||
Text(
|
||||
"${value.toString()} kcal/Tag",
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: 30,
|
||||
fontWeight: FontWeight.w600
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
ValueListenableBuilder(
|
||||
valueListenable:
|
||||
DataService.instance.barChartData,
|
||||
builder: (context, value, child) {
|
||||
return SizedBox(
|
||||
height: 300,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 15,
|
||||
// Adjust the height of the legend as needed
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
margin: const EdgeInsets.symmetric(
|
||||
horizontal: 8.0),
|
||||
// Adjust the spacing between legend items
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 12,
|
||||
height: 12,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.yellow,
|
||||
// Use the color of the first bar rod for the legend item
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 4.0),
|
||||
// Adjust the spacing between the color indicator and the legend label
|
||||
const Text(
|
||||
'Frühstück',
|
||||
// Replace with your desired legend label
|
||||
style: TextStyle(
|
||||
fontSize:
|
||||
12), // Adjust the font size of the legend labels
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.symmetric(
|
||||
horizontal: 8.0),
|
||||
// Adjust the spacing between legend items
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 12,
|
||||
height: 12,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.red,
|
||||
// Use the color of the first bar rod for the legend item
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 4.0),
|
||||
// Adjust the spacing between the color indicator and the legend label
|
||||
const Text(
|
||||
'Mittagessen',
|
||||
// Replace with your desired legend label
|
||||
style: TextStyle(
|
||||
fontSize:
|
||||
12), // Adjust the font size of the legend labels
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.symmetric(
|
||||
horizontal: 8.0),
|
||||
// Adjust the spacing between legend items
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 12,
|
||||
height: 12,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.green,
|
||||
// Use the color of the first bar rod for the legend item
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 4.0),
|
||||
// Adjust the spacing between the color indicator and the legend label
|
||||
const Text(
|
||||
'Abendessen',
|
||||
// Replace with your desired legend label
|
||||
style: TextStyle(
|
||||
fontSize:
|
||||
12), // Adjust the font size of the legend labels
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.fromLTRB(0, 24, 0, 0),
|
||||
height: 250,
|
||||
child: BarChart(
|
||||
BarChartData(
|
||||
barTouchData: barTouchData,
|
||||
titlesData: titlesData,
|
||||
borderData: borderData,
|
||||
barGroups: value,
|
||||
gridData: FlGridData(show: false),
|
||||
alignment: BarChartAlignment.spaceAround,
|
||||
extraLinesData: ExtraLinesData(
|
||||
horizontalLines: [
|
||||
HorizontalLine(
|
||||
y: DataService.instance.getCaloryTargetForOneDay(), // Specify the y-value where you want the line to be positioned
|
||||
color: Colors.black, // Change the color as per your requirement
|
||||
strokeWidth: 2, // Adjust the width as needed
|
||||
dashArray: [3, 2],
|
||||
label: HorizontalLineLabel(
|
||||
show: true,
|
||||
labelResolver: (x) => "Zielwert"
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:hive_flutter/adapters.dart';
|
||||
import '../../../../../services/statistics.dart';
|
||||
import 'today_card/today_card.dart';
|
||||
|
||||
class MealsComponent extends StatelessWidget {
|
||||
MealsComponent({Key? key}) : super(key: key);
|
||||
final List<Color> colors = [Colors.green,Colors.lightGreen,CupertinoColors.systemGreen];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: Hive.box(dotenv.env['TODAY_BOX'] ?? 'TODAY').listenable(),
|
||||
builder: (context, box, widget) {
|
||||
final mealTypes = ['FRÜHSTÜCK','MITTAGESSEN','ABENDESSEN']; // Specify the desired order of meal types
|
||||
return ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: box.keys.length,
|
||||
itemBuilder: (context, i) {
|
||||
String mealTypeAsString = mealTypes[i];
|
||||
return TodayCardComponent(
|
||||
mealTypeAsString,
|
||||
DataService.instance.getMealsOfTodayByMealtype(mealTypeAsString),
|
||||
color: colors[i],
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import '../../../../../../../helper/format_helper.dart';
|
||||
import '../../../../../../../models/food.dart';
|
||||
import 'card_food_item.dart';
|
||||
|
||||
|
||||
class CardDataFoodComponent extends StatelessWidget {
|
||||
final List<Food> foods;
|
||||
final Color color;
|
||||
|
||||
const CardDataFoodComponent(this.foods,this.color, {Key? key,}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||
child: foods.isNotEmpty ?
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
ListView.builder(
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemCount: getMapOfDistinctElementsWithCounterAndCalories(
|
||||
foods)
|
||||
.keys
|
||||
.length,
|
||||
itemBuilder: (context, i) {
|
||||
Map<String, List<int>> map =
|
||||
getMapOfDistinctElementsWithCounterAndCalories(
|
||||
foods);
|
||||
String foodName = map.keys.elementAt(i);
|
||||
List<int> values = map.values.elementAt(i);
|
||||
return Column(
|
||||
children: [
|
||||
CardFoodItemComponent(foodName,values),
|
||||
Divider(
|
||||
color: Colors.grey.shade300,
|
||||
thickness: 1.2,
|
||||
)
|
||||
],
|
||||
);
|
||||
})
|
||||
],
|
||||
)
|
||||
: const Center(
|
||||
child: Text(
|
||||
"Füge jetzt neue Gerichte hinzu!",
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
color: Colors.white
|
||||
),
|
||||
)
|
||||
));
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class CardFoodItemComponent extends StatelessWidget {
|
||||
final String foodName;
|
||||
final List<int> countAndCalories; // [count, calories]
|
||||
|
||||
const CardFoodItemComponent(this.foodName,this.countAndCalories, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.fromLTRB(0, 8, 0, 4),
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"$foodName - ${countAndCalories[0] * 100}g",
|
||||
style: const TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 17,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
softWrap: true,
|
||||
maxLines: 2,
|
||||
),
|
||||
Text(
|
||||
"\n${countAndCalories[1]} kcal | 100g",
|
||||
style: const TextStyle(color: Colors.white),
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
import 'package:basic_utils/basic_utils.dart';
|
||||
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_data_food.dart';
|
||||
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/today_card/sub_components/card_title.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../../../../helper/cast_helper.dart';
|
||||
import '../../../../../../models/food.dart';
|
||||
import '../../../../../search_food/search_food.dart';
|
||||
|
||||
class TodayCardComponent extends StatelessWidget {
|
||||
final String title;
|
||||
final Color color;
|
||||
final List<Food> foods;
|
||||
|
||||
const TodayCardComponent(this.title, this.foods, {super.key, Color? color})
|
||||
: color = color ?? Colors.black;
|
||||
|
||||
Route createRoute(String cardName) {
|
||||
return PageRouteBuilder(
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
SearchFoodPage(cardName),
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||
const begin = Offset(0.0, 1.0);
|
||||
const end = Offset.zero;
|
||||
const curve = Curves.ease;
|
||||
|
||||
var tween =
|
||||
Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
|
||||
|
||||
return SlideTransition(
|
||||
position: animation.drive(tween),
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
int countCalories(List<Food> foods){
|
||||
int summary = 0;
|
||||
for(int i=0; i<foods.length;i++){
|
||||
summary += foods[i].calories is int ? foods[i].calories as int : (foods[i].calories as double).round();
|
||||
}
|
||||
|
||||
return summary;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: color,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
margin: const EdgeInsets.fromLTRB(0, 0, 0, 16),
|
||||
child: Column(
|
||||
children: [
|
||||
CardTitleComponent(
|
||||
StringUtils.capitalize(title),
|
||||
"${countCalories(castDynamicToListFood(foods))} Kalorien",
|
||||
),
|
||||
CardDataFoodComponent(
|
||||
foods,
|
||||
color,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8, right: 8,bottom: 8),
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
minimumSize: const Size.fromHeight(40),
|
||||
backgroundColor: const Color(0xFFffffff),
|
||||
foregroundColor: color,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
Navigator.of(context).push(createRoute(title));
|
||||
},
|
||||
child: const Text(
|
||||
'+ Gericht hinzufügen',
|
||||
style:TextStyle(
|
||||
fontSize: 17
|
||||
) ,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
import 'package:ernaehrung/pages/nav_pages/subpages/today_page/sub_components/meals.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
|
||||
class TodayPage extends StatefulWidget {
|
||||
final String title;
|
||||
final Color backgroundColor = const Color(0xff47a44b);
|
||||
|
||||
const TodayPage({Key? key, required this.title}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<TodayPage> createState() => _TodayPageState();
|
||||
}
|
||||
|
||||
class _TodayPageState extends State<TodayPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(body: SingleChildScrollView(child: MealsComponent()));
|
||||
}
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
import 'package:empty_widget/empty_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../models/food.dart';
|
||||
import 'searched_food.dart';
|
||||
|
||||
class SearchComponent extends StatefulWidget {
|
||||
final List<Food> foods;
|
||||
final String cardName;
|
||||
const SearchComponent(this.foods, this.cardName, {super.key});
|
||||
|
||||
@override
|
||||
State<SearchComponent> createState() => _SearchComponentState();
|
||||
}
|
||||
|
||||
class _SearchComponentState extends State<SearchComponent> {
|
||||
final TextEditingController controller = TextEditingController();
|
||||
late List<Food> allFoods = widget.foods;
|
||||
List<Food> foundedFood = [];
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
constraints: const BoxConstraints.expand(),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 16, 16, 0), // Add padding on the X-axis
|
||||
child: Column(
|
||||
children: [
|
||||
TextField(
|
||||
controller: controller,
|
||||
decoration: InputDecoration(
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16), // Add padding on the X-axis for text input
|
||||
prefix: const Icon(Icons.search),
|
||||
hintText: 'Suche nach Gericht',
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: const BorderSide(color: Colors.blue),
|
||||
),
|
||||
),
|
||||
onChanged: findOnChanged,
|
||||
),
|
||||
Expanded(
|
||||
child: controller.text.isNotEmpty && foundedFood.isNotEmpty
|
||||
? ListView.builder(
|
||||
itemCount: foundedFood.length,
|
||||
itemBuilder: (context, index) {
|
||||
final food = foundedFood[index];
|
||||
return SearchedFoodComponent(food, widget.cardName);
|
||||
},
|
||||
)
|
||||
: EmptyWidget(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void findOnChanged(String searchedFood) async{
|
||||
foundedFood =
|
||||
allFoods
|
||||
.where((food) => food.name
|
||||
.toString()
|
||||
.toLowerCase()
|
||||
.startsWith(searchedFood.toLowerCase()))
|
||||
.toList();
|
||||
setState(() {
|
||||
foundedFood;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -1,202 +0,0 @@
|
|||
import 'package:assorted_layout_widgets/assorted_layout_widgets.dart';
|
||||
import 'package:basic_utils/basic_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import '../../../helper/cast_helper.dart';
|
||||
import '../../../helper/format_helper.dart';
|
||||
import '../../../models/food.dart';
|
||||
import '../../../services/statistics.dart';
|
||||
|
||||
class SearchedFoodComponent extends StatefulWidget {
|
||||
final Food food;
|
||||
final String cardName;
|
||||
const SearchedFoodComponent(this.food, this.cardName, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SearchedFoodComponent> createState() => _SearchFoodComponentState();
|
||||
}
|
||||
|
||||
class _SearchFoodComponentState extends State<SearchedFoodComponent> {
|
||||
int counter = 1;
|
||||
void storeFood(int counter, BuildContext context) async {
|
||||
final todayBox = Hive.box(dotenv.env['TODAY_BOX']!);
|
||||
if (!todayBox.isOpen){
|
||||
Hive.openBox(dotenv.env['TODAY_BOX']!);
|
||||
}
|
||||
for(int i = 0; i < counter; i++){
|
||||
DataService.instance.addItemToMainBox(widget.food, widget.cardName);
|
||||
addValuesToList(todayBox, widget.cardName, [widget.food]);
|
||||
}
|
||||
showSuccessToast(context);
|
||||
}
|
||||
|
||||
void showSuccessToast(BuildContext context){
|
||||
Fluttertoast.showToast(
|
||||
msg: "${getToastFoodNameString(widget.food,context)} erfolgreich zu ${StringUtils.capitalize(widget.cardName)} hinzugefügt",
|
||||
toastLength: Toast.LENGTH_SHORT,
|
||||
gravity: ToastGravity.BOTTOM,
|
||||
timeInSecForIosWeb: 5,
|
||||
backgroundColor: Colors.green,
|
||||
textColor: Colors.black,
|
||||
);
|
||||
}
|
||||
|
||||
void addValuesToList(box, String key, List<Food> newValues){
|
||||
List<Food> existingList = castDynamicToListFood(box.get(key));
|
||||
for(int i = 0; i < newValues.length;i++){
|
||||
if(!existingList.contains(newValues[i])){
|
||||
existingList.add(newValues[i]);
|
||||
}
|
||||
}
|
||||
box.put(key, existingList);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
margin: const EdgeInsets.only(top: 8),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.lightGreen,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: WrapSuper(
|
||||
spacing: 32,
|
||||
wrapType: WrapType.balanced,
|
||||
wrapFit: WrapFit.larger,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.6,
|
||||
child: Text(
|
||||
widget.food.name,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
softWrap: false,
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.6,
|
||||
child: Text(
|
||||
"${widget.food.calories} kcal | 100g",
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
softWrap: false,
|
||||
style: const TextStyle(
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top:12),
|
||||
child: Row(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right :12),
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.green,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
border: Border.all(color: Colors.white),
|
||||
),
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
counter = counter > 1 ? counter - 1 : 1;
|
||||
});
|
||||
},
|
||||
child: const Center(
|
||||
child: Text(
|
||||
"-",
|
||||
style: TextStyle(fontSize: 24, color: Colors.white, fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
width: 20,
|
||||
child: Text(
|
||||
counter.toString(),
|
||||
style: const TextStyle(fontSize: 24, color: Colors.white, fontWeight: FontWeight.bold),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left:12),
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 38,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.green,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
border: Border.all(color: Colors.white),
|
||||
),
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
counter++;
|
||||
});
|
||||
},
|
||||
child: const Center(
|
||||
child: Text(
|
||||
"+",
|
||||
style: TextStyle(fontSize: 24, color: Colors.white, fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top:12),
|
||||
child: ElevatedButton(
|
||||
onPressed: () async {
|
||||
storeFood(counter,context);
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
foregroundColor: Colors.white,
|
||||
backgroundColor: Colors.green,
|
||||
shadowColor: Colors.greenAccent,
|
||||
elevation: 3,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(5.0),
|
||||
),
|
||||
),
|
||||
child: const Text(
|
||||
'+',
|
||||
style: TextStyle(fontSize: 25),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -1,175 +0,0 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import '../../models/form_builder.dart';
|
||||
import '../../models/user.dart';
|
||||
import 'form_builder_text_field.dart';
|
||||
|
||||
class FormBuilderComponent extends StatefulWidget {
|
||||
final bool lockTextFields;
|
||||
|
||||
const FormBuilderComponent({Key? key, required this.lockTextFields})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<FormBuilderComponent> createState() => _FormBuilderComponentState();
|
||||
}
|
||||
|
||||
class _FormBuilderComponentState extends State<FormBuilderComponent> {
|
||||
final formKey = GlobalKey<FormBuilderState>();
|
||||
|
||||
final List<FormTextField> listOfTextField = [
|
||||
FormTextField(
|
||||
"vorname",
|
||||
TextInputType.text,
|
||||
30,
|
||||
"Der Vorname sollte maximal 30 Zeichen lang sein",
|
||||
"Der Vorname sollte mindestens 2 Zeichen lang sein",
|
||||
2,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null),
|
||||
FormTextField(
|
||||
"nachname",
|
||||
TextInputType.text,
|
||||
30,
|
||||
"Der Nachname sollte maximal 30 Zeichen lang sein",
|
||||
"Der Nachname sollte mindestens 2 Zeichen lang sein",
|
||||
2,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null),
|
||||
FormTextField(
|
||||
"gewicht",
|
||||
TextInputType.number,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
200,
|
||||
10,
|
||||
"Der Gewicht sollte maximal 200 kg sein",
|
||||
"Der Gewicht sollte mindestens 10 kg sein"),
|
||||
FormTextField(
|
||||
"groesse",
|
||||
TextInputType.number,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
230,
|
||||
60,
|
||||
"Die Größe sollte maximal 230cm sein",
|
||||
"Die Größe sollte mindestens 60cm sein"),
|
||||
FormTextField(
|
||||
"alter",
|
||||
TextInputType.number,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
99,
|
||||
6,
|
||||
"Das Alter sollte maximal 99 Jahre alt sein",
|
||||
"Das Alter sollte mindestens 6 Jahre alt sein"),
|
||||
FormTextField(
|
||||
"kalorien",
|
||||
TextInputType.number,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
30000,
|
||||
1000,
|
||||
"Die Kalorienanzahl sollte mindestens 30000 Kcal sein",
|
||||
"Die Kalorienanzahl sollte mindestens 1000 Kcal sein")
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FormBuilder(
|
||||
key: formKey,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
ListView.builder(
|
||||
primary: false,
|
||||
itemCount: listOfTextField.length,
|
||||
shrinkWrap: true,
|
||||
itemBuilder: (context, index) {
|
||||
return FormBuilderTextFieldComponent(
|
||||
widget.lockTextFields, listOfTextField[index]);
|
||||
}),
|
||||
Container(
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
minimumSize: const Size.fromHeight(40), //
|
||||
backgroundColor: CupertinoColors.systemGreen,
|
||||
foregroundColor: const Color(0xFFffffff),
|
||||
shape: const StadiumBorder(),
|
||||
),
|
||||
onPressed: () {
|
||||
final Box box = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER');
|
||||
|
||||
if (widget.lockTextFields) {
|
||||
box.put(
|
||||
"USER",
|
||||
User(
|
||||
formKey.currentState?.fields['vorname']
|
||||
?.value ??
|
||||
box.get("USER").vorname.toString(),
|
||||
formKey.currentState?.fields['nachname']
|
||||
?.value ??
|
||||
box.get("USER").nachname.toString(),
|
||||
int.parse(formKey.currentState?.fields['gewicht']
|
||||
?.value ??
|
||||
box.get("USER").gewicht),
|
||||
int.parse(formKey.currentState?.fields['groesse']
|
||||
?.value ??
|
||||
box.get("USER").groesse),
|
||||
int.parse(formKey.currentState?.fields['alter']?.value ??
|
||||
box.get("USER").alter),
|
||||
int.parse(formKey.currentState?.fields['kalorien']
|
||||
?.value ??
|
||||
box.get("USER").kalorien)));
|
||||
|
||||
ScaffoldMessenger.of(context)
|
||||
.showSnackBar(const SnackBar(
|
||||
duration: Duration(seconds: 2),
|
||||
content: Text('Die Daten wurden erfolgreich gespeichert'),
|
||||
));
|
||||
} else {
|
||||
box.put(
|
||||
"USER",
|
||||
User(
|
||||
formKey.currentState?.fields['vorname']?.value,
|
||||
formKey.currentState?.fields['nachname']?.value,
|
||||
int.parse(formKey.currentState?.fields['gewicht']?.value),
|
||||
int.parse(formKey.currentState?.fields['groesse']?.value),
|
||||
int.parse(formKey.currentState?.fields['alter']?.value),
|
||||
int.parse(formKey.currentState?.fields['kalorien']?.value)
|
||||
));
|
||||
}
|
||||
Future.delayed(
|
||||
const Duration(seconds: 2),
|
||||
() => Navigator.of(context)
|
||||
.pushNamedAndRemoveUntil('/navigation', (Route<dynamic> route)
|
||||
=> false)
|
||||
);
|
||||
},
|
||||
child: const Text("Eingaben bestätigen"),
|
||||
)),
|
||||
],
|
||||
)),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -1,119 +0,0 @@
|
|||
import 'package:basic_utils/basic_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import '../../models/form_builder.dart';
|
||||
import '../../models/user.dart';
|
||||
|
||||
class FormBuilderTextFieldComponent extends StatefulWidget {
|
||||
final bool isSettingsPage;
|
||||
final FormTextField formTextField;
|
||||
|
||||
const FormBuilderTextFieldComponent(this.isSettingsPage, this.formTextField,
|
||||
{super.key});
|
||||
|
||||
@override
|
||||
State<FormBuilderTextFieldComponent> createState() => _FormBuilderTextFieldComponentState();
|
||||
}
|
||||
|
||||
class _FormBuilderTextFieldComponentState extends State<FormBuilderTextFieldComponent> {
|
||||
bool enable = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
child: widget.isSettingsPage
|
||||
? Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Expanded(
|
||||
child:
|
||||
TextFieldChild(widget.isSettingsPage, widget.formTextField, enable: enable,)),
|
||||
enable
|
||||
? IconButton(
|
||||
onPressed: () async {
|
||||
setState(() {
|
||||
enable = !enable;
|
||||
});
|
||||
},
|
||||
icon: const Icon(Icons.lock_open))
|
||||
: IconButton(
|
||||
onPressed: () async {
|
||||
setState(() {
|
||||
enable = !enable;
|
||||
});
|
||||
},
|
||||
icon: const Icon(Icons.lock))
|
||||
],
|
||||
)
|
||||
: TextFieldChild(widget.isSettingsPage, widget.formTextField),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class TextFieldChild extends StatelessWidget {
|
||||
final bool isSettingsPage;
|
||||
final FormTextField formTextField;
|
||||
final bool? enable;
|
||||
|
||||
const TextFieldChild(this.isSettingsPage, this.formTextField,
|
||||
{super.key, this.enable = true});
|
||||
|
||||
|
||||
dynamic getInitialValue(FormTextField textField){
|
||||
final User user = Hive.box<User>(dotenv.env['USER_BOX'] ?? 'USER').values.last;
|
||||
if (textField.title == "vorname"){
|
||||
return user.vorname;
|
||||
}else if (textField.title == "nachname"){
|
||||
return user.nachname;
|
||||
}else if (textField.title == "gewicht"){
|
||||
return user.gewicht;
|
||||
}else if (textField.title == "groesse"){
|
||||
return user.groesse;
|
||||
}else if (textField.title == "alter"){
|
||||
return user.alter;
|
||||
}else if (textField.title == "kalorien"){
|
||||
return user.kalorien;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FormBuilderTextField(
|
||||
name: formTextField.title,
|
||||
enabled: enable!,
|
||||
initialValue: isSettingsPage ? getInitialValue(formTextField).toString() : "",
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(10.0))),
|
||||
filled: true,
|
||||
hintStyle: TextStyle(color: Colors.grey.shade400),
|
||||
hintText: StringUtils.capitalize(formTextField.title),
|
||||
labelText: StringUtils.capitalize(formTextField.title),
|
||||
fillColor: Colors.white70),
|
||||
keyboardType: formTextField.textInputType,
|
||||
maxLength: TextInputType.number == formTextField.textInputType ? 7 : 30,
|
||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||
validator: FormBuilderValidators.compose([
|
||||
FormBuilderValidators.required(),
|
||||
|
||||
TextInputType.number == formTextField.textInputType
|
||||
? FormBuilderValidators.max(formTextField.numericMax!,
|
||||
errorText: formTextField.numericMaxErrorMessage)
|
||||
: FormBuilderValidators.maxLength(30,
|
||||
errorText: formTextField.maxLengthErrorMessage),
|
||||
|
||||
TextInputType.number == formTextField.textInputType
|
||||
? FormBuilderValidators.min(formTextField.numericMin!,
|
||||
errorText: formTextField.numericMinErrorMessage)
|
||||
: FormBuilderValidators.minLength(2,
|
||||
errorText: formTextField.minLengthErrorMessage)
|
||||
]),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class SecondaryTextComponent extends StatelessWidget {
|
||||
final String title;
|
||||
final int? rank;
|
||||
|
||||
const SecondaryTextComponent(this.title, this.rank,{Key? key,}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final TextStyle textStyle = TextStyle(
|
||||
color: Colors.grey.shade500,
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.bold,
|
||||
);
|
||||
|
||||
Widget textWidget;
|
||||
|
||||
if (rank != null) {
|
||||
textWidget = Container(
|
||||
decoration: BoxDecoration(
|
||||
color: getRankColor(rank!),
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
'$rank.',
|
||||
style: rank! <= 3 ? textStyle.copyWith(color: Colors.white) :textStyle.copyWith(color: Colors.grey),
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
title.toString(),
|
||||
style: rank! <= 3 ? textStyle.copyWith(color: Colors.white) :textStyle.copyWith(color: Colors.grey),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
} else {
|
||||
textWidget = Text(
|
||||
title.toString(),
|
||||
style: textStyle,
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 8.0),
|
||||
child: textWidget,
|
||||
);
|
||||
}
|
||||
|
||||
Color getRankColor(int rank) {
|
||||
if (rank == 1) {
|
||||
return Colors.amber;
|
||||
} else if (rank == 2) {
|
||||
return Colors.grey;
|
||||
} else if (rank == 3) {
|
||||
return Colors.brown;
|
||||
} else {
|
||||
return Colors.transparent;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import '../shared_components/form_builder.dart';
|
||||
|
||||
class OnboardingPage extends StatefulWidget {
|
||||
const OnboardingPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<OnboardingPage> createState() => _OnboardingPageState();
|
||||
}
|
||||
|
||||
class _OnboardingPageState extends State<OnboardingPage> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(
|
||||
"Welcome",
|
||||
style: TextStyle(
|
||||
color: Colors.black
|
||||
),
|
||||
),
|
||||
backgroundColor: Colors.grey.shade100,
|
||||
),
|
||||
body: const FormBuilderComponent(lockTextFields: false,)
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../shared_components/form_builder.dart';
|
||||
|
||||
|
||||
class SettingsPage extends StatefulWidget {
|
||||
const SettingsPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SettingsPage> createState() => _SettingsPageState();
|
||||
}
|
||||
|
||||
class _SettingsPageState extends State<SettingsPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
backgroundColor: CupertinoColors.systemGreen,
|
||||
leading: BackButton(
|
||||
onPressed: () async => Navigator.of(context).pop(),
|
||||
),
|
||||
title: const Text('Einstellungen'),
|
||||
),
|
||||
body: const FormBuilderComponent(lockTextFields: true),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class HeaderButton extends StatelessWidget {
|
||||
final String buttonText;
|
||||
final Widget page;
|
||||
|
||||
const HeaderButton(this.buttonText, this.page, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ElevatedButton(onPressed: (){
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => page),
|
||||
);
|
||||
}, child: Text(buttonText));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
import 'package:ernaehrung/web/component/header_button_component.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
class HeaderComponentWeb extends StatelessWidget {
|
||||
HeaderComponentWeb({Key? key}) : super(key: key);
|
||||
|
||||
final List<HeaderData> headerButtons = [
|
||||
HeaderData("Heute", const Placeholder()),
|
||||
HeaderData("Fortschritt", const Placeholder()),
|
||||
HeaderData("Mahlzeitplan", const Placeholder())
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: List.generate(headerButtons.length, (index) =>
|
||||
HeaderButton(headerButtons[index].buttonText, headerButtons[index].page))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HeaderData{
|
||||
final String buttonText;
|
||||
final Widget page;
|
||||
|
||||
HeaderData(this.buttonText, this.page);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'HeaderData{route: $page, buttonText: $buttonText}';
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
import 'package:ernaehrung/android/components/statistics_circular_indicator_component.dart';
|
||||
import 'package:ernaehrung/android/config/cast_helper.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:hive_flutter/adapters.dart';
|
||||
import '../../android/components/card_component.dart';
|
||||
import '../../android/components/diet_chart_component.dart';
|
||||
|
||||
class SectionComponent extends StatelessWidget {
|
||||
const SectionComponent({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
StatisticsPercentComponent(300, 100, 400),
|
||||
DietChatComponent(1500),
|
||||
ValueListenableBuilder(
|
||||
valueListenable: Hive.box("TODAY").listenable(),
|
||||
builder: (context, box, widget) {
|
||||
return ListView.builder(
|
||||
primary: false,
|
||||
shrinkWrap: true,
|
||||
itemCount: box.keys.length,
|
||||
itemBuilder: (context, i) {
|
||||
if(box.keyAt(i).toString() == "DATE"){
|
||||
return const SizedBox.shrink();
|
||||
}else{
|
||||
return CardComponent(
|
||||
eatingMealName: box.keyAt(i).toString(),
|
||||
selectedMeal: castDynamicToListFood(box.getAt(i)),
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
import 'package:ernaehrung/web/component/header_component.dart';
|
||||
import 'package:ernaehrung/web/component/section_component.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MobileScreen extends StatelessWidget {
|
||||
const MobileScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
return SizedBox(
|
||||
width: screenWidth,
|
||||
height: screenWidth,
|
||||
child: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Column(
|
||||
children: [
|
||||
HeaderComponentWeb(),
|
||||
Container(
|
||||
margin: const EdgeInsets.fromLTRB(0, 24, 0, 0),
|
||||
child: const Center(
|
||||
child: SectionComponent()
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
import 'package:ernaehrung/web/mobile.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sizer/sizer.dart';
|
||||
|
||||
class WebApp extends StatelessWidget {
|
||||
const WebApp({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Sizer(
|
||||
builder: (context, orientation, deviceType) {
|
||||
return MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
title: 'Sizer',
|
||||
theme: ThemeData.light(),
|
||||
home: const HomeScreen() ,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
const HomeScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<HomeScreen> createState() => _HomeScreenState();
|
||||
}
|
||||
|
||||
class _HomeScreenState extends State<HomeScreen> {
|
||||
|
||||
bool isDesktop(BuildContext context) => MediaQuery.of(context).size.width >= 1028;
|
||||
bool isTablet(BuildContext context) =>
|
||||
MediaQuery.of(context).size.width >= 768 && MediaQuery.of(context).size.width <= 1027;
|
||||
bool isMobile(BuildContext context) => MediaQuery.of(context).size.width <= 767;
|
||||
|
||||
Widget getDeviceType(context){
|
||||
if(isDesktop(context)){
|
||||
return const Text("Desktop");
|
||||
}else if(isTablet(context)){
|
||||
return const Text("Tablet");
|
||||
}else if(isMobile(context)){
|
||||
return const MobileScreen();
|
||||
}
|
||||
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Row(
|
||||
children: [
|
||||
getDeviceType(context),
|
||||
],
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6,10 +6,6 @@
|
|||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <dynamic_color/dynamic_color_plugin.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
dynamic_color
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
|
|
|
@ -5,12 +5,8 @@
|
|||
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"))
|
||||
}
|
||||
|
|
|
@ -0,0 +1,794 @@
|
|||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: "8880b4cfe7b5b17d57c052a5a3a8cc1d4f546261c7cc8fbd717bd53f48db0568"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "59.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: a89627f49b0e70e068130a36571409726b04dab12da7e5625941d2c8ec278b96
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.11.1"
|
||||
animate_gradient:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: animate_gradient
|
||||
sha256: de5fa49579fed8184a9d9d30c3f46a74a3227ba148d283c20bc0e92ed9cc1545
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.0.2"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
assorted_layout_widgets:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: assorted_layout_widgets
|
||||
sha256: "63f96e75d78a037987696e0ad24be9dd18c8404d16b0785d159f4a72f2ca490d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.0"
|
||||
basic_utils:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: basic_utils
|
||||
sha256: "8815477fcf58499e42326bd858e391442425fa57db9a45e48e15224c62049262"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.5.4"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
build:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
build_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_config
|
||||
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
build_daemon:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_daemon
|
||||
sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
build_resolvers:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.2.7"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_collection
|
||||
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.1"
|
||||
built_value:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.5.0"
|
||||
card_swiper:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: card_swiper
|
||||
sha256: "0c94c538f47be1dab52d018d4900a7046b4cb0700dc7f95b8628da89d1212b35"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.4"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: checked_yaml
|
||||
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.4.0"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.0"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cupertino_icons
|
||||
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
empty_widget:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: empty_widget
|
||||
sha256: aad8073e5fb43eadde7007db1e2fea7acd33d0d33cff031e31a6675ca0a3e7fb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.0.5"
|
||||
equatable:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: equatable
|
||||
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.4"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
fl_chart:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: fl_chart
|
||||
sha256: "48a1b69be9544e2b03d9a8e843affd89e43f3194c9248776222efcb4206bb1ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.62.0"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_dotenv:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_dotenv
|
||||
sha256: d9283d92059a22e9834bc0a31336658ffba77089fb6f3cc36751f1fc7c6661a3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.2"
|
||||
flutter_form_builder:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_form_builder
|
||||
sha256: "236c96dad143a0e67c0f11522606d6b17b6510e97530cb73af355b018ded7c10"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_lints
|
||||
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
flutter_localizations:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
form_builder_validators:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: form_builder_validators
|
||||
sha256: f2d90439c56345c23ad8d0c2912e4002cd02563d816f4387c9495051c10d3321
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.6.1"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: graphs
|
||||
sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
hive:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive
|
||||
sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
hive_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive_flutter
|
||||
sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
hive_generator:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: hive_generator
|
||||
sha256: "65998cc4d2cd9680a3d9709d893d2f6bb15e6c1f92626c3f1fa650b4b3281521"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
http:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http
|
||||
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.13.6"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
intl:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: intl
|
||||
sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.17.0"
|
||||
io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: io
|
||||
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.5"
|
||||
json_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: json_annotation
|
||||
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.8.1"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lints
|
||||
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.13"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.0"
|
||||
matrix4_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matrix4_transform
|
||||
sha256: "6ddeaa2c0e1f5c3f3a197f552377570b3e54fa0b8bf48507728a216fc0fd78a6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.2"
|
||||
path_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.14"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.27"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.2"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.10"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.6"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.6"
|
||||
percent_indicator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: percent_indicator
|
||||
sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.3"
|
||||
platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
pointycastle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pointycastle
|
||||
sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.7.3"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
process:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: process
|
||||
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.4"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
pubspec_parse:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pubspec_parse
|
||||
sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.3"
|
||||
responsive_framework:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: responsive_framework
|
||||
sha256: "07bbe163bd67708160f3d11abaf6b34ae5b718e4250d83aa9a8a9496325f6b8a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
searchable_listview:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: searchable_listview
|
||||
sha256: "0a158665571e03890408e2d5569f0673a36f79fac5a671a54495b52f67b93b63"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
sizer:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sizer
|
||||
sha256: d2b3cb6cbc4a637f508dacd786bae55df31e5fc088044248a43e4fd1e050c117
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.15"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: b20e191de6964e98032573cecb1d2b169d96ba63fdb586d24dcd1003ba7e94f6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_helper
|
||||
sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.3"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
stream_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_transform
|
||||
sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.16"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timing
|
||||
sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
universal_io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: universal_io
|
||||
sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.4"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=2.19.6 <3.0.0"
|
||||
flutter: ">=3.7.0"
|
10
pubspec.yaml
10
pubspec.yaml
|
@ -48,12 +48,7 @@ dependencies:
|
|||
fl_chart: ^0.62.0
|
||||
basic_utils: ^5.5.4
|
||||
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
|
||||
form_builder_validators: ^8.6.1
|
||||
|
||||
|
||||
dev_dependencies:
|
||||
|
@ -83,6 +78,9 @@ 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:
|
||||
|
|
|
@ -1,356 +0,0 @@
|
|||
import 'dart:io';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hive/src/adapters/date_time_adapter.dart';
|
||||
import 'package:hive/src/hive_impl.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
class _TestAdapter extends TypeAdapter<int> {
|
||||
_TestAdapter([this.typeId = 0]);
|
||||
|
||||
@override
|
||||
final int typeId;
|
||||
|
||||
@override
|
||||
int read(_) => 5;
|
||||
|
||||
@override
|
||||
void write(_, __) {}
|
||||
}
|
||||
|
||||
void main() {
|
||||
// Initialize hive.
|
||||
Hive.initFlutter();
|
||||
|
||||
group('HiveImpl', () {
|
||||
Future<HiveImpl> initHive() async {
|
||||
await Hive.initFlutter();
|
||||
var hive = HiveImpl();
|
||||
|
||||
var path = "/assets/";
|
||||
if (!kIsWeb) {
|
||||
var appDocDir = await getApplicationDocumentsDirectory();
|
||||
path = appDocDir.path;
|
||||
}
|
||||
hive.init(path);
|
||||
return hive;
|
||||
}
|
||||
|
||||
test('.init()', () {
|
||||
var hive = HiveImpl();
|
||||
|
||||
expect(() => hive.init('MYPATH'), returnsNormally);
|
||||
expect(hive.homePath, 'MYPATH');
|
||||
|
||||
expect(
|
||||
hive.findAdapterForValue(DateTime.now())!.adapter,
|
||||
isA<DateTimeWithTimezoneAdapter>(),
|
||||
);
|
||||
expect(hive.findAdapterForTypeId(16)!.adapter, isA<DateTimeAdapter>());
|
||||
});
|
||||
|
||||
group('.openBox()', () {
|
||||
group('box already open', () {
|
||||
test('opened box is returned if it exists', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var testBox = await hive.openBox('TESTBOX');
|
||||
var testBox2 = await hive.openBox('testBox');
|
||||
expect(testBox == testBox2, true);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('throw HiveError if opened box is lazy', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await hive.openLazyBox('LAZYBOX');
|
||||
await expectLater(
|
||||
() => hive.openBox('lazyBox'),
|
||||
throwsUnimplementedError,
|
||||
);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('throw HiveError if already opening box is lazy', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await Future.wait([
|
||||
hive.openLazyBox('TESTBOX'),
|
||||
expectLater(hive.openBox('testbox'), throwsUnimplementedError)
|
||||
]);
|
||||
});
|
||||
|
||||
test('same box returned if it is already opening', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
Box? box1;
|
||||
Box? box2;
|
||||
await Future.wait([
|
||||
hive.openBox('TESTBOX').then((value) => box1 = value),
|
||||
hive.openBox('testbox').then((value) => box2 = value)
|
||||
]);
|
||||
|
||||
expect(box1 == box2, true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
group('.openLazyBox()', () {
|
||||
group('box already open', () {
|
||||
test('opened box is returned if it exists', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var testBox = await hive.openLazyBox('TESTBOX');
|
||||
var testBox2 = await hive.openLazyBox('testBox');
|
||||
expect(testBox == testBox2, true);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('same box returned if it is already opening', () async {
|
||||
LazyBox? box1;
|
||||
LazyBox? box2;
|
||||
|
||||
var hive = await initHive();
|
||||
await Future.wait([
|
||||
hive.openLazyBox('LAZYBOX').then((value) => box1 = value),
|
||||
hive.openLazyBox('lazyBox').then((value) => box2 = value)
|
||||
]);
|
||||
|
||||
expect(box1 == box2, true);
|
||||
});
|
||||
|
||||
test('throw HiveError if opened box is not lazy', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await hive.openBox('LAZYBOX');
|
||||
await expectLater(
|
||||
() => hive.openLazyBox('lazyBox'),
|
||||
throwsUnimplementedError,
|
||||
);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('throw HiveError if already opening box is not lazy', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await Future.wait([
|
||||
hive.openBox('LAZYBOX'),
|
||||
expectLater(hive.openLazyBox('lazyBox'), throwsUnimplementedError)
|
||||
]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
group('.box()', () {
|
||||
test('returns already opened box', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var box = await hive.openBox('TESTBOX');
|
||||
expect(hive.box('testBox'), box);
|
||||
expect(() => hive.box('other'), throwsArgumentError);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('throws HiveError if box type does not match', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await hive.openBox<int>('INTBOX');
|
||||
expect(
|
||||
() => hive.box('intBox'),
|
||||
throwsArgumentError,
|
||||
);
|
||||
|
||||
await hive.openBox('DYNAMICBOX');
|
||||
expect(
|
||||
() => hive.box<int>('dynamicBox'),
|
||||
throwsArgumentError,
|
||||
);
|
||||
|
||||
await hive.openLazyBox('LAZYBOX');
|
||||
expect(
|
||||
() => hive.box('lazyBox'),
|
||||
throwsArgumentError,
|
||||
);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
});
|
||||
|
||||
group('.lazyBox()', () {
|
||||
test('returns already opened box', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var box = await hive.openLazyBox('TESTBOX');
|
||||
expect(hive.lazyBox('testBox'), box);
|
||||
expect(() => hive.lazyBox('other'), throwsArgumentError);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('throws HiveError if box type does not match', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await hive.openLazyBox<int>('INTBOX');
|
||||
expect(
|
||||
() => hive.lazyBox('intBox'),
|
||||
throwsArgumentError,
|
||||
);
|
||||
|
||||
await hive.openLazyBox('DYNAMICBOX');
|
||||
expect(
|
||||
() => hive.lazyBox<int>('dynamicBox'),
|
||||
throwsArgumentError,
|
||||
);
|
||||
|
||||
await hive.openBox('BOX');
|
||||
expect(
|
||||
() => hive.lazyBox('box'),
|
||||
throwsArgumentError,
|
||||
);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
});
|
||||
|
||||
test('isBoxOpen()', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
await hive.openBox('testBox');
|
||||
|
||||
expect(hive.isBoxOpen('testBox'), true);
|
||||
expect(hive.isBoxOpen('nonExistingBox'), false);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('.close()', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var box1 = await hive.openBox('box1');
|
||||
var box2 = await hive.openBox('box2');
|
||||
expect(box1.isOpen, true);
|
||||
expect(box2.isOpen, true);
|
||||
|
||||
await hive.close();
|
||||
expect(box1.isOpen, false);
|
||||
expect(box2.isOpen, false);
|
||||
});
|
||||
|
||||
test('.generateSecureKey()', () {
|
||||
var hive = HiveImpl();
|
||||
|
||||
var key1 = hive.generateSecureKey();
|
||||
var key2 = hive.generateSecureKey();
|
||||
|
||||
expect(key1.length, 32);
|
||||
expect(key2.length, 32);
|
||||
expect(key1, isNot(key2));
|
||||
});
|
||||
|
||||
group('.deleteBoxFromDisk()', () {
|
||||
test('deletes open box', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var box1 = await hive.openBox('testBox1');
|
||||
await box1.put('key', 'value');
|
||||
var box1File = File(box1.path!);
|
||||
|
||||
await hive.deleteBoxFromDisk('testBox1');
|
||||
expect(await box1File.exists(), false);
|
||||
expect(hive.isBoxOpen('testBox1'), false);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('deletes closed box', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var box1 = await hive.openBox('testBox1');
|
||||
await box1.put('key', 'value');
|
||||
var path = box1.path!;
|
||||
await box1.close();
|
||||
var box1File = File(path);
|
||||
|
||||
await hive.deleteBoxFromDisk('testBox1');
|
||||
expect(await box1File.exists(), false);
|
||||
expect(hive.isBoxOpen('testBox1'), false);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('does nothing if files do not exist', () async {
|
||||
var hive = await initHive();
|
||||
await hive.deleteBoxFromDisk('testBox1');
|
||||
await hive.close();
|
||||
});
|
||||
});
|
||||
|
||||
test('.deleteFromDisk()', () async {
|
||||
var hive = await initHive();
|
||||
|
||||
var box1 = await hive.openBox('testBox1');
|
||||
await box1.put('key', 'value');
|
||||
var box1File = File(box1.path!);
|
||||
|
||||
var box2 = await hive.openBox('testBox2');
|
||||
await box2.put('key', 'value');
|
||||
var box2File = File(box1.path!);
|
||||
|
||||
await hive.deleteFromDisk();
|
||||
expect(await box1File.exists(), false);
|
||||
expect(await box2File.exists(), false);
|
||||
expect(hive.isBoxOpen('testBox1'), false);
|
||||
expect(hive.isBoxOpen('testBox2'), false);
|
||||
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
group('.boxExists()', () {
|
||||
test('returns true if a box was created', () async {
|
||||
var hive = await initHive();
|
||||
await hive.openBox('testBox1');
|
||||
expect(await hive.boxExists('testBox1'), true);
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('returns false if no box was created', () async {
|
||||
var hive = await initHive();
|
||||
expect(await hive.boxExists('testBox1'), false);
|
||||
await hive.close();
|
||||
});
|
||||
|
||||
test('returns false if box was created and then deleted', () async {
|
||||
var hive = await initHive();
|
||||
await hive.openBox('testBox1');
|
||||
await hive.deleteBoxFromDisk('testBox1');
|
||||
expect(await hive.boxExists('testBox1'), false);
|
||||
await hive.close();
|
||||
});
|
||||
});
|
||||
|
||||
group('.resetAdapters()', () {
|
||||
test('returns normally', () async {
|
||||
final hive = await initHive();
|
||||
expect(hive.resetAdapters, returnsNormally);
|
||||
});
|
||||
|
||||
test('clears an adapter', () async {
|
||||
final hive = await initHive();
|
||||
final adapter = _TestAdapter(1);
|
||||
|
||||
expect(hive.isAdapterRegistered(adapter.typeId), isFalse);
|
||||
hive.registerAdapter(adapter);
|
||||
expect(hive.isAdapterRegistered(adapter.typeId), isTrue);
|
||||
|
||||
hive.resetAdapters();
|
||||
expect(hive.isAdapterRegistered(adapter.typeId), isFalse);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
import 'package:ernaehrung/helper/format_helper.dart';
|
||||
import 'package:ernaehrung/models/food.dart';
|
||||
import 'package:ernaehrung/pages/nav_pages/subpages/progress_page/sub_components/charts/sub_components/tabs/timespan_tabs.dart';
|
||||
import 'package:ernaehrung/services/statistics.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
// TO RUN TESTS COMMENT initBoxes() (services/statistics.dart line 21) out -> HIVE behavior is tested in other tests
|
||||
|
||||
late DataService dataService;
|
||||
Future<void> main() async {
|
||||
await dotenv.load(fileName: ".env");
|
||||
|
||||
setUp(() async {
|
||||
dataService = DataService.instance;
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
//await Hive.close(); // Close Hive at the end of tests
|
||||
|
||||
});
|
||||
|
||||
getTimestampFromNow(){
|
||||
DateTime now = DateTime.now();
|
||||
return now.millisecondsSinceEpoch.toInt() ~/ 1000;
|
||||
}
|
||||
|
||||
getTimeStampForDateTime(DateTime date){
|
||||
return date.millisecondsSinceEpoch.toInt() ~/ 1000;
|
||||
}
|
||||
|
||||
getFoodListValid(){
|
||||
// 1500kcal
|
||||
return [
|
||||
Food(167511, "Testfood","",300,0,0,0,0,0),
|
||||
Food(167512, "TestfoodTestfoodTestfoodTestfood","",300,0,0,0,0,0),
|
||||
Food(167512, "","",300,0,0,0,0,0),
|
||||
Food(167512, "","",300,0,0,0,0,0),
|
||||
Food(167512, "","",300,0,0,0,0,0)
|
||||
];
|
||||
}
|
||||
|
||||
getInvalidFoodList(){
|
||||
return [
|
||||
Food(167512, "","",300,0,0,0,0,0),
|
||||
Food(167512, "","",300,0,0,0,0,0),
|
||||
Food(167512, "","",300,0,0,0,0,0),
|
||||
Food(167512, "","","300",0,0,0,0,0),
|
||||
Food(167512, "","",-200,0,0,0,0,0)
|
||||
];
|
||||
}
|
||||
|
||||
test('check if given timestamp returns valid timespan or catches invalid timestamp', () {
|
||||
List<int> day = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.day,getTimestampFromNow());
|
||||
expect(31, day.length);
|
||||
List<int> week = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.week,getTimestampFromNow());
|
||||
expect(7, week.length);
|
||||
List<int> month = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.month,getTimestampFromNow());
|
||||
expect(31, month.length);
|
||||
List<int> invalidTimestamp = dataService.getTimestampsByTimestampAndTimespan(TimeSpan.month,9999999999999);
|
||||
expect(0, invalidTimestamp.length);
|
||||
});
|
||||
|
||||
test('check if dates are returned correctly from timestamp', () {
|
||||
int day = dataService.getDayAsIntFromTimestamp(getTimestampFromNow());
|
||||
expect(DateTime.now().day, day);
|
||||
int month = dataService.getMonthAsIntFromTimestamp(getTimestampFromNow());
|
||||
expect(DateTime.now().month, month);
|
||||
int year = dataService.getYearAsIntFromTimestamp(getTimestampFromNow());
|
||||
expect(DateTime.now().year, year);
|
||||
});
|
||||
|
||||
test('check if date comparison is right', () {
|
||||
int today = getTimestampFromNow();
|
||||
expect(true,dataService.isDateEqual(today, today));
|
||||
int other = getTimeStampForDateTime(DateTime.utc(2010));
|
||||
expect(false,dataService.isDateEqual(today, other));
|
||||
expect(false,dataService.isDateEqual(9999999999999, today));
|
||||
expect(false,dataService.isDateEqual(other, 9999999999999));
|
||||
expect(false,dataService.isDateEqual(other, -1));
|
||||
expect(false,dataService.isDateEqual(other, 0));
|
||||
});
|
||||
|
||||
test('check if calories are summed up correctly for given food list',() {
|
||||
expect(1500, dataService.getSumOfCaloriesByFoodList(getFoodListValid()));
|
||||
expect(() => dataService.getSumOfCaloriesByFoodList(getInvalidFoodList()),throwsException);
|
||||
});
|
||||
|
||||
test('check if format helper are working right',() {
|
||||
expect(2,getListOfDistinctElements(getFoodListValid()).length);
|
||||
expect(3,getMapOfDistinctElementsWithCounterAndCalories(getFoodListValid()).keys.length);
|
||||
expect("Testfood",getToastFoodNameString(getFoodListValid()[0],null));
|
||||
expect("TestfoodTestfoodTestfo ...",getToastFoodNameString(getFoodListValid()[1],null));
|
||||
Food food = getFoodListValid()[0];
|
||||
expect("Testfood 2 x 600 kcal", getFoodListStringByFood(food.name, 2, 600,null));
|
||||
});
|
||||
|
||||
}
|
Loading…
Reference in New Issue