initial commit

This commit is contained in:
Utsav Ghimire
2023-03-02 11:06:39 +05:45
commit 769527862b
172 changed files with 8680 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,734 @@
{
"configVersion": 2,
"packages": [
{
"name": "_fe_analyzer_shared",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-47.0.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "analyzer",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/analyzer-4.7.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "args",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/args-2.3.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "async",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/async-2.9.0",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "auto_route",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/auto_route-5.0.4",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "auto_route_generator",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/auto_route_generator-5.0.2",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "boolean_selector",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "build",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build-2.3.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "build_config",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_config-1.1.1",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "build_daemon",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.1.0",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "build_resolvers",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.10",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "build_runner",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.0",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "build_runner_core",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.2.6",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "built_collection",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "built_value",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "characters",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/characters-1.2.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "checked_yaml",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "clock",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/clock-1.1.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "code_builder",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/code_builder-4.3.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "collection",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "connectivity_plus",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "connectivity_plus_linux",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "connectivity_plus_macos",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "connectivity_plus_platform_interface",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_platform_interface-1.2.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "connectivity_plus_web",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "connectivity_plus_windows",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "convert",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/convert-3.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "coverage",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/coverage-1.6.1",
"packageUri": "lib/",
"languageVersion": "2.15"
},
{
"name": "crypto",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "cupertino_icons",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.5",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "dart_style",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.4",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "dartz",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dartz-0.10.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "dbus",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dbus-0.7.8",
"packageUri": "lib/",
"languageVersion": "2.15"
},
{
"name": "diff_match_patch",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/diff_match_patch-0.4.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "dio",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dio-4.0.6",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "equatable",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.5",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "fake_async",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "ffi",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/ffi-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "file",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/file-6.1.4",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "fixnum",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "flutter",
"rootUri": "file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "flutter_lints",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/flutter_lints-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "flutter_riverpod",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/flutter_riverpod-2.0.2",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "flutter_test",
"rootUri": "file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter_test",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "flutter_web_plugins",
"rootUri": "file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter_web_plugins",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "freezed",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/freezed-2.2.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "freezed_annotation",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/freezed_annotation-2.2.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "frontend_server_client",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "glob",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0",
"packageUri": "lib/",
"languageVersion": "2.15"
},
{
"name": "graphs",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/graphs-2.2.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "http_mock_adapter",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_mock_adapter-0.3.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "http_multi_server",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.2.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "http_parser",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "io",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/io-1.0.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "js",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/js-0.6.4",
"packageUri": "lib/",
"languageVersion": "2.16"
},
{
"name": "json_annotation",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.7.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "json_serializable",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/json_serializable-6.5.3",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "lcov_dart",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/lcov_dart-7.0.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "lints",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/lints-2.0.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "logging",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/logging-1.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "matcher",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.12",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "material_color_utilities",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.5",
"packageUri": "lib/",
"languageVersion": "2.13"
},
{
"name": "meta",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/meta-1.8.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "mime",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mime-1.0.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "mockito",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.2",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "mocktail",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mocktail-0.3.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "nm",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/nm-0.5.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "node_preamble",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "package_config",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "path",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path-1.8.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "path_provider_linux",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "path_provider_platform_interface",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.5",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "path_provider_windows",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "petitparser",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/petitparser-5.0.0",
"packageUri": "lib/",
"languageVersion": "2.16"
},
{
"name": "platform",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/platform-3.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "plugin_platform_interface",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "pool",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pool-1.5.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "process",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/process-4.2.4",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "pub_semver",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "pubspec_parse",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.2.1",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "riverpod",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/riverpod-2.0.2",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "shared_preferences",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "shared_preferences_android",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "shared_preferences_foundation",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "shared_preferences_linux",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "shared_preferences_platform_interface",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "shared_preferences_web",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "shared_preferences_windows",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "shelf",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf-1.4.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "shelf_packages_handler",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.1",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "shelf_static",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.1",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "shelf_web_socket",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.2",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "sky_engine",
"rootUri": "file:///Users/theutsavg/Downloads/sdk/flutter/bin/cache/pkg/sky_engine",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "source_gen",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.6",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "source_helper",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_helper-1.3.3",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "source_map_stack_trace",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "source_maps",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.11",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "source_span",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_span-1.9.0",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "stack_trace",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "state_notifier",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/state_notifier-0.7.2+1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "state_notifier_test",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/state_notifier_test-0.0.9",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "stream_channel",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "stream_transform",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "string_scanner",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "term_glyph",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "test",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test-1.21.4",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "test_api",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.12",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "test_core",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.16",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "test_coverage_badge",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_coverage_badge-0.2.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "timing",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "typed_data",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "vector_math",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "vm_service",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/vm_service-9.4.0",
"packageUri": "lib/",
"languageVersion": "2.15"
},
{
"name": "watcher",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.2",
"packageUri": "lib/",
"languageVersion": "2.14"
},
{
"name": "web_socket_channel",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.2.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "webkit_inspection_protocol",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.2.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "win32",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/win32-3.1.3",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "xdg_directories",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/xdg_directories-1.0.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "xml",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/xml-6.1.0",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "yaml",
"rootUri": "file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "flutter_project",
"rootUri": "../",
"packageUri": "lib/",
"languageVersion": "2.17"
}
],
"generated": "2023-03-02T05:13:43.781981Z",
"generator": "pub",
"generatorVersion": "2.18.4"
}

View File

@ -0,0 +1,485 @@
_fe_analyzer_shared
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-47.0.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-47.0.0/lib/
analyzer
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/analyzer-4.7.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/analyzer-4.7.0/lib/
args
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/lib/
async
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/async-2.9.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/async-2.9.0/lib/
auto_route
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/auto_route-5.0.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/auto_route-5.0.4/lib/
auto_route_generator
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/auto_route_generator-5.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/auto_route_generator-5.0.2/lib/
boolean_selector
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/
build
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build-2.3.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build-2.3.1/lib/
build_config
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_config-1.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_config-1.1.1/lib/
build_daemon
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.1.0/lib/
build_resolvers
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.10/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.10/lib/
build_runner
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.0/lib/
build_runner_core
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.2.6/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.2.6/lib/
built_collection
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib/
built_value
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/lib/
characters
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/characters-1.2.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/characters-1.2.1/lib/
checked_yaml
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/
clock
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/clock-1.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/clock-1.1.1/lib/
code_builder
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/code_builder-4.3.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/code_builder-4.3.0/lib/
collection
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/lib/
connectivity_plus
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/lib/
connectivity_plus_linux
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/lib/
connectivity_plus_macos
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6/lib/
connectivity_plus_platform_interface
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_platform_interface-1.2.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_platform_interface-1.2.3/lib/
connectivity_plus_web
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/lib/
connectivity_plus_windows
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/lib/
convert
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/convert-3.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/convert-3.1.0/lib/
coverage
2.15
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/coverage-1.6.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/coverage-1.6.1/lib/
crypto
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/lib/
cupertino_icons
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.5/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.5/lib/
dart_style
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.4/lib/
dartz
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dartz-0.10.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dartz-0.10.1/lib/
dbus
2.15
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dbus-0.7.8/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dbus-0.7.8/lib/
diff_match_patch
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/diff_match_patch-0.4.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/diff_match_patch-0.4.1/lib/
dio
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dio-4.0.6/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/dio-4.0.6/lib/
equatable
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.5/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.5/lib/
fake_async
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.1/lib/
ffi
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/ffi-2.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/ffi-2.0.1/lib/
file
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/lib/
fixnum
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib/
flutter_lints
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/flutter_lints-2.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/flutter_lints-2.0.1/lib/
flutter_riverpod
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/flutter_riverpod-2.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/flutter_riverpod-2.0.2/lib/
freezed
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/freezed-2.2.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/freezed-2.2.0/lib/
freezed_annotation
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/freezed_annotation-2.2.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/freezed_annotation-2.2.0/lib/
frontend_server_client
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.3/lib/
glob
2.15
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/lib/
graphs
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/graphs-2.2.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/graphs-2.2.0/lib/
http_mock_adapter
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_mock_adapter-0.3.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_mock_adapter-0.3.3/lib/
http_multi_server
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.2.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.2.1/lib/
http_parser
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.1/lib/
io
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/
js
2.16
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/js-0.6.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/js-0.6.4/lib/
json_annotation
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.7.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.7.0/lib/
json_serializable
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/json_serializable-6.5.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/json_serializable-6.5.3/lib/
lcov_dart
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/lcov_dart-7.0.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/lcov_dart-7.0.0/lib/
lints
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/lints-2.0.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/lints-2.0.0/lib/
logging
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/logging-1.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/logging-1.1.0/lib/
matcher
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.12/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.12/lib/
material_color_utilities
2.13
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.5/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.5/lib/
meta
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/meta-1.8.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/meta-1.8.0/lib/
mime
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mime-1.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mime-1.0.2/lib/
mockito
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.2/lib/
mocktail
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mocktail-0.3.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/mocktail-0.3.0/lib/
nm
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/nm-0.5.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/nm-0.5.0/lib/
node_preamble
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/
package_config
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib/
path
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path-1.8.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path-1.8.2/lib/
path_provider_linux
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8/lib/
path_provider_platform_interface
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.5/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.5/lib/
path_provider_windows
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/lib/
petitparser
2.16
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/petitparser-5.0.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/petitparser-5.0.0/lib/
platform
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/platform-3.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/platform-3.1.0/lib/
plugin_platform_interface
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.3/lib/
pool
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pool-1.5.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pool-1.5.1/lib/
process
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/process-4.2.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/process-4.2.4/lib/
pub_semver
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.2/lib/
pubspec_parse
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.2.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.2.1/lib/
riverpod
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/riverpod-2.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/riverpod-2.0.2/lib/
shared_preferences
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17/lib/
shared_preferences_android
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15/lib/
shared_preferences_foundation
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/lib/
shared_preferences_linux
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3/lib/
shared_preferences_platform_interface
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.1.0/lib/
shared_preferences_web
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4/lib/
shared_preferences_windows
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3/lib/
shelf
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf-1.4.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf-1.4.0/lib/
shelf_packages_handler
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.1/lib/
shelf_static
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.1/lib/
shelf_web_socket
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.2/lib/
source_gen
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.6/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.6/lib/
source_helper
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_helper-1.3.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_helper-1.3.3/lib/
source_map_stack_trace
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.1/lib/
source_maps
2.18
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.11/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.11/lib/
source_span
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_span-1.9.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/source_span-1.9.0/lib/
stack_trace
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/
state_notifier
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/state_notifier-0.7.2+1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/state_notifier-0.7.2+1/lib/
state_notifier_test
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/state_notifier_test-0.0.9/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/state_notifier_test-0.0.9/lib/
stream_channel
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/
stream_transform
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.1/lib/
string_scanner
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.1/lib/
term_glyph
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.1/lib/
test
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test-1.21.4/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test-1.21.4/lib/
test_api
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.12/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.12/lib/
test_core
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.16/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.16/lib/
test_coverage_badge
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_coverage_badge-0.2.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/test_coverage_badge-0.2.0/lib/
timing
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/
typed_data
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/lib/
vector_math
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/lib/
vm_service
2.15
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/vm_service-9.4.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/vm_service-9.4.0/lib/
watcher
2.14
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.2/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.2/lib/
web_socket_channel
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.2.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.2.0/lib/
webkit_inspection_protocol
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.2.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.2.0/lib/
win32
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/win32-3.1.3/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/win32-3.1.3/lib/
xdg_directories
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/xdg_directories-1.0.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/xdg_directories-1.0.0/lib/
xml
2.17
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/xml-6.1.0/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/xml-6.1.0/lib/
yaml
2.12
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/
file:///Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/lib/
flutter_project
2.17
file:///Users/theutsavg/Desktop/fyp/riverpod_clean_arch_tdd/
file:///Users/theutsavg/Desktop/fyp/riverpod_clean_arch_tdd/lib/
sky_engine
2.12
file:///Users/theutsavg/Downloads/sdk/flutter/bin/cache/pkg/sky_engine/
file:///Users/theutsavg/Downloads/sdk/flutter/bin/cache/pkg/sky_engine/lib/
flutter
2.17
file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter/
file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter/lib/
flutter_test
2.17
file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter_test/
file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter_test/lib/
flutter_web_plugins
2.17
file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter_web_plugins/
file:///Users/theutsavg/Downloads/sdk/flutter/packages/flutter_web_plugins/lib/
2

1
.dart_tool/version Normal file
View File

@ -0,0 +1 @@
3.3.8

14
.flutter-plugins Normal file
View File

@ -0,0 +1,14 @@
# This is a generated file; do not edit or check into version control.
connectivity_plus=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/
connectivity_plus_linux=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/
connectivity_plus_macos=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6/
connectivity_plus_web=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/
connectivity_plus_windows=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/
path_provider_linux=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8/
path_provider_windows=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/
shared_preferences=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17/
shared_preferences_android=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15/
shared_preferences_foundation=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/
shared_preferences_linux=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3/
shared_preferences_web=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4/
shared_preferences_windows=/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3/

View File

@ -0,0 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/","native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8/","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3/","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"connectivity_plus_windows","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3/","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"connectivity_plus_web","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/","dependencies":[]},{"name":"shared_preferences_web","path":"/Users/theutsavg/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4/","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2023-03-02 10:58:43.875612","version":"3.3.8"}

8
README.md Normal file
View File

@ -0,0 +1,8 @@
![Coverage](coverage_badge.svg) [![HitCount](https://hits.dwyl.com/Uuttssaavv/flutter-clean-architecture-riverpod.svg?style=flat-square)](http://hits.dwyl.com/Uuttssaavv/flutter-clean-architecture-riverpod)
# Flutter Clean Architecture with Riverpod
A Flutter app that uses the "Dummy Json" api to login and fetch products.
### Content

29
analysis_options.yaml Normal file
View File

@ -0,0 +1,29 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

13
android/.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks

71
android/app/build.gradle Normal file
View File

@ -0,0 +1,71 @@
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.flutter_project"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

View File

@ -0,0 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_project">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@ -0,0 +1,34 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_project">
<application
android:label="Pokemon App"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>

View File

@ -0,0 +1,6 @@
package com.example.flutter_project
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_project">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

31
android/build.gradle Normal file
View File

@ -0,0 +1,31 @@
buildscript {
ext.kotlin_version = '1.6.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

View File

@ -0,0 +1,6 @@
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip

11
android/settings.gradle Normal file
View File

@ -0,0 +1,11 @@
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"

384
coverage/lcov.info Normal file
View File

@ -0,0 +1,384 @@
SF:lib/features/dashboard/data/datasource/dashboard_remote_datasource.dart
DA:16,2
DA:18,1
DA:21,2
DA:23,1
DA:29,1
DA:30,2
DA:31,1
DA:32,1
DA:34,1
DA:35,1
DA:43,3
DA:44,1
DA:49,1
DA:52,2
DA:53,1
DA:54,1
DA:60,1
DA:61,2
DA:62,1
DA:63,1
DA:65,1
DA:66,1
DA:74,3
DA:75,1
LF:24
LH:24
end_of_record
SF:lib/shared/domain/models/response.dart
DA:9,5
DA:11,1
DA:13,4
DA:18,2
LF:4
LH:4
end_of_record
SF:lib/shared/exceptions/http_exception.dart
DA:10,10
DA:15,1
DA:17,4
DA:22,1
DA:25,1
DA:28,1
DA:31,1
DA:32,4
DA:38,2
LF:9
LH:9
end_of_record
SF:lib/shared/domain/models/paginated_response.dart
DA:12,4
DA:15,4
DA:17,4
DA:18,4
DA:19,4
DA:22,1
DA:24,5
LF:7
LH:7
end_of_record
SF:lib/shared/domain/models/parse_response.dart
DA:6,1
DA:17,1
DA:19,1
DA:20,2
DA:21,1
DA:22,1
DA:23,1
LF:7
LH:7
end_of_record
SF:lib/shared/domain/models/product/product_model.dart
DA:24,6
LF:1
LH:1
end_of_record
SF:lib/shared/domain/models/product/product_model.g.dart
DA:9,6
DA:10,3
DA:11,3
DA:12,3
DA:13,3
DA:14,3
DA:15,3
DA:16,5
DA:18,5
DA:19,3
DA:20,3
DA:21,3
DA:22,4
DA:23,2
DA:27,1
DA:28,1
DA:29,1
DA:30,1
DA:31,1
DA:32,1
DA:33,1
DA:34,1
DA:35,1
DA:36,1
DA:37,1
DA:38,1
DA:39,1
LF:27
LH:27
end_of_record
SF:lib/shared/globals.dart
DA:3,20
LF:1
LH:1
end_of_record
SF:lib/shared/data/remote/dio_network_service.dart
DA:13,5
DA:15,5
DA:16,0
DA:18,0
DA:19,0
DA:24,2
DA:25,1
DA:26,1
DA:28,1
DA:31,1
DA:32,1
DA:37,1
DA:39,2
DA:40,1
DA:41,0
DA:46,1
DA:49,1
DA:50,3
DA:59,1
DA:62,1
DA:63,3
LF:21
LH:17
end_of_record
SF:lib/shared/mixins/exception_handler_mixin.dart
DA:12,2
DA:17,2
DA:18,2
DA:19,2
DA:20,2
DA:21,2
DA:22,2
DA:29,6
DA:30,2
DA:31,2
DA:35,2
DA:38,2
DA:40,2
DA:42,4
DA:48,2
DA:50,2
DA:51,2
LF:17
LH:17
end_of_record
SF:lib/shared/domain/models/user/user_model.dart
DA:13,5
DA:25,1
DA:26,1
DA:27,1
DA:28,1
DA:29,1
DA:30,1
DA:31,1
DA:32,1
DA:33,1
DA:34,1
DA:35,1
DA:38,3
DA:39,3
DA:40,3
DA:41,3
DA:42,3
DA:43,3
DA:44,3
DA:45,3
DA:46,3
DA:47,3
DA:48,3
DA:52,10
DA:53,5
DA:54,5
DA:55,5
DA:56,5
DA:57,5
DA:58,5
DA:59,5
DA:60,5
DA:61,5
DA:64,1
DA:75,1
DA:76,1
DA:77,1
DA:78,1
DA:79,1
DA:80,1
DA:81,1
DA:82,1
DA:83,1
DA:84,1
LF:44
LH:44
end_of_record
SF:lib/features/dashboard/data/repositories/dashboard_repository.dart
DA:9,2
DA:11,1
DA:14,2
DA:17,1
DA:20,2
LF:5
LH:5
end_of_record
SF:lib/features/dashboard/domain/providers/dashboard_providers.dart
DA:8,2
DA:9,1
DA:10,2
DA:13,4
DA:14,2
DA:15,3
DA:16,1
LF:7
LH:7
end_of_record
SF:lib/shared/domain/providers/dio_network_service_provider.dart
DA:5,9
DA:6,3
DA:7,3
DA:8,3
LF:4
LH:4
end_of_record
SF:lib/features/dashboard/presentation/providers/state/dashboard_notifier.dart
DA:13,1
DA:15,1
DA:16,1
DA:17,6
DA:18,1
DA:19,4
DA:20,3
DA:21,3
DA:25,5
DA:27,1
DA:29,3
DA:37,1
DA:38,4
DA:39,3
DA:40,3
DA:44,2
DA:45,3
DA:49,1
DA:51,3
DA:59,1
DA:60,2
DA:61,3
DA:63,1
DA:66,1
DA:67,5
DA:69,4
DA:71,3
DA:73,3
DA:77,1
DA:78,2
DA:79,1
DA:85,1
DA:86,1
LF:33
LH:33
end_of_record
SF:lib/features/dashboard/presentation/providers/state/dashboard_state.dart
DA:22,4
DA:32,3
DA:42,2
DA:51,2
DA:52,1
DA:53,2
DA:54,2
DA:55,2
DA:56,2
DA:57,1
DA:58,1
DA:62,1
DA:64,9
DA:67,1
DA:68,6
LF:15
LH:15
end_of_record
SF:lib/features/authentication/data/datasource/auth_remote_data_source.dart
DA:13,2
DA:15,1
DA:18,2
DA:20,1
DA:22,1
DA:23,1
DA:24,1
DA:26,1
DA:27,2
DA:29,2
DA:30,2
DA:33,1
DA:37,1
DA:38,1
DA:41,2
LF:15
LH:15
end_of_record
SF:lib/features/authentication/data/repositories/atuhentication_repository_impl.dart
DA:10,2
DA:12,1
DA:14,2
LF:3
LH:3
end_of_record
SF:lib/features/authentication/domain/providers/login_provider.dart
DA:8,2
DA:9,1
DA:10,2
DA:13,3
DA:14,1
DA:15,2
DA:17,3
DA:18,1
LF:8
LH:8
end_of_record
SF:lib/features/authentication/presentation/providers/state/auth_notifier.dart
DA:12,1
DA:15,1
DA:17,1
DA:18,1
DA:19,2
DA:20,1
DA:23,2
DA:24,2
DA:25,1
DA:26,2
DA:30,2
LF:11
LH:11
end_of_record
SF:lib/shared/data/local/shared_prefs_storage_service.dart
DA:12,1
DA:14,3
DA:17,1
DA:18,1
DA:20,1
DA:22,3
DA:23,2
DA:26,1
DA:28,3
DA:29,2
DA:32,1
DA:34,3
DA:35,2
DA:38,1
DA:40,3
DA:41,2
DA:44,1
DA:46,3
DA:47,3
LF:19
LH:19
end_of_record
SF:lib/services/user_cache_service/data/datasource/user_local_datasource.dart
DA:19,1
DA:23,1
DA:26,1
DA:28,3
DA:30,1
DA:31,1
DA:38,2
DA:40,2
DA:43,1
DA:45,5
DA:48,1
DA:50,3
DA:53,1
DA:55,3
LF:14
LH:14
end_of_record

20
coverage_badge.svg Normal file
View File

@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="94" height="20">
<linearGradient id="b" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<clipPath id="a">
<rect width="94" height="20" rx="3" fill="#fff"/>
</clipPath>
<g clip-path="url(#a)">
<path fill="#555" d="M0 0h59v20H0z"/>
<path fill="#4ccb0f" d="M59 0h35v20H59z"/>
<path fill="url(#b)" d="M0 0h94v20H0z"/>
</g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
<text x="305" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="490">coverage</text>
<text x="305" y="140" transform="scale(.1)" textLength="490">coverage</text>
<text x="755" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">98%</text>
<text x="755" y="140" transform="scale(.1)" textLength="250">98%</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

199
folder_structure.md Normal file
View File

@ -0,0 +1,199 @@
```
lib
┣ configs
┃ ┗ app_configs.dart
┣ features
┃ ┣ authentication
┃ ┃ ┣ data
┃ ┃ ┃ ┣ datasource
┃ ┃ ┃ ┃ ┣ auth_local_data_source.dart
┃ ┃ ┃ ┃ ┗ auth_remote_data_source.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ atuhentication_repository_impl.dart
┃ ┃ ┣ domain
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ login_provider.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ auth_repository.dart
┃ ┃ ┗ presentation
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┣ state
┃ ┃ ┃ ┃ ┃ ┣ auth_notifier.dart
┃ ┃ ┃ ┃ ┃ ┣ auth_state.dart
┃ ┃ ┃ ┃ ┃ ┗ auth_state.freezed.dart
┃ ┃ ┃ ┃ ┗ auth_providers.dart
┃ ┃ ┃ ┣ screens
┃ ┃ ┃ ┃ ┗ login_screen.dart
┃ ┃ ┃ ┗ widgets
┃ ┃ ┃ ┃ ┣ auth_field.dart
┃ ┃ ┃ ┃ ┗ button.dart
┃ ┣ dashboard
┃ ┃ ┣ data
┃ ┃ ┃ ┣ datasource
┃ ┃ ┃ ┃ ┣ dashboard_local_datasource.dart
┃ ┃ ┃ ┃ ┗ dashboard_remote_datasource.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ dashboard_repository.dart
┃ ┃ ┣ domain
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ dashboard_providers.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ dashboard_repository.dart
┃ ┃ ┗ presentation
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┣ state
┃ ┃ ┃ ┃ ┃ ┣ dashboard_notifier.dart
┃ ┃ ┃ ┃ ┃ ┗ dashboard_state.dart
┃ ┃ ┃ ┃ ┗ dashboard_state_provider.dart
┃ ┃ ┃ ┣ screens
┃ ┃ ┃ ┃ ┗ dashboard_screen.dart
┃ ┃ ┃ ┗ widgets
┃ ┗ .DS_Store
┣ main
┃ ┣ app.dart
┃ ┣ app_env.dart
┃ ┣ main_dev.dart
┃ ┣ main_staging.dart
┃ ┗ observers.dart
┣ routes
┃ ┣ app_route.dart
┃ ┗ app_route.gr.dart
┣ services
┃ ┣ other_service
┃ ┗ user_cache_service
┃ ┃ ┣ data
┃ ┃ ┃ ┣ datasource
┃ ┃ ┃ ┃ ┗ user_local_datasource.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ user_repository_impl.dart
┃ ┃ ┣ domain
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ user_cache_provider.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ user_cache_repository.dart
┃ ┃ ┗ presentation
┃ ┃ ┃ ┗ .gitkeep
┣ shared
┃ ┣ data
┃ ┃ ┣ local
┃ ┃ ┃ ┣ shared_prefs_storage_service.dart
┃ ┃ ┃ ┗ storage_service.dart
┃ ┃ ┗ remote
┃ ┃ ┃ ┣ dio_network_service.dart
┃ ┃ ┃ ┣ network_service.dart
┃ ┃ ┃ ┗ remote.dart
┃ ┣ domain
┃ ┃ ┣ models
┃ ┃ ┃ ┣ product
┃ ┃ ┃ ┃ ┣ product_model.dart
┃ ┃ ┃ ┃ ┣ product_model.freezed.dart
┃ ┃ ┃ ┃ ┗ product_model.g.dart
┃ ┃ ┃ ┣ user
┃ ┃ ┃ ┃ ┗ user_model.dart
┃ ┃ ┃ ┣ models.dart
┃ ┃ ┃ ┣ paginated_response.dart
┃ ┃ ┃ ┣ parse_response.dart
┃ ┃ ┃ ┗ response.dart
┃ ┃ ┗ providers
┃ ┃ ┃ ┣ dio_network_service_provider.dart
┃ ┃ ┃ ┗ sharedpreferences_storage_service_provider.dart
┃ ┣ exceptions
┃ ┃ ┗ http_exception.dart
┃ ┣ mixins
┃ ┃ ┗ exception_handler_mixin.dart
┃ ┣ theme
┃ ┃ ┣ app_colors.dart
┃ ┃ ┣ app_theme.dart
┃ ┃ ┣ test_styles.dart
┃ ┃ ┗ text_theme.dart
┃ ┣ widgets
┃ ┃ ┣ app_error.dart
┃ ┃ ┗ app_loading.dart
┃ ┗ globals.dart
┣ .DS_Store
┣ main.dart
┗ splash_screen.dart
```
Test
```
test
┣ features
┃ ┣ authentication
┃ ┃ ┣ data
┃ ┃ ┃ ┣ datasource
┃ ┃ ┃ ┃ ┣ auth_local_data_source_test.dart
┃ ┃ ┃ ┃ ┗ auth_remote_data_source_test.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ atuhentication_repository_impl_test.dart
┃ ┃ ┣ domain
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ providers_test.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ .gitkeep
┃ ┃ ┗ presentation
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ auth_providers_test.dart
┃ ┃ ┃ ┗ screens
┃ ┃ ┃ ┃ ┗ .gitkeep
┃ ┗ dashboard
┃ ┃ ┣ data
┃ ┃ ┃ ┣ datasource
┃ ┃ ┃ ┃ ┣ dashboard_local_datasource_test.dart
┃ ┃ ┃ ┃ ┗ dashboard_remote_datasource_test.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ dashboard_repository_test.dart
┃ ┃ ┣ domain
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ dashboard_provider_test.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ .gitkeep
┃ ┃ ┗ presentation
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┣ state
┃ ┃ ┃ ┃ ┃ ┗ dashboard_state_test.dart
┃ ┃ ┃ ┃ ┗ dashboard_provider_test.dart
┃ ┃ ┃ ┗ screens
┣ fixtures
┃ ┣ dashboard
┃ ┃ ┗ dummy_productlist.dart
┃ ┣ data
┃ ┃ ┣ product_response.dart
┃ ┃ ┗ user_map.dart
┃ ┣ dummy_data.dart
┃ ┣ test_fixture.dart
┃ ┗ user_response.json
┣ services
┃ ┗ user_cache_service
┃ ┃ ┣ data
┃ ┃ ┃ ┣ datasource
┃ ┃ ┃ ┃ ┗ user_local_datasource_test.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ user_cache_repository_test.dart
┃ ┃ ┣ domain
┃ ┃ ┃ ┣ providers
┃ ┃ ┃ ┃ ┗ user_cache_provider_test.dart
┃ ┃ ┃ ┗ repositories
┃ ┃ ┃ ┃ ┗ user_cache_repository_test.dart
┃ ┃ ┗ presentation
┃ ┃ ┃ ┗ .gitkeep
┗ shared
┃ ┣ data
┃ ┃ ┣ local
┃ ┃ ┃ ┗ sharedpreferences_storage_service_test.dart
┃ ┃ ┗ remote
┃ ┃ ┃ ┗ dio_network_service_test.dart
┃ ┣ domain
┃ ┃ ┣ models
┃ ┃ ┃ ┣ product
┃ ┃ ┃ ┃ ┗ product_model_test.dart
┃ ┃ ┃ ┣ user
┃ ┃ ┃ ┃ ┗ user_model_test.dart
┃ ┃ ┃ ┗ response_test.dart
┃ ┃ ┗ providers
┃ ┃ ┃ ┗ providers_test.dart
┃ ┣ exceptions
┃ ┃ ┗ http_exception_test.dart
┃ ┗ mixins
┃ ┃ ┗ exception_handler_mixin_test.dart
```

3
gencov.sh Normal file
View File

@ -0,0 +1,3 @@
flutter test --coverage
genhtml coverage/lcov.info --output=coverage/html
open coverage/html/index.html

7
git.sh Normal file
View File

@ -0,0 +1,7 @@
`echo "${2}"`==''
files=`echo "${2}"`
commitmessage=`echo "$1"`
echo "(${files}) ${commitmessage}"
# git add "${files}"
# git commit -m "${commitmessage}"

34
ios/.gitignore vendored Normal file
View File

@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
</dict>
</plist>

View File

@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

View File

@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

41
ios/Podfile Normal file
View File

@ -0,0 +1,41 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

36
ios/Podfile.lock Normal file
View File

@ -0,0 +1,36 @@
PODS:
- connectivity_plus (0.0.1):
- Flutter
- ReachabilitySwift
- Flutter (1.0.0)
- ReachabilitySwift (5.0.0)
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
DEPENDENCIES:
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- Flutter (from `Flutter`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
SPEC REPOS:
trunk:
- ReachabilitySwift
EXTERNAL SOURCES:
connectivity_plus:
:path: ".symlinks/plugins/connectivity_plus/ios"
Flutter:
:path: Flutter
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
SPEC CHECKSUMS:
connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
COCOAPODS: 1.11.3

View File

@ -0,0 +1,552 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
9C46A2EB8E7B63BBE610CD07 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCCC976418917AC9046FD7E6 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3616A74B84D9630B9664DC62 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CF74315B6964B0489BEDAE45 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
DCCC976418917AC9046FD7E6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EE7C2BB73AD41827DDE97E81 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9C46A2EB8E7B63BBE610CD07 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
7B0684A96D86C69F0FAFED03 /* Frameworks */ = {
isa = PBXGroup;
children = (
DCCC976418917AC9046FD7E6 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
B9375DDA9819931C746EDD17 /* Pods */,
7B0684A96D86C69F0FAFED03 /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
B9375DDA9819931C746EDD17 /* Pods */ = {
isa = PBXGroup;
children = (
EE7C2BB73AD41827DDE97E81 /* Pods-Runner.debug.xcconfig */,
CF74315B6964B0489BEDAE45 /* Pods-Runner.release.xcconfig */,
3616A74B84D9630B9664DC62 /* Pods-Runner.profile.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
DFF83F85265E2AA01E3CC4DF /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
C81226972DE2E551D47128CF /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
C81226972DE2E551D47128CF /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
DFF83F85265E2AA01E3CC4DF /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 66R5J68629;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 66R5J68629;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 66R5J68629;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@ -0,0 +1,13 @@
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

View File

@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

View File

@ -0,0 +1,5 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

49
ios/Runner/Info.plist Normal file
View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Flutter Project</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>flutter_project</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1 @@
#import "GeneratedPluginRegistrant.h"

View File

@ -0,0 +1,3 @@
class AppConfigs {
static String baseUrl = 'https://dummyjson.com';
}

View File

@ -0,0 +1,46 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/shared/data/remote/remote.dart';
import 'package:flutter_project/shared/domain/models/models.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
abstract class LoginUserDataSource {
Future<Either<AppException, User>> loginUser({required User user});
}
class LoginUserRemoteDataSource implements LoginUserDataSource {
final NetworkService networkService;
LoginUserRemoteDataSource(this.networkService);
@override
Future<Either<AppException, User>> loginUser({required User user}) async {
try {
final eitherType = await networkService.post(
'/auth/login',
data: user.toJson(),
);
return eitherType.fold(
(exception) {
return Left(exception);
},
(response) {
final user = User.fromJson(response.data);
// update the token for requests
networkService.updateHeader(
{'Authorization': user.token},
);
return Right(user);
},
);
} catch (e) {
return Left(
AppException(
message: 'Unknown error occured',
statusCode: 1,
identifier: '${e.toString()}\nLoginUserRemoteDataSource.loginUser',
),
);
}
}
}

View File

@ -0,0 +1,16 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/features/authentication/data/datasource/auth_remote_data_source.dart';
import 'package:flutter_project/features/authentication/domain/repositories/auth_repository.dart';
import 'package:flutter_project/shared/domain/models/user/user_model.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
class AuthenticationRepositoryImpl extends AuthenticationRepository {
final LoginUserDataSource dataSource;
AuthenticationRepositoryImpl(this.dataSource);
@override
Future<Either<AppException, User>> loginUser({required User user}) {
return dataSource.loginUser(user: user);
}
}

View File

@ -0,0 +1,20 @@
import 'package:flutter_project/features/authentication/data/datasource/auth_remote_data_source.dart';
import 'package:flutter_project/features/authentication/data/repositories/atuhentication_repository_impl.dart';
import 'package:flutter_project/features/authentication/domain/repositories/auth_repository.dart';
import 'package:flutter_project/shared/data/remote/remote.dart';
import 'package:flutter_project/shared/domain/providers/dio_network_service_provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final authdataSourceProvider =
Provider.family<LoginUserDataSource, NetworkService>(
(_, networkService) => LoginUserRemoteDataSource(networkService),
);
final authRepositoryProvider = Provider<AuthenticationRepository>(
(ref) {
final NetworkService networkService = ref.watch(netwokServiceProvider);
final LoginUserDataSource dataSource =
ref.watch(authdataSourceProvider(networkService));
return AuthenticationRepositoryImpl(dataSource);
},
);

View File

@ -0,0 +1,7 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/shared/domain/models/models.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
abstract class AuthenticationRepository {
Future<Either<AppException, User>> loginUser({required User user});
}

View File

@ -0,0 +1,21 @@
import 'package:flutter_project/features/authentication/domain/providers/login_provider.dart';
import 'package:flutter_project/features/authentication/domain/repositories/auth_repository.dart';
import 'package:flutter_project/features/authentication/presentation/providers/state/auth_notifier.dart';
import 'package:flutter_project/features/authentication/presentation/providers/state/auth_state.dart';
import 'package:flutter_project/services/user_cache_service/domain/providers/user_cache_provider.dart';
import 'package:flutter_project/services/user_cache_service/domain/repositories/user_cache_repository.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final authStateNotifierProvider =
StateNotifierProvider<AuthNotifier, AuthState>(
(ref) {
final AuthenticationRepository authenticationRepository =
ref.watch(authRepositoryProvider);
final UserRepository userRepository =
ref.watch(userLocalRepositoryProvider);
return AuthNotifier(
authRepository: authenticationRepository,
userRepository: userRepository,
);
},
);

View File

@ -0,0 +1,34 @@
import 'package:flutter_project/features/authentication/domain/repositories/auth_repository.dart';
import 'package:flutter_project/features/authentication/presentation/providers/state/auth_state.dart';
import 'package:flutter_project/services/user_cache_service/domain/repositories/user_cache_repository.dart';
import 'package:flutter_project/shared/domain/models/user/user_model.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class AuthNotifier extends StateNotifier<AuthState> {
final AuthenticationRepository authRepository;
final UserRepository userRepository;
AuthNotifier({
required this.authRepository,
required this.userRepository,
}) : super(const AuthState.initial());
Future<void> loginUser(String username, String password) async {
state = const AuthState.loading();
final response = await authRepository.loginUser(
user: User(username: username, password: password),
);
state = await response.fold(
(failure) => AuthState.failure(failure),
(user) async {
final hasSavedUser = await userRepository.saveUser(user: user);
if (hasSavedUser) {
return const AuthState.success();
}
return AuthState.failure(CacheFailureException());
},
);
}
}

View File

@ -0,0 +1,12 @@
import 'package:flutter_project/shared/exceptions/http_exception.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'auth_state.freezed.dart';
@freezed
abstract class AuthState with _$AuthState {
const factory AuthState.initial() = Initial;
const factory AuthState.loading() = Loading;
const factory AuthState.failure(AppException exception) = Failure;
const factory AuthState.success() = Success;
}

View File

@ -0,0 +1,566 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'auth_state.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
/// @nodoc
mixin _$AuthState {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(AppException exception) failure,
required TResult Function() success,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(AppException exception)? failure,
TResult? Function()? success,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(AppException exception)? failure,
TResult Function()? success,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Loading value) loading,
required TResult Function(Failure value) failure,
required TResult Function(Success value) success,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(Initial value)? initial,
TResult? Function(Loading value)? loading,
TResult? Function(Failure value)? failure,
TResult? Function(Success value)? success,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Loading value)? loading,
TResult Function(Failure value)? failure,
TResult Function(Success value)? success,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $AuthStateCopyWith<$Res> {
factory $AuthStateCopyWith(AuthState value, $Res Function(AuthState) then) =
_$AuthStateCopyWithImpl<$Res, AuthState>;
}
/// @nodoc
class _$AuthStateCopyWithImpl<$Res, $Val extends AuthState>
implements $AuthStateCopyWith<$Res> {
_$AuthStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
}
/// @nodoc
abstract class _$$InitialCopyWith<$Res> {
factory _$$InitialCopyWith(_$Initial value, $Res Function(_$Initial) then) =
__$$InitialCopyWithImpl<$Res>;
}
/// @nodoc
class __$$InitialCopyWithImpl<$Res>
extends _$AuthStateCopyWithImpl<$Res, _$Initial>
implements _$$InitialCopyWith<$Res> {
__$$InitialCopyWithImpl(_$Initial _value, $Res Function(_$Initial) _then)
: super(_value, _then);
}
/// @nodoc
class _$Initial implements Initial {
const _$Initial();
@override
String toString() {
return 'AuthState.initial()';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$Initial);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(AppException exception) failure,
required TResult Function() success,
}) {
return initial();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(AppException exception)? failure,
TResult? Function()? success,
}) {
return initial?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(AppException exception)? failure,
TResult Function()? success,
required TResult orElse(),
}) {
if (initial != null) {
return initial();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Loading value) loading,
required TResult Function(Failure value) failure,
required TResult Function(Success value) success,
}) {
return initial(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(Initial value)? initial,
TResult? Function(Loading value)? loading,
TResult? Function(Failure value)? failure,
TResult? Function(Success value)? success,
}) {
return initial?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Loading value)? loading,
TResult Function(Failure value)? failure,
TResult Function(Success value)? success,
required TResult orElse(),
}) {
if (initial != null) {
return initial(this);
}
return orElse();
}
}
abstract class Initial implements AuthState {
const factory Initial() = _$Initial;
}
/// @nodoc
abstract class _$$LoadingCopyWith<$Res> {
factory _$$LoadingCopyWith(_$Loading value, $Res Function(_$Loading) then) =
__$$LoadingCopyWithImpl<$Res>;
}
/// @nodoc
class __$$LoadingCopyWithImpl<$Res>
extends _$AuthStateCopyWithImpl<$Res, _$Loading>
implements _$$LoadingCopyWith<$Res> {
__$$LoadingCopyWithImpl(_$Loading _value, $Res Function(_$Loading) _then)
: super(_value, _then);
}
/// @nodoc
class _$Loading implements Loading {
const _$Loading();
@override
String toString() {
return 'AuthState.loading()';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$Loading);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(AppException exception) failure,
required TResult Function() success,
}) {
return loading();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(AppException exception)? failure,
TResult? Function()? success,
}) {
return loading?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(AppException exception)? failure,
TResult Function()? success,
required TResult orElse(),
}) {
if (loading != null) {
return loading();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Loading value) loading,
required TResult Function(Failure value) failure,
required TResult Function(Success value) success,
}) {
return loading(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(Initial value)? initial,
TResult? Function(Loading value)? loading,
TResult? Function(Failure value)? failure,
TResult? Function(Success value)? success,
}) {
return loading?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Loading value)? loading,
TResult Function(Failure value)? failure,
TResult Function(Success value)? success,
required TResult orElse(),
}) {
if (loading != null) {
return loading(this);
}
return orElse();
}
}
abstract class Loading implements AuthState {
const factory Loading() = _$Loading;
}
/// @nodoc
abstract class _$$FailureCopyWith<$Res> {
factory _$$FailureCopyWith(_$Failure value, $Res Function(_$Failure) then) =
__$$FailureCopyWithImpl<$Res>;
@useResult
$Res call({AppException exception});
}
/// @nodoc
class __$$FailureCopyWithImpl<$Res>
extends _$AuthStateCopyWithImpl<$Res, _$Failure>
implements _$$FailureCopyWith<$Res> {
__$$FailureCopyWithImpl(_$Failure _value, $Res Function(_$Failure) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? exception = null,
}) {
return _then(_$Failure(
null == exception
? _value.exception
: exception // ignore: cast_nullable_to_non_nullable
as AppException,
));
}
}
/// @nodoc
class _$Failure implements Failure {
const _$Failure(this.exception);
@override
final AppException exception;
@override
String toString() {
return 'AuthState.failure(exception: $exception)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$Failure &&
(identical(other.exception, exception) ||
other.exception == exception));
}
@override
int get hashCode => Object.hash(runtimeType, exception);
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$FailureCopyWith<_$Failure> get copyWith =>
__$$FailureCopyWithImpl<_$Failure>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(AppException exception) failure,
required TResult Function() success,
}) {
return failure(exception);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(AppException exception)? failure,
TResult? Function()? success,
}) {
return failure?.call(exception);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(AppException exception)? failure,
TResult Function()? success,
required TResult orElse(),
}) {
if (failure != null) {
return failure(exception);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Loading value) loading,
required TResult Function(Failure value) failure,
required TResult Function(Success value) success,
}) {
return failure(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(Initial value)? initial,
TResult? Function(Loading value)? loading,
TResult? Function(Failure value)? failure,
TResult? Function(Success value)? success,
}) {
return failure?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Loading value)? loading,
TResult Function(Failure value)? failure,
TResult Function(Success value)? success,
required TResult orElse(),
}) {
if (failure != null) {
return failure(this);
}
return orElse();
}
}
abstract class Failure implements AuthState {
const factory Failure(final AppException exception) = _$Failure;
AppException get exception;
@JsonKey(ignore: true)
_$$FailureCopyWith<_$Failure> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$SuccessCopyWith<$Res> {
factory _$$SuccessCopyWith(_$Success value, $Res Function(_$Success) then) =
__$$SuccessCopyWithImpl<$Res>;
}
/// @nodoc
class __$$SuccessCopyWithImpl<$Res>
extends _$AuthStateCopyWithImpl<$Res, _$Success>
implements _$$SuccessCopyWith<$Res> {
__$$SuccessCopyWithImpl(_$Success _value, $Res Function(_$Success) _then)
: super(_value, _then);
}
/// @nodoc
class _$Success implements Success {
const _$Success();
@override
String toString() {
return 'AuthState.success()';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$Success);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(AppException exception) failure,
required TResult Function() success,
}) {
return success();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(AppException exception)? failure,
TResult? Function()? success,
}) {
return success?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(AppException exception)? failure,
TResult Function()? success,
required TResult orElse(),
}) {
if (success != null) {
return success();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Loading value) loading,
required TResult Function(Failure value) failure,
required TResult Function(Success value) success,
}) {
return success(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(Initial value)? initial,
TResult? Function(Loading value)? loading,
TResult? Function(Failure value)? failure,
TResult? Function(Success value)? success,
}) {
return success?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Loading value)? loading,
TResult Function(Failure value)? failure,
TResult Function(Success value)? success,
required TResult orElse(),
}) {
if (success != null) {
return success(this);
}
return orElse();
}
}
abstract class Success implements AuthState {
const factory Success() = _$Success;
}

View File

@ -0,0 +1,72 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_project/features/authentication/presentation/providers/auth_providers.dart';
import 'package:flutter_project/features/authentication/presentation/providers/state/auth_state.dart';
import 'package:flutter_project/features/authentication/presentation/widgets/auth_field.dart';
import 'package:flutter_project/routes/app_route.gr.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class LoginScreen extends ConsumerWidget {
static const routeName = '/loginScreen';
LoginScreen({Key? key}) : super(key: key);
final TextEditingController usernameController =
TextEditingController(text: 'kminchelle');
final TextEditingController passwordController =
TextEditingController(text: '0lelplR');
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(authStateNotifierProvider);
ref.listen(
authStateNotifierProvider.select((value) => value),
((previous, next) {
//show Snackbar on failure
if (next is Failure) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(next.exception.message.toString())));
} else if (next is Success) {
AutoRouter.of(context).pushAndPopUntil(const DashboardScreen(),
predicate: (_) => false);
}
}),
);
return Scaffold(
appBar: AppBar(
title: const Text('TDD with Riverpod'),
),
body: SafeArea(
child: Column(
children: [
AuthField(
hintText: 'Username',
controller: usernameController,
),
AuthField(
hintText: 'Password',
obscureText: true,
controller: passwordController,
),
state.maybeMap(
loading: (_) => const Center(child: CircularProgressIndicator()),
orElse: () => loginButton(ref),
),
],
),
),
);
}
Widget loginButton(WidgetRef ref) {
return ElevatedButton(
onPressed: () {
// validate email and password
ref.read(authStateNotifierProvider.notifier).loginUser(
usernameController.text,
passwordController.text,
);
},
child: const Text('Login'),
);
}
}

View File

@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
class AuthField extends StatelessWidget {
const AuthField({
Key? key,
required this.hintText,
this.obscureText = false,
required this.controller,
}) : super(key: key);
final String hintText;
final bool obscureText;
final TextEditingController controller;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0),
child: TextField(
key: key,
controller: controller,
obscureText: obscureText,
decoration: InputDecoration(
hintText: hintText,
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(8.0),
),
),
),
),
);
}
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,79 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/shared/data/remote/remote.dart';
import 'package:flutter_project/shared/domain/models/paginated_response.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
import 'package:flutter_project/shared/globals.dart';
abstract class DashboardDatasource {
Future<Either<AppException, PaginatedResponse>> fetchPaginatedProducts(
{required int skip});
Future<Either<AppException, PaginatedResponse>> searchPaginatedProducts(
{required int skip, required String query});
}
class DashboardRemoteDatasource extends DashboardDatasource {
final NetworkService networkService;
DashboardRemoteDatasource(this.networkService);
@override
Future<Either<AppException, PaginatedResponse>> fetchPaginatedProducts(
{required int skip}) async {
final response = await networkService.get(
'/products',
queryParameters: {
'skip': skip,
'limit': PRODUCTS_PER_PAGE,
},
);
return response.fold(
(l) => Left(l),
(r) {
final jsonData = r.data;
if (jsonData == null) {
return Left(
AppException(
identifier: 'fetchPaginatedData',
statusCode: 0,
message: 'The data is not in the valid format.',
),
);
}
final paginatedResponse =
PaginatedResponse.fromJson(jsonData, jsonData['products'] ?? []);
return Right(paginatedResponse);
},
);
}
@override
Future<Either<AppException, PaginatedResponse>> searchPaginatedProducts(
{required int skip, required String query}) async {
final response = await networkService.get(
'/products/search?q=$query',
queryParameters: {
'skip': skip,
'limit': PRODUCTS_PER_PAGE,
},
);
return response.fold(
(l) => Left(l),
(r) {
final jsonData = r.data;
if (jsonData == null) {
return Left(
AppException(
identifier: 'search PaginatedData',
statusCode: 0,
message: 'The data is not in the valid format.',
),
);
}
final paginatedResponse =
PaginatedResponse.fromJson(jsonData, jsonData['products'] ?? []);
return Right(paginatedResponse);
},
);
}
}

View File

@ -0,0 +1,23 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/features/dashboard/data/datasource/dashboard_remote_datasource.dart';
import 'package:flutter_project/features/dashboard/domain/repositories/dashboard_repository.dart';
import 'package:flutter_project/shared/domain/models/paginated_response.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
class DashboardRepositoryImpl extends DashboardRepository {
final DashboardDatasource dashboardDatasource;
DashboardRepositoryImpl(this.dashboardDatasource);
@override
Future<Either<AppException, PaginatedResponse>> fetchProducts(
{required int skip}) {
return dashboardDatasource.fetchPaginatedProducts(skip: skip);
}
@override
Future<Either<AppException, PaginatedResponse>> searchProducts(
{required int skip, required String query}) {
return dashboardDatasource.searchPaginatedProducts(
skip: skip, query: query);
}
}

View File

@ -0,0 +1,19 @@
import 'package:flutter_project/features/dashboard/data/datasource/dashboard_remote_datasource.dart';
import 'package:flutter_project/features/dashboard/data/repositories/dashboard_repository.dart';
import 'package:flutter_project/features/dashboard/domain/repositories/dashboard_repository.dart';
import 'package:flutter_project/shared/data/remote/network_service.dart';
import 'package:flutter_project/shared/domain/providers/dio_network_service_provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final dashboardDatasourceProvider =
Provider.family<DashboardDatasource, NetworkService>(
(_, networkService) => DashboardRemoteDatasource(networkService),
);
final dashboardRepositoryProvider = Provider<DashboardRepository>((ref) {
final networkService = ref.watch(netwokServiceProvider);
final datasource = ref.watch(dashboardDatasourceProvider(networkService));
final respository = DashboardRepositoryImpl(datasource);
return respository;
});

View File

@ -0,0 +1,10 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/shared/domain/models/paginated_response.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
abstract class DashboardRepository {
Future<Either<AppException, PaginatedResponse>> fetchProducts(
{required int skip});
Future<Either<AppException, PaginatedResponse>> searchProducts(
{required int skip, required String query});
}

View File

@ -0,0 +1,11 @@
//
import 'package:flutter_project/features/dashboard/domain/providers/dashboard_providers.dart';
import 'package:flutter_project/features/dashboard/presentation/providers/state/dashboard_notifier.dart';
import 'package:flutter_project/features/dashboard/presentation/providers/state/dashboard_state.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final dashboardNotifierProvider =
StateNotifierProvider<DashboardNotifier, DashboardState>((ref) {
final repository = ref.watch(dashboardRepositoryProvider);
return DashboardNotifier(repository)..fetchProducts();
});

View File

@ -0,0 +1,90 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_project/features/dashboard/domain/repositories/dashboard_repository.dart';
import 'package:flutter_project/features/dashboard/presentation/providers/state/dashboard_state.dart';
import 'package:flutter_project/shared/domain/models/paginated_response.dart';
import 'package:flutter_project/shared/domain/models/product/product_model.dart';
import 'package:flutter_project/shared/exceptions/http_exception.dart';
import 'package:flutter_project/shared/globals.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class DashboardNotifier extends StateNotifier<DashboardState> {
final DashboardRepository dashboardRepository;
DashboardNotifier(
this.dashboardRepository,
) : super(const DashboardState.initial());
bool get isFetching =>
state.state != DashboardConcreteState.loading && state.state != DashboardConcreteState.fetchingMore;
Future<void> fetchProducts() async {
if (isFetching && state.state != DashboardConcreteState.fetchedAllProducts) {
state = state.copyWith(
state: state.page > 0 ? DashboardConcreteState.fetchingMore : DashboardConcreteState.loading,
isLoading: true,
);
final response = await dashboardRepository.fetchProducts(skip: state.page * PRODUCTS_PER_PAGE);
updateStateFromResponse(response);
} else {
state = state.copyWith(
state: DashboardConcreteState.fetchedAllProducts,
message: 'No more products available',
isLoading: false,
);
}
}
Future<void> searchProducts(String query) async {
if (isFetching && state.state != DashboardConcreteState.fetchedAllProducts) {
state = state.copyWith(
state: state.page > 0 ? DashboardConcreteState.fetchingMore : DashboardConcreteState.loading,
isLoading: true,
);
final response = await dashboardRepository.searchProducts(
skip: state.page * PRODUCTS_PER_PAGE,
query: query,
);
updateStateFromResponse(response);
} else {
state = state.copyWith(
state: DashboardConcreteState.fetchedAllProducts,
message: 'No more products available',
isLoading: false,
);
}
}
void updateStateFromResponse(Either<AppException, PaginatedResponse<dynamic>> response) {
response.fold((failure) {
state = state.copyWith(
state: DashboardConcreteState.failure,
message: failure.message,
isLoading: false,
);
}, (data) {
final productList = data.data.map((e) => Product.fromJson(e)).toList();
final totalProducts = [...state.productList, ...productList];
state = state.copyWith(
productList: totalProducts,
state: totalProducts.length == data.total
? DashboardConcreteState.fetchedAllProducts
: DashboardConcreteState.loaded,
hasData: true,
message: totalProducts.isEmpty ? 'No products found' : '',
page: totalProducts.length ~/ PRODUCTS_PER_PAGE,
total: data.total,
isLoading: false,
);
});
}
void resetState() {
state = const DashboardState.initial();
}
}

View File

@ -0,0 +1,69 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:equatable/equatable.dart';
import 'package:flutter_project/shared/domain/models/product/product_model.dart';
enum DashboardConcreteState {
initial,
loading,
loaded,
failure,
fetchingMore,
fetchedAllProducts
}
class DashboardState extends Equatable {
final List<Product> productList;
final int total;
final int page;
final bool hasData;
final DashboardConcreteState state;
final String message;
final bool isLoading;
const DashboardState({
this.productList = const [],
this.isLoading = false,
this.hasData = false,
this.state = DashboardConcreteState.initial,
this.message = '',
this.page = 0,
this.total = 0,
});
const DashboardState.initial({
this.productList = const [],
this.total = 0,
this.page = 0,
this.isLoading = false,
this.hasData = false,
this.state = DashboardConcreteState.initial,
this.message = '',
});
DashboardState copyWith({
List<Product>? productList,
int? total,
int? page,
bool? hasData,
DashboardConcreteState? state,
String? message,
bool? isLoading,
}) {
return DashboardState(
isLoading: isLoading ?? this.isLoading,
productList: productList ?? this.productList,
total: total ?? this.total,
page: page ?? this.page,
hasData: hasData ?? this.hasData,
state: state ?? this.state,
message: message ?? this.message,
);
}
@override
String toString() {
return 'DashboardState(isLoading:$isLoading, productLength: ${productList.length},total:$total page: $page, hasData: $hasData, state: $state, message: $message)';
}
@override
List<Object?> get props => [productList, page, hasData, state, message];
}

View File

@ -0,0 +1,153 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_project/features/dashboard/presentation/providers/dashboard_state_provider.dart';
import 'package:flutter_project/features/dashboard/presentation/providers/state/dashboard_state.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class DashboardScreen extends ConsumerStatefulWidget {
static const String routeName = 'DashboardScreen';
const DashboardScreen({Key? key}) : super(key: key);
@override
ConsumerState<DashboardScreen> createState() => _DashboardScreenState();
}
class _DashboardScreenState extends ConsumerState<DashboardScreen> {
final scrollController = ScrollController();
final TextEditingController searchController = TextEditingController();
bool isSearchActive = false;
Timer? _debounce;
@override
void initState() {
super.initState();
scrollController.addListener(scrollControllerListener);
}
@override
void dispose() {
_debounce?.cancel();
super.dispose();
}
void scrollControllerListener() {
if (scrollController.position.maxScrollExtent == scrollController.offset) {
final notifier = ref.read(dashboardNotifierProvider.notifier);
if (isSearchActive) {
notifier.searchProducts(searchController.text);
} else {
notifier.fetchProducts();
}
}
}
void refreshScrollControllerListener() {
scrollController.removeListener(scrollControllerListener);
scrollController.addListener(scrollControllerListener);
}
@override
Widget build(BuildContext context) {
final state = ref.watch(dashboardNotifierProvider);
ref.listen(
dashboardNotifierProvider.select((value) => value),
((DashboardState? previous, DashboardState next) {
//show Snackbar on failure
if (next.state == DashboardConcreteState.fetchedAllProducts) {
if (next.message.isNotEmpty) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(next.message.toString())));
}
}
}),
);
return Scaffold(
appBar: AppBar(
title: isSearchActive
? TextField(
decoration: const InputDecoration(
hintText: 'Search here',
),
controller: searchController,
onChanged: _onSearchChanged,
)
: const Text('Dashboard'),
actions: [
IconButton(
onPressed: () {
searchController.clear();
setState(() {
isSearchActive = !isSearchActive;
});
ref.read(dashboardNotifierProvider.notifier).resetState();
if (!isSearchActive) {
ref.read(dashboardNotifierProvider.notifier).fetchProducts();
}
refreshScrollControllerListener();
},
icon: Icon(
isSearchActive ? Icons.clear : Icons.search,
),
),
],
),
body: state.state == DashboardConcreteState.loading
? const Center(child: CircularProgressIndicator())
: state.hasData
? Column(
children: [
Expanded(
child: Scrollbar(
controller: scrollController,
child: ListView.separated(
separatorBuilder: (_, __) => const Divider(),
controller: scrollController,
itemCount: state.productList.length,
itemBuilder: (context, index) {
final product = state.productList[index];
return ListTile(
leading: CircleAvatar(backgroundImage: NetworkImage(product.thumbnail)),
title: Text(product.title),
trailing: Text('\$${product.price}'),
subtitle: Text(
product.description,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
);
},
),
),
),
if (state.state == DashboardConcreteState.fetchingMore)
const Padding(
padding: EdgeInsets.only(bottom: 16.0),
child: CircularProgressIndicator(),
),
],
)
: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 22.0),
child: Text(
state.message,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w600,
),
),
),
),
);
}
_onSearchChanged(String query) {
if (_debounce?.isActive ?? false) _debounce?.cancel();
_debounce = Timer(const Duration(milliseconds: 500), () {
ref.read(dashboardNotifierProvider.notifier).searchProducts(query);
});
}
}

View File

View File

View File

@ -0,0 +1,7 @@
import 'package:flutter_project/services/user_cache_service/domain/providers/user_cache_provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final userLoginCheckProvider = FutureProvider((ref) async {
final repo = ref.watch(userLocalRepositoryProvider);
return await repo.hasUser();
});

View File

@ -0,0 +1,49 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_project/features/splash/presentation/providers/splash_provider.dart';
import 'package:flutter_project/routes/app_route.gr.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class SplashScreen extends ConsumerStatefulWidget {
static const String routeName = '/splashScreen';
const SplashScreen({Key? key}) : super(key: key);
@override
ConsumerState<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends ConsumerState<SplashScreen> {
final AppRouter appRouter = AppRouter();
@override
void initState() {
super.initState();
Future.delayed(const Duration(seconds: 2), () async {
final isUserLoggedIn = await ref.read(userLoginCheckProvider.future);
final route = isUserLoggedIn
? const DashboardScreen()
: LoginScreen() as PageRouteInfo;
// ignore: use_build_context_synchronously
AutoRouter.of(context).pushAndPopUntil(
route,
predicate: (_) => false,
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blue.shade700,
body: const Center(
child: Text(
'Splash Screen',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 18.0,
),
),
),
);
}
}

25
lib/main.dart Normal file
View File

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_project/main/app.dart';
import 'package:flutter_project/main/app_env.dart';
import 'package:flutter_project/main/observers.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() => mainCommon(AppEnvironment.PROD);
Future<void> mainCommon(AppEnvironment environment) async {
WidgetsFlutterBinding.ensureInitialized();
EnvInfo.initialize(environment);
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle.light.copyWith(
statusBarColor: Colors.black,
statusBarBrightness: Brightness.light,
),
);
runApp(ProviderScope(
observers: [
Observers(),
],
child: MyApp(),
));
}

28
lib/main/app.dart Normal file
View File

@ -0,0 +1,28 @@
import 'package:dartz/dartz.dart';
import 'package:flutter/material.dart';
import 'package:flutter_project/routes/app_route.gr.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final initializationProvider = FutureProvider<Unit>(
(ref) async {
// final authNotifier = ref.read(authNotifierProvider.notifier);
// await authNotifier.checkIfAuthenticated();
return unit;
},
);
class MyApp extends ConsumerWidget {
MyApp({super.key});
final appRouter = AppRouter();
@override
Widget build(BuildContext context, WidgetRef ref) {
return MaterialApp.router(
title: 'Flutter TDD',
routeInformationParser: appRouter.defaultRouteParser(),
routerDelegate: appRouter.delegate(),
debugShowCheckedModeBanner: false,
);
}
}

Some files were not shown because too many files have changed in this diff Show More